一、概念
IntentService是一种特殊的Service,它继承了Service并且是一个抽象类,因此必须创建它的子类才能使用IntentService。IntentService可用于执行后台耗时的任务,当任务执行后它会自动停止,同时由于IntentService是服务的原因,这导致它的优先级比单纯的线程要高很多,所以IntentService比较适合执行一些高优先级的后台任务,因为它优先级高不容易被系统杀死。在实现上,IntentService封装了HandlerThread和Handler。
二、工作过程
当IntentService被第一次启动时,它的onCreate方法会被调用,onCreate方法会创建一个HandlerThread,然后使用它的Looper来构造一个Handler对象mServiceHandler,这样通过mServiceHandler发送的消息最终都会在HandlerThread中执行,因此IntentService可以用于执行后台任务。
每次启动IntentService,它的onStartCommand方法就会被调用一次,onStartCommand调用了onStart方法,在onStart中通过mServiceHandler发送了一个消息,这个消息会在HandlerThread中被处理。mServiceHandler收到消息后,会将Intent对象传递给onHandleIntent方法去处理。这个Intent对象的内容和外界的startService(intent)中的Intent的内容是完全一致的。通过这个Intent对象即可解析出外界启动IntentService时所传递的参数,通过这些参数就可以区分具体的后台任务,这样在onHandleIntent方法中就可以对不同的后台任务做处理了。当有多个后台任务同时存在时,这些后台任务会按照外界发起的顺序排队执行。
当onHandleIntent方法执行结束后,IntentService会通过stopSelf(int startId)方法来尝试停止服务。
stopSelf()与stopSelf(int startId)的区别:stopSelf()会立刻停止服务,stopSelf(int startId)则会等待所有的消息都处理完毕后才终止服务。一般来说,stopSelf(int startId)在尝试停止服务之前会判断最近启动服务的次数是否和startId相等,如果相等就立刻停止服务,不相等则不停止服务。
public class TestIntentService extends IntentService {
public TestIntentService() {
super("TestIntentService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.d("TestIntentService", "zwm, onHandleIntent");
}
}