Service详解

Service详解_第1张图片
Service组件详解.png

生命周期

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接触绑定。
Service详解_第2张图片
service_lifecycle.png

如需了解Bound Service的详细信息,请参阅 Bound Service详解

基本知识点细节

  1. 同一个Service,onCreate()和onDestroy()只会走一遍。
  2. 每次调用onStartService()方法,都会回调onStartCommand(Intent intent, int flags, int startId)方法。
  3. bindService()方法的回调onServiceConnected()是异步的。
  4. 只有第一次调用bindService()方法会回调onBind(Intent intent)的方法。
  5. 同一个Activity实例多次重复调用bindService()方法,只会创建一次连接(只会bind一次),也就是只有第一次会回调onServiceConnected()方法。
  6. 如果某个Activity已经bindService了,必须在Activity.onDestory()生命周期或之前unbindService,否则抛出以下异常:
${ActivityName} has leaked ServiceConnection ${ServiceConnectionName} that was originally bound here
  1. 只有所有client都调用了unbindService才会走onBind()生命周期回调,如果只是一个bound service,此时才会走onDestroy生命周期。
  2. 如果一个service即使start service又是bound service,只有所有的client都解绑了,在调用stopService或者stopSelf才会走onDestroy生命周期。
  3. 如果Service实现onUnbind返回true,且一个started service 第一次bind之后再unbind,第二次bind时不会走onBind生命周期,而是走onRebind()的生命周期。

你可能感兴趣的:(Service详解)