线程和线程池 -- IntentService

一、概念

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");
    }
}

你可能感兴趣的:(线程和线程池 -- IntentService)