一、Service的两种启动方式
startService和BindService,两者的启动Service的生命周期如下所示:
两种方式区别有前者Service生命周期不跟谁Activity,后者生命周期跟随Activity,一旦Activity被销毁,绑定的Service也就被销毁了。第二,两者的回调函数也有区别,如上图,停止服务前者的回调是直接onDestroy(),后者的回调是onUnbind()->onDestroy()
Service不同于线程的地方在于,通过Service可以与Activity进行通信,onBind返回对应的Binder对象,Binder对象可以获取到Service实例,Activity获取到Service实例之后就可以访问Service内部方法进行通信。
二、这是 Service 的子类,它使用工作线程逐一处理所有启动请求。如果您不要求服务同时处理多个请求,这是最好的选择。 您只需实现 onHandleIntent() 方法即可,该方法会接收每个启动请求的 Intent,使您能够执行后台工作。
特点:
1、IntentService会创建单独的Worker线程处理所有的Intent请求;
2、IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此无需处理多线程问题;
3、所有请求处理完成后,IntentService自动停止。无需调用stopSelf()方法停止该Service;
4、service的onBind()方法提供了默认实现,返回null;
5、service的onStartCommand()方法提供了默认实现,该实现会将请求Intent添加到队列中。
使用方法:扩展IntentService重写onHandlerIntent()方法。
三、为什么要使用Service
其实这跟 android 的系统机制有关,我们先拿Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。