Service生命周期
Service有两种启动方式:
l Context.startService(),当它第一次被调用时,Service被创建执行onCreate()方法,随后即调用onStartCommand()方法。如果是以这种方式启动,那么它会一直运行,不论是否有调用者绑定,直到Context.stopService()被调用,或者stopSelf()被调用,Service结束。
l Context.bindService(),当被绑定的Service没有运行时,会调用onCreate()方法,但是不会调用onStartCommand()方法。此时,Service的onBind()方法会返回IBinder对象,以便调用者调用Service。如果是以方式2启动,Service将“计数运行”,即要求至少有一个调用者绑定到Service上,如果全部unBindService(),则Service结束。
几个需要注意的地方
1) Service 无论以何种方式创建,都是在应用的主线程里创建的,也就是说创建一个 Service 并不意味着生成了一个新的线程, Service 的创建过程是阻塞式的,因此也需要考虑性能,不能影响界面和逻辑上的后续操作。
2)如果 Service 自己没有生成新的线程,那它也是运行在应用的主线程里的,因此 Service 本身并不能提高应用的响应速度和其他的性能,而是说通过这个后台服务生成新的线程来处理比较耗时的操作如大数据的读取等来提高响应, Service 自己并不能保证这一点。 Service 相当于提供了一个这些费时操作的平台,由它在后台创建新线程完成这些任务,以及视各种情况管理这些线程,包括销毁。
3) stopService 和 unbindService 都可以把 Service 停掉,但是如果希望明确立刻停掉 Service ,则使用 stopService 更安全,因为 unbindService 实质上是将与 Service 的连接数减1,当减为 0 的时候才会销毁该服务实例, stopService 的效果相当于将连接数立即减为 0 ,从而关闭该服务,所以在选择关闭方式上要视不同情况而定。