Service介绍
Service 是 Android 四大组件之一,常用来运行在后台进行耗时操作。其它的应用程序组件可以启动一个Service,即使在用户切换到另外一个应用程序后,这个Service还是一直会在后台运行。此外,一个应用程序也可以绑定到一个Service然后使用进程间通信(IPC)方式与Service之间发生交互。例如一个Service可以处理网络事物,播放音乐,读写文件或者读写ContentProvider,所以这些都在后台运行。
Service 的生命周期
说起 Service 的生命周期,就必须提起它的两种启动方式:
- Context.startService(intent);
这种情况下的生命周期:
onCreate()–>onStartCommand() 其实 onStartCommand 内部调用了 onstart,当我们首次使用startService启动一个服务时,系统会实例化一个Service实例,依次调用其onCreate和onStartCommand方法,然后进入运行状态,此后,如果再使用startService启动服务时,不再创建新的服务对象,系统会自动找到刚才创建的Service实例,调用其onStart方法;如果我们想要停掉一个服务,可使用stopService方法,此时onDestroy方法会被调用,需要注意的是,不管前面使用了多个次startService,只需一次stopService,即可停掉服务。
- Context.bindService(intent);
在这种模式下,当调用者首次使用bindService绑定一个服务时,系统会实例化一个Service实例,onCreate–>onStartCommand –>onStart–>onBind–>onServiceConnected. 如果此时再次绑定:onStartCommand –>onStart。解绑会调用:onUnbind。解绑之后再次绑定:onStartCommand –>onStart–>onServiceConnected:就是说 oncreate、onBind、onUnBind都只会调用一次,同时onBind必须返回一个实现了IBinder接口类型的实例。
- 区别
startService模式下调用者与服务无必然联系,即使调用者结束了自己的生命周期,只要没有使用stopService方法停止这个服务,服务仍会运行;通常情况下,bindService模式下服务是与调用者生死与共的,在绑定结束之后,一旦调用者被销毁,服务也就立即终止。
- 如果没有解绑就销毁组件,会报出异常。
- 解绑之后服务依然存在的。
- 如果解绑之后重新绑定 会调用onServiceConnected,如果没有解绑,一直重复绑定,只会调用onStartCommand –>onStart
- 如果在没有解绑的情况下stopService,不会调用后ondestroy
- 如果Service已经停止,再解绑,会调用onUNBind–>onDestroy
图解: