Some Notes

Service 的两种启动方式

Service 有两种启动方式,startService 或者 bindService,根据使用场景,如果我们需要与 Service 进行通信,则使用bindService 的方式通过 ServiceConnection 来获取 IBinder,如果我们不需要与 Service 进行通信,可以直接使用 startService 的方式来启动 Service。

startService

ContextWrapper.startService() 开启服务,触发 Service 的 onCreate()、onStartCommand() 方法。

Service开启后,再多次调用startService(),不会执行onCreate()方法,只会多次执行onStartCommand()方法。

需要关闭 Service 时,使用 ContextWrapper 的stopService(),或 Service 内部使用 stopSelf() 方法。

bindService

ContextWrapper.bindService() 绑定服务,并传入 ServiceConnection 接口,触发 Service 的 onCreate() 方法后,接口中onServiceConnected 方法被触发,并且参数中接受实现了 IBinder 接口的对象,可用此对象来控制 Service 执行哪些方法(需要在 Service 中实现 onBind() 抽象方法来返回 IBinder)。

多次bindService(),不会发生任何事情,但Service已经通过unbind(),并onDestory()后,再次执行unbindService(),会抛出 java.lang.IllegalArgumentException: Service not registered

需要关闭 Service 时,使用 ContextWrapper.unbindService() 方法,解绑 Service,Service 执行 onUnbind(), onDestory() 方法。

混合使用

startService() 与 bindService(),无论首先使用哪个方法,需要关闭 Service 时,必须 stopService 和 unbindService() 都调用过才能停止服务。

单独 stopService() 或 unbindService() 都不会使 Service 停止,但 unbindService() 会触发onUnbind()方法。