Service 仅仅是提供了一种不启动前台界面、让你在后台执行一些运算的途径。但它并不是开启了一条线程,Service还是运行在UI线程中的,要执行耗时操作时需要新开启子线程。
Service 简介
- 四大组件之一
- 用于在后台处理耗时操作
- 不受Activity生命周期的影响
Service和Activity非常相似,但是它是没有界面的。他们可以共同实现的功能有:
- 开辟线程
- 访问网络
- 操作数据库
Service 生命周期
- onCreate()
- onStartCommand()
- onBind()
- onUnbind()
- onDestroy()
class MyService : Service() {
var process = 0
private set
//创建
override fun onCreate() {
super.onCreate()
Log.e("TAG", "创建")
//模拟耗时任务
object : Thread() {
override fun run() {
super.run()
try {
process = 0
while (process < 100) {
sleep(1000)
process++
}
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}.start()
}
//启动
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
Log.e("TAG", "启动")
return super.onStartCommand(intent, flags, startId)
}
//绑定
//IBinder:在Android中用于远程操作对象的一个基本接口
override fun onBind(intent: Intent): IBinder? {
Log.e("TAG", "绑定")
return MyBinder()
}
internal inner class MyBinder : Binder(){
fun getProcess():Int{
return process
}
}
//解绑
override fun onUnbind(intent: Intent): Boolean {
Log.e("TAG", "解绑")
return super.onUnbind(intent)
}
//销毁
override fun onDestroy() {
super.onDestroy()
Log.e("TAG", "销毁")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
//ServiceConnection 用于绑定客户端和Service
private val conn: ServiceConnection = object : ServiceConnection {
//当客户端正常连接服务时,执行服务的绑定操作会被调用
override fun onServiceConnected(name: ComponentName, service: IBinder) {
Log.e("TAG", "ServiceConnection")
val mb = service as MyService.MyBinder
val cur = mb.getProcess().toString()
Log.e("TAG", "Current: $cur")
}
//当客户端和服务的连接丢失了
override fun onServiceDisconnected(name: ComponentName) {}
}
fun operate(view: View) {
when (view.id) {
R.id.start -> {
val t1 = Intent(this, MyService::class.java)
//onCreate() -> onStartCommand()
//如果多次启动,只会创建一次,启动多次
startService(t1)
}
R.id.stop -> {
val t2 = Intent(this, MyService::class.java)
//onDestroy()
stopService(t2)
}
R.id.bind -> {
//绑定服务:最大的作用就是用来实现对Service执行的任务进行进度监控
//实现Service和访问者之间的方法调用以及交换数据
//如果服务不存在:onCreate() -> onBind() -> onUnbind() -> onDestroy()
//此时服务没有在后台运行,并且它会随着Activity的摧毁而解绑并且销毁
//如果服务存在:bindService方法只能调用onBind(),unbindService只能调用onUnbind()
val it3 = Intent(this, MyService::class.java)
//BIND_AUTO_CREATE 如果服务不存在,就创建一个新的服务
//bindService()中的参数依次是Intent,ServiceConnection和绑定时自动创建服务的标记位;
bindService(it3, conn, BIND_AUTO_CREATE)
}
R.id.unbind -> unbindService(conn)
}
}
}