从这个文章开始,我就使用kotlin来进行编写,锻炼下自己对kotlin的熟悉程度,好啦,开始正文:
Service作为android在应用层的四大组件之一,我们也需要对他有一定的了解,我们都知道activity在销毁的时候,就完全停止运行了,但是Service可以继续在后台进行运作,所以耗时的操作基本都可以让Service去解决
而Service的生命周期与Activity的生命周期也有所不同,分为5个阶段:
//创建服务
override fun onCreate() {
super.onCreate()
}
//启动服务
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return super.onStartCommand(intent, flags, startId)
}
//绑定服务
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
//解绑服务
override fun onUnbind(intent: Intent?): Boolean {
return super.onUnbind(intent)
}
//销毁服务
override fun onDestroy() {
super.onDestroy()
}
然后有意思的一点来了
Service在启动服务的时候,会进行判断,目前服务是否存在,如不存在,则按照下面顺序进行:
onCreate() -- onStartCommand()
如果存在时候,不管你启动多少次,都知会调用一个方法:
onStartCommand()
在我们主动销毁服务的时候,就会调用onDestroy()
所以一般正常顺序是:
onCreate() -- onStartCommand()--onDestroy()
那绑定和解绑去哪里呢?
这个就要根据情况进行判断了:
①未启动服务的绑定情况:
onCreate()-- onBind(intent: Intent)
②未启动服务的解绑情况:
onUnbind(intent: Intent?)--onDestroy()
③在启动服务的绑定情况:
onCreate()--onStartCommand()-- onBind(intent: Intent)
④在启动服务的解绑情况:
onUnbind(intent: Intent?)
发现了没?在启动服务的情况下,解绑并不会回调onDestroy() ,除非是主动调用,这就很有意思了吧
后面就说下怎么使用吧:
在Service启动后,怎么样告诉前端发生了什么变化呢?
在我们绑定服务的时候,使用了一个类叫ServiceConnection
private val con = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.e("TAG","66666")
val mb=service as MyService.MyBind
var step=mb.getProcess()
Log.e("TAG","当前进度是:$step")
}
override fun onServiceDisconnected(name: ComponentName?) {
TODO("Not yet implemented")
}
}
onServiceConnected是链接成功时所调用的,而onServiceDisconnected是链接失败时所调用的
其中注意IBinder这个类,在我们MyService调用onBind的方法的时候,返回的也是IBinder这个类,然后点开这个类之后,就会发现,里面有一堆方法需要时候,但是我们在实际开发的时候,只想调用自己所使用到的类去进行开发,这个时候,就可以看下Binder这个类了,进去看下Binder类的时候,就会发现,他已经实现了所有IBinder类中需要实现的方法。
所以,我们可以自己定义一个类去继承Binder类,然后通过返回Binder类去告知前端怎么操作,例子如下:
private var i = 0
override fun onCreate() {
Log.e("TAG", "onCreate")
//开启一个线程(从1数到100),用于模拟耗时的任务
object : Thread() {
override fun run() {
super.run()
try {
i = 1
while (i <= 100) {
sleep(100)
i++
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}.start()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.e("TAG", "onStartCommand")
return super.onStartCommand(intent, flags, startId)
}
override fun onBind(intent: Intent): IBinder {
Log.e("TAG", "onBind")
return MyBind()
}
inner class MyBind :Binder(){
fun getProcess(): Int {
return i
}
}
好啦!!!果然使用kotlin语法去学习新的框架或者组件的时候,会加深对kotlin的理解,这就很棒!!!
网友评论