1. service生命周期(两种启动方式生命周期不一样)
StartService
onCreate() -> onStartCommand() -> onDestroy()
创建服务 -> 服务开始运行 -> 服务被停止
Bound Service
onCreate() -> onBind() -> onUnbind() -> onDestroy()
创建服务 -> 绑定服务 -> 取消绑定 -> 服务被停止
2. 两种启动方式(StartService BindService)
1> 通过调用startService启动, 如果Service还没有运行,则先调用onCreate()然后调用onStartCommand();如果Service已经运行,就只调用onStartCommand(),所以一个Service的onStartCommand方法可能会重复调用多次;通过调用stopService()会触发执行Service生命周期中的onDestroy()回调方法,会让服务停止;stopService()的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService()的话,Service会一直在后台运行。该Service的调用者再启动该Service后可以通过stopService关闭Service;stopSelf()
所以StartService的生命周期为:onCreate –> onStartCommand(可多次调用) –> onDestroy。
2> 通过bindService()启动,会执行Service生命周期中的onCreate()、onBind()回调方法,此时服务开始运行;onBind将返回给客户端一个IBind接口实例,IBind允许回调服务的方法,比如得到Service运行的状态或其他操作。如果绑定Service的Activity退出, Service也会关闭
所以BindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。
3. IntentService
Service中编写耗时操作会引起ANR, 所以就需要引入IntentService,IntentService是继承Service的,它包含了Service的全部特性.那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去执行你的耗时操作。
IntentService在执行onCreate的方法的时候,其实开了一个线程HandlerThread,并获得了当前线程队列管理的looper,在onStart的时候,把消息置入了消息队列,在消息被handler接受并且回调的时候,执行了onHandlerIntent方法,该方法的实现是子类去做的。
由此得出:
IntentService是通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。