Service 生命周期

onCreate:创建服务。首次才会调用,重复启动不会被多次调用

onStartCommand:服务启动,Android 2.0 以上。通过 startService() 方式启动时调用,启动后无限期运行,可通过 stopService()stopSelf() 停止服务

onStart:服务启动,Android 2.0 以下使用此方法

onBind:服务绑定。通过 bindService() 方式启动时调用。与客户端通信时需实现 IBinder 接口

onUnbind:解除绑定

onRebind:解绑或断开连接后再次绑定

onDestroy:服务即将被回收

Android service详解 android service onbind_声明周期


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() 方法手动设置返回 flageSTART_STICKY,可保证服务被kill后自动重建
  • 监听系统事件广播:如屏幕点亮、重启等频繁可见事件。先在AndroidManifest.xml中注册广播,并申请相关权限,然后在广播监听回调里判断服务状态,若停止则启动
  • 当 Service 的声明周期方法onDestroy被调用时,发送一个广播通知,在广播回调中重启 Service
  • 向 AndroidManifest.xml 中 Application 标签 添加 android:persistent="true",设置进程保活

Service 中如何处理耗时操作

Service 与 Activity一样运行在UI线程,故不允许耗时操作。若需处理耗时情况,可通过IntentService+HandlerThread 单独开个线程实现,当任务执行完毕后自动停止。若需要定时启动,可搭配 Handler.postDelayed(this, 1000) 来完成实现


本篇将持续更新 Service 相关知识,一起查漏补缺学个痛快!