美文网首页
IntentService源码分析

IntentService源码分析

作者: 唐一川 | 来源:发表于2016-07-06 14:10 被阅读73次

    1 概论

    IntentService是一种处理异步请求的Service。客户端通过调用Context.startService(Intent)来发送请求,启动Service;Service按需启动后,会依次按顺序处理工作线程中的Intent,并且在工作结束后会自动停止。

    2 IntentService是如何启动一个异步线程处理请求的?

    IntentService在创建时,会创建并启动一个线程HandlerThread,并且赋予这个线程一个Looper;

    @Override
        public void onCreate() {
            super.onCreate();
            HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
            thread.start();
            mServiceLooper = thread.getLooper();
            mServiceHandler = new ServiceHandler(mServiceLooper);
        }
    

    ServiceHandler是Handler的一个子类,用来接受处理消息Message,我们知道一般Handler是在UI主线程接受处理消息的,要想在异步线程接受处理消息,必须给这个异步线程关联一个Looper,并且在异步线程调用Looper.prepare()方法;

    public class HandlerThread extends Thread {
        int mPriority;
        int mTid = -1;
        Looper mLooper;
        
        public HandlerThread(String name) {
            super(name);
            mPriority = Process.THREAD_PRIORITY_DEFAULT;
        }
        ...
        @Override
        public void run() {
            mTid = Process.myTid();
            Looper.prepare();
            synchronized (this) {
                mLooper = Looper.myLooper();
                notifyAll();
            }
            Process.setThreadPriority(mPriority);
            onLooperPrepared();
            Looper.loop();
            mTid = -1;
        }
        ...
    }
    

    3 IntentService是如何处理Intent的

    调用Context.startService(Intent)后,Service被启动,执行onCreate()方法,然后执行onStart(Intent intent,int startId);

        public void onStart(Intent intent, int startId) {
            Message msg = mServiceHandler.obtainMessage();
            msg.arg1 = startId;
            msg.obj = intent;
            mServiceHandler.sendMessage(msg);
        }
    

    可以看到Service开始后,会把Intent对象通过Handler机制交给ServiceHandler来处理,ServiceHandler接受到消息后:

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

    ServiceHandler接受到消息后,取出Intent,启动onHandleIntent(Intent) 方法,来处理Intent;

    我们来看onHandleIntent(Intent intent);

    protected abstract void onHandleIntent(Intent intent);
    

    这是一个抽象方法,留给开发者自己实现,异步操作的实现逻辑都在这个抽象方法里面;操作完成后,通过调用stopSelf() Service

    4 总结

    1. IntentService在创建的时候会创建一个线程,并启动这个异步线程;
    2. 创建的异步线程会利用Looper、Handler来创建、发送、接受消息Message,与UI主线程通过Handler机制进行线程通信是同理的;
    3. Service的异步操作逻辑是定义在抽象方法onHandleIntent(Intent)里面,开发者需要实现这个抽象方法;
    4. ServiceHandler处理消息是在异步线程里面的,onHandleIntent(Intent)也是运行在异步线程里面的,这与UI主线程里面的Handler不同;

    相关文章

      网友评论

          本文标题:IntentService源码分析

          本文链接:https://www.haomeiwen.com/subject/bbekjttx.html