Service 生命周期
onCreate
:创建服务。首次才会调用,重复启动不会被多次调用
onStartCommand
:服务启动,Android 2.0 以上。通过 startService()
方式启动时调用,启动后无限期运行,可通过 stopService()
或 stopSelf()
停止服务
onStart
:服务启动,Android 2.0 以下使用此方法
onBind
:服务绑定。通过 bindService()
方式启动时调用。与客户端通信时需实现 IBinder 接口
onUnbind
:解除绑定
onRebind
:解绑或断开连接后再次绑定
onDestroy
:服务即将被回收
Service 启动声明周期方法调用
普通启动
onCreate
onStart
runing···
onDestroy
绑定启动
onCreate
onBind
onUnbind
onRebind
onDestroy
Service 的两种启动方式及其区别
startService():首先创建一个类并继承Service,然后需要在AndroidManifest.xml声明此服务的路径,最后通过startService(Intent)
/ stopService(Intent)
启动或停止服务。当此服务已被启动,再次启动时不会重新创建(onCreate),只会调用onStart()
bindService():同样需要新建一个类它要继承Service并在AndroidManifest.xml声明服务,但是启动或停止服务时要通过 bindService()
/ onbindService()
。servicer可以被多个Activity绑定,通过实现IBinder接口获取Service实例,之后通过此实例对象就可以方便的实现数据交互
区别:
- bindService方式获取IBinder可以实现跨进程交互,startService方式无法实现
- 通过startService方式启动的服务若不stopService则无限期执行(或系统资源紧张被kill),而bindService方式下当绑定Service的组件被销毁时,将自动解除与此服务的绑定,当这个服务没有被任何组件绑定时,将自动销毁。当然了,解绑同样可以通过unbindService方法
Service 保活方案
- 在 AndroidManifest.xml 中注册服务时设置较高的优先级。android:priority = “1000” (1000最高)
- 用 startService() 方式启动服务(bindService()方式下,当此服务没有被任何组件绑定会自动停止)
- 给 onStartCommand() 方法手动设置返回
flage
为START_STICKY
,可保证服务被kill后自动重建 - 监听系统事件广播:如屏幕点亮、重启等频繁可见事件。先在AndroidManifest.xml中注册广播,并申请相关权限,然后在广播监听回调里判断服务状态,若停止则启动
- 当 Service 的声明周期方法onDestroy被调用时,发送一个广播通知,在广播回调中重启 Service
- 向 AndroidManifest.xml 中 Application 标签 添加
android:persistent="true"
,设置进程保活
Service 中如何处理耗时操作
Service 与 Activity一样运行在UI线程,故不允许耗时操作。若需处理耗时情况,可通过IntentService
+HandlerThread
单独开个线程实现,当任务执行完毕后自动停止。若需要定时启动,可搭配 Handler.postDelayed(this, 1000)
来完成实现
本篇将持续更新 Service 相关知识,一起查漏补缺学个痛快!