一、什么是Service?
根据官网文档的描述可以得知,service是android系统的一个应用组件,启动之后一直默默的长时间的运行在后台,不像activty那样可以跟用户交互,就算我们退出应用了,service仍然可以在后台执行。因此可以利用service的这个特性帮我们解决很多问题,想熟练使用service就得先了解它的生命周期。
二、service生命周期
service可以通过两种方式创建:startService()和bindService().
startService():一般用于在后台上传文件或者下载文件等,不跟其他组件通信,就算启动它的应用被销毁了,它仍然会欢快的在后台执行,直到完成任务的时候自刎(自己调用stopSelf())或者被其他人下黑手(调用stopService()).
bindService():允许其他组件跟它进行通信,允许多个客户端绑定到同一个service上,当所有的客户端都解除绑定后,该service就销毁了。
service的生命周期主要是跟这4个回调函数相关,onCreate()、onStartCommend()、onBind()、onDestory(),首先看看下面这张图,然后结合下面的demo,就很容易理解了。
(1)startService
onCreate()方法在service第一次创建的时候会调用,如果该service已经运行了则不会执行该函数。
onStartCommand()方法是在其他组件通过调用startService()启动服务时才会执行。每次启动service时,onStartCommand()都会被执行。你多点几次启动服务按钮,会看到每次都会执行onStartCommand()。
(2) bindService
Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。
所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。
(3)即(1)又(2)
需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢?一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少 次的startService又bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。
如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能先UnbindService, 再StopService。
如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。
如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。多次调用unbindService的话会出异常。