Service 生命周期
注意:onStart方法是在Android2.0之前的平台使用的.在2.0及其之后,则需重写onStartCommand方法,
同时,旧的onStart方法则不会再被调用.
1) 可以通过调用 Context.startService() 启动一个 Service ,这可能会触发 Service 的 onCreate() 和 onStart() 操作,具体来说即执行 startService() 一定会触发 onStart() ,但如果该 Service 已经在系统中存在,则 onCreate() 不会被再次调用,它只在 Service 第一次启动时触发。
通过 Context.startService() 启动的 Service 会一直运行,直到通过 Context.stopService() 或者 stopSelf() 停止它。多次通过 startService() 启动某个服务并不会生成多个实例,但会导致服务的 onStart() 被多次调用,当然由于只有一个实例,因此无论启动多少次,停止它只需调用一次 Context.stopService() 或 stopSelf() 就可以了。
2) 也可以通过 Context.bindService() 来获得一个服务的链接,这个链接是一直会保持到通过 Context.unbindService() 断掉它。如果在连接时系统中还没有该服务,则可能会新创建一个服务,这时 Service 的 onCreate 函数也同样会被调用。连接建立时会 Service 的 onBinder 会被触发,通过 onBinder 可以返回连接建立后的 IBinder 接口对象,使用服务的客户端(比如某个Activity )可以通过 IBinder 对象和 Service 交互。
一个 Service 如果是通过 bindService() 启动的,那么它会一直存在到没有任何客户端与它保持连接为止,原因是可能有很多客户端与这个服务保持连接,这时如果某个链接被客户端主动断掉只会是 Service 的链接数减 1 ,当减至 0 的时候这个 Service 就会被销毁。
3) 一个 Service 既可以被启动 (start) 也可以被连接 (bind) ,这时 Service 的生命周期取决于它被创建的方式,如果是通过 Context.startService() 创建的则和第一种情况一样,如果是通过Context.bindService() 使用参数 Context.BIND_AUTO_CREATE 创建的,则情况和第二种一样。
当然,在 Service 停止,被销毁时,会触发其 onDestroy() 函数,我们需要在这里完成这个 Service 相关资源的清理,比如停止其子线程,注销监听器等等。
如下是 Service 的生命周期时序图:
3. 几个需要注意的地方
1) Service 无论以何种方式创建,都是在应用的主线程里创建的,也就是说创建一个 Service 并不意味着生成了一个新的线程, Service 的创建过程是阻塞式的,因此也需要考虑性能,不能影响界面和逻辑上的后续操作。
2) 如果 Service 自己没有生成新的线程,那它也是运行在应用的主线程里的,因此 Service 本身并不能提高应用的响应速度和其他的性能,而是说通过这个后台服务生成新的线程来处理比较耗时的操作如大数据的读取等来提高响应, Service 自己并不能保证这一点。 Service 相当于提供了一个这些费时操作的平台,由它在后台创建新线程完成这些任务,以及视各种情况管理这些线程,包括销毁。
3) stopService 和 unbindService 都可以把 Service 停掉,但是如果希望明确立刻停掉 Service ,则使用 stopService 更安全,因为 unbindService 实质上是将与 Service 的连接数减一,当减为 0的时候才会销毁该服务实例, stopService 的效果相当于将连接数立即减为 0 ,从而关闭该服务,所以在选择关闭方式上要视不同情况而定。