生命周期
service的生命周期相对activity来说比较简单,一个servcie的生命周期从创建到销毁有两条路径:
- started servcie
当其他的组件调用startService()时候service被创建,之后这个service一直运行直到它自己调用stopSerlf()或者其他的组件调用stopService() - bound servcie
当前他组件调用bindServcie的时候service被创建,client可以IBinder接口和service通信,client也可以通过调用unbindService()来关闭连接,多个client可以绑定到同一个service,只有当所有的clint都解绑service之后,系统才会销毁service。这种情况下service不需要stop它自己。 - 这两种路径并不是完全独立的,你可以绑定一个已经started的service,例如你可以通过调用startService()来启动一个后台service播放音乐。然后你可以通过调用bindService()来使activity绑定这个service,用户就可以控制播放器的播放以及获得当前音乐相关的信息。这种情况下stopService()和stopSelf()不能真正销毁这个service,除非所有的clinets接触绑定。
如需了解Bound Service的详细信息,请参阅 Bound Service详解
基本知识点细节
- 同一个Service,onCreate()和onDestroy()只会走一遍。
- 每次调用onStartService()方法,都会回调onStartCommand(Intent intent, int flags, int startId)方法。
- bindService()方法的回调onServiceConnected()是异步的。
- 只有第一次调用bindService()方法会回调onBind(Intent intent)的方法。
- 同一个Activity实例多次重复调用bindService()方法,只会创建一次连接(只会bind一次),也就是只有第一次会回调onServiceConnected()方法。
- 如果某个Activity已经bindService了,必须在Activity.onDestory()生命周期或之前unbindService,否则抛出以下异常:
${ActivityName} has leaked ServiceConnection ${ServiceConnectionName} that was originally bound here
- 只有所有client都调用了unbindService才会走onBind()生命周期回调,如果只是一个bound service,此时才会走onDestroy生命周期。
- 如果一个service即使start service又是bound service,只有所有的client都解绑了,在调用stopService或者stopSelf才会走onDestroy生命周期。
- 如果Service实现onUnbind返回true,且一个started service 第一次bind之后再unbind,第二次bind时不会走onBind生命周期,而是走onRebind()的生命周期。