Service的使用 Mon, Mar 28, 2022 startService的生命周期 onCreate onStartCommant onDestroy 1
2
3
4
5
6
7
8
9
10
11
12
13
fun start ( v : View ) {
Intent ( this , MyService :: class . java ). run {
startService ( this )
}
}
fun stop ( v : View ) {
Intent ( this , MyService :: class . java ). run {
stopService ( this )
}
// or 在service中调用stopSelf()
}
这种方式创建Service,可以多次调用startService
,并且onStartCommant
方法也会随之回调,但是onCreate
只会回调一次。
可以通过Intent向service传递信息。
当不需要service不需要继续运行时,需要手动关闭。
bindService的生命周期 onCreate onBind onDestroy Activity代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private lateinit var service : MyService
/**
* 自定义一个连接,用来获取service对象
*/
private val conn = object : ServiceConnection {
override fun onServiceConnected ( name : ComponentName ?, binder : IBinder ) {
// 获取service
val myBinder = ( binder as MyService . MyBinder )
//调用业务方法
myBinder . startDownload . invoke ()
}
override fun onServiceDisconnected ( name : ComponentName ?) {
// 当Service未正常退出,而是因为其他原因退出时回调
}
}
fun bind ( v : View ) {
Intent ( this , MyService :: class . java ). run {
bindService ( this , conn , BIND_AUTO_CREATE )
}
}
fun unbind ( v : View ) {
Intent ( this , MyService :: class . java ). run {
unbindService ( conn )
}
}
Service代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class MyService : Service () {
/**
* 预置一个自定义的binder
**/
private val mBinder = MyBinder {
startDownload ()
}
override fun onCreate () {
Log . d ( TAG , "onCreate: " )
super . onCreate ()
}
override fun onStartCommand ( intent : Intent ?, flags : Int , startId : Int ): Int {
Log . d ( TAG , "onStartCommand: " )
return super . onStartCommand ( intent , flags , startId )
}
override fun onBind ( intent : Intent ): IBinder {
// 返回自定义的binder
return mBinder
}
override fun onDestroy () {
Log . d ( TAG , "onDestroy: " )
super . onDestroy ()
}
/**
* Activity可以直接通过service对象调用业务方法
*/
private fun startDownload () {
//处理下载任务,完成后通知Activity刷新UI
mBinder . callback ?. refreshUI ()
}
/**
* 自定义一个Binder内部类
* 通过传递函数参数,实现Activity直接通过binder调用service的内部方法
*/
inner class MyBinder ( val startDownload : () -> Unit ) : Binder () {
var callback : MyBinderCallback ? = null
}
}
interface MyBinderCallback {
fun refreshUI ()
}
通过bindService
方法绑定service,可以使用BIND_AUTO_CREATE
这个flag自动创建service,也可以直接绑定到startService
方法创建的service之上。 当不再需要service继续执行时(例如Activity退出前),必须调用unbindService
进行解绑,否则会报错。 当多个页面都绑定到同一个service,单个页面的解绑不会影响service。 当没有页面继续绑定时,service会自动销毁。 当通过startService
创建了service,并且有其他activity又通过bindService
绑定到了service,那么只有unbindService
和stopService
都调用之后,才会销毁service。