美文网首页
理解IntentService

理解IntentService

作者: 匿名用户_bcc3 | 来源:发表于2018-12-03 23:53 被阅读0次

    在之前的文章中,介绍了Android的四大组件之一Service。但是里边没有介绍到IntentService,今天介绍一下IntentService的使用和与Service的区别以及其源码分析。

    我们知道Service虽然叫做服务,但是仍然运行在主线程的,也就是UI线程,那么在Service中肯定不能有耗时操作。那如果在Service中需要做耗时操作怎么办呢?那只能在Service中创建一个工作线程来做耗时操作了,而IntentService就是帮我们做了这件事。

    IntentService简单使用

    使用IntentService是非常简单的,只要集成IntentService并且重写onHandleIntent()就可以了,然后在onHandleIntent中做耗时操作。

    IntentService源码分析

    我们先看下IntentService的构造方法

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

    首先,启动了一个HandlerThread,我们点进去看看HandlerThread,可以看到继承了Thread,说明这是一个Thread,Thread最主要就是run方法了。

        @Override
        public void run() {
            mTid = Process.myTid();
            Looper.prepare();
            synchronized (this) {
                mLooper = Looper.myLooper();
                notifyAll();
            }
            Process.setThreadPriority(mPriority);
            onLooperPrepared();
            Looper.loop();
            mTid = -1;
        }
    

    可以看出来HandlerThread就是为该线程创建并启动了一个Looper,所以我一直觉得HandlerThread应该叫LooperThread,感觉这样更容易理解。

    再回到IntentService的构造方法中,首先启动一个带Looper的线程,然后再通过子线程的Looper创建一个ServiceHandler。

    再看下onStart方法,通过ServiceHandler将intent从主线程发送到工作线程。

        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);
            }
        }
         @Override
         public void onStart(@Nullable Intent intent, int startId) {
            Message msg = mServiceHandler.obtainMessage();
            msg.arg1 = startId;
            msg.obj = intent;
            mServiceHandler.sendMessage(msg);
        }
    

    因为ServiceHandler持有的是子线程的Looper,所以handlerMessage也就是在子线程中执行的了。并且,在handleMessage中还调用了stopSelf。

    所以使用IntentService主要有两个优点:

    • 帮我们创建了Thread。
    • 耗时操作完成之后,Service可以自杀。

    IntentService本身源码很少,看起来很简单,但是涉及到很多基础知识,Handler、Looper、MessageQueue、ThreadLocal。所以IntentService成了面试必问了。

    相关文章

      网友评论

          本文标题:理解IntentService

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