异步通信4——IntentService详解

560 阅读2分钟

一、 IntentService是什么

IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制或stopSelf()。另外,可以启动多次IntentSercice多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个。

  • 它本质是一种特殊的Service,继承自Service并且本身就是一个抽象类
  • 它内部通过HandlerThread和Handler实现异步操作

二、 IntentService使用方法

创建IntentService时,只需实现onHandleIntent和构造方法,onHandleIntent为异步方法,可以执行耗时操作。

三、 IntentService源码解析

它本质上就是一个封装了HandlerThread和handler的异步框架

  1. 在onCreate方法中会创建一个HandlerThread、Looper、又创建来一个ServiceHandler(继承handler,并进行了封装),将Looper传入ServiceHandler,则ServiceHandler就变成了处理异步线程的执行类。
    @Override
    public void onCreate() {
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
  1. IntentService启动后会调用onStartCommand方法,然后调用onStart方法,通过mServiceHandler.sendMessage(msg);来传递消息,
    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }
    
        @Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
  1. 然后调用ServiceHandler的handlerMessage方法,最后会回调onHandlerIntent,这是一个抽象方法,可以执行异步任务。调用stopSelf方法,停止服务。stopSelf有参数,表示所有的消息处理完成后,采用终止任务。
    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

四、IntentService与Service的区别

  • IntentService可以在onHandlerIntent方法中执行耗时操作
  • Service不可以执行耗时操作

git代码

参考资料 Android多线程:手把手教你使用HandlerThread