还有论坛的朋友问到过关于service的运行模式问题,接下来我们来看看。
service有2种运行模式:
· 如果没有程序停止它或者它自己停止,service将一直运行。在这种模式下,service开始于调用Context.startService() ,停止于Context.stopService(). service可以通过调用Service.stopSelf() 或 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要少�D�D只有3个�D�D而且是public的而不是protected的
void onCreate()
void onStart(Intent intent)
void onDestroy()
通过实现这3个方法,可以监视service生命周期的2个嵌套循环:
· 整个生命周期 从onCreate() 开始,从onDestroy() 结束,像activity一样, a service 在 onCreate()中执行初始化操作,在 onDestroy()中释放所有用到的资源。如:后台播放音乐的service可能在 onCreate()创建一个播放音乐的线程,在onDestroy()中销毁这个线程。
· 活动生命周期 开始于 onStart(). 这个方法处理传入到startService()方法的intent。 音乐服务会打开intent查看要播放哪首歌曲,并开始播放。
当服务停止的时候,没有方法检测到�D�D没有 onStop() 方法。
onCreate() 和 onDestroy() 用于所有通过Context.startService() or Context.bindService() 启动的service。onStart() 只用于通过startService()开始的service。
如果一个service是可以从外部绑定的,它就可以触发以下的方法:
IBinder onBind(Intent intent)
boolean onUnbind(Intent intent)
void onRebind(Intent intent)
onBind() 回调被传递给调用bindService 的intent, onUnbind() 被unbindService()中的intent处理。如果服务允许被绑定,那么onBind() 方法返回客户端和sercie的沟通通道。如果一个新的客户端连接到服务,onUnbind() 会触发onRebind() 调用。
下面的图表说明了sercice的回调方法。下面的图片将通过 startService 和通过bindService()启动的service分开了,但是要注意不管他们怎么启动的,都有可能被客户端连接,因此都有可能触发到onBind() 和 onUnbind() 方法。