对于Android Service 生命周期进行全解析


  本文标签:Android Service 生命周期

  Android Service 生命周期可以促使移动设备的创新,让用户体验到最优越的移动服务,只有broadcast receivers执行此方法的时候才是激活的,当 onReceive()返回的时候,它就是非激活状态  。

  如果没有程序停止它或者它自己停止,service将一直运行  。在这种模式下,service开始于调用Context.startService() ,停止于Context.stopService(). service可以通过调用Android Service 生命周期() 或 Service.stopSelfResult()停止自己  。不管调用多少次startService() ,只需要调用一次 stopService() 就可以停止service  。

  可以通过接口被外部程序调用  。外部程序建立到service的连接,通过连接来操作service  。建立连接调开始于Context.bindService(), 结束于Context.unbindService(). 多个客户端可以绑定到同一个service,如果service没有启动, bindService() 可以选择启动它  。

  这2种模式不是完全分离的  。你可以可以绑定到一个通过startService()启动的服务  。如一个intent想要播放音乐,通过startService() 方法启动后台播放音乐的service  。然后,也许用户想要操作播放器或者获取当前正在播放的乐曲的信息,一个activity就会通过bindService()建立一个到此service的连接. 这种情况下 stopService() 在全部的连接关闭后才会真正停止service  。

  像activity一样, service也有可以通过监视状态实现的生命周期  。但是比activity要少――只有3个――而且是public的而不是protected的

  1. void onCreate()   
  2. void onStart(Intent intent)   
  3. void onDestroy() 

  通过实现这3个方法,可以监视service生命周期的2个嵌套循环:

  整个生命周期 从onCreate() 开始,从onDestroy() 结束,像activity一样, a Android Service 生命周期在 onCreate()中执行初始化操作,在 onDestroy()中释放所有用到的资源  。如:后台播放音乐的service可能在 onCreate()创建一个播放音乐的线程,在onDestroy()中销毁这个线程  。

  活动生命周期 开始于 onStart(). 这个方法处理传入到startService()方法的intent  。 音乐服务会打开intent查看要播放哪首歌曲,并开始播放  。当服务停止的时候,没有方法检测到――没有 onStop() 方法,onCreate() 和 onDestroy() 用于所有通过Context.startService() or Context.bindService() 启动的service  。onStart() 只用于通过startService()开始的service  。

  如果一个Android Service 生命周期是可以从外部绑定的,它就可以触发以下的方法:

  1. IBinder onBind(Intent intent)   
  2. boolean onUnbind(Intent intent)   
  3. void onRebind(Intent intent) 

  onBind() 回调被传递给调用bindService 的intent, onUnbind() 被unbindService()中的intent处理  。如果服务允许被绑定  。那么onBind() 方法返回客户端和sercie的沟通通道  。如果一个新的客户端连接到服务,onUnbind() 会触发onRebind() 调用  。

  下面的图表说明了sercice的回调方法  。下面的图片将通过 startService 和通过bindService()启动的service分开了,但是要注意不管他们怎么启动的,都有可能被客户端连接,因此都有可能触发到onBind() 和 onUnbind() 方法  。

  当经过receiver 请求,broadcast message到达的时候, Android 调用持有message的intent的 onReceive() 方法,只有broadcast receivers执行此方法的时候才是激活的,当 onReceive()返回的时候,它就是非激活状态

  一个含有激活的broadcast receiver的进程是不会被中止的  。但是只含有非激活组件的进程在它占用的内存被其他程序请求的时候,任何时间都可以被中止  。 当响应broadcast message的程序因为消耗很多时间而在另外一个线程 而非UI所在的线程处理的时候会出现一个问题  。

  当 onReceive() 开启一个线程并返回后,整个程序(包括新建的线程)状态是非激活的(除非此进程中有其他激活的组件), 因此这个进程就有被中止的危险  。解决这个问题的办法是onReceive() 方法启动一个Android Service 生命周期,让sercie去做耗时的工作,这样系统就知道此进程中还有活动的工作  。