zoukankan      html  css  js  c++  java
  • IntentService学习

    IntentService是一个Service,主要就是Service和HandlerThread的结合

    一、使用

    就使用和Service差不多,但是比Service多个一个方法实现:

    public class MyIntentService extends IntentService {
        
        /**
         * Creates an IntentService.  Invoked by your subclass's constructor.
         *
         * @param name Used to name the worker thread, important only for debugging.
         */
        public MyIntentService(String name) {
            super(name);
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
    
        }
    }

    onHandleIntent里面可以实现耗时的操作。

    二、源码分析

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

    以上是IntentService的onCreate方法,从里面代码看出,类似我们之前学习HandlerThread的时候的例子-HandlerThread学习

    其实就是在Service里面使用HandlerThread去做耗时任务。

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

    在Service启动的时候Handler会发出消息,之后ServiceHandler处理该消息,处理时会调用onHandleIntent抽象方法,实现的时候需要我们自己去添加相应的代码。

    从上面的代码我们发现stopSelf(msg.arg1),那么这个Service执行完成异步时候就自动停止了,等着回收。

    是不是很简单,理解了Handler,Looper,Message这个就比较容易看懂。

  • 相关阅读:
    洛谷模板汇总
    BZOJ1787【AHOI2008】Meet紧急集合 <LCA>
    HDU3068 最长回文 <Manacher>
    UVa12345 Dynamic len(set(a[L:R])) <带修莫队>
    BZOJ2038 小Z的袜子 <莫队>
    BZOJ1103【POI2007】大都市meg <树上差分+树状数组>
    BZOJ3226【SDOI2008】校门外的区间
    BZOJ1012【JSOI2008】最大数 <线段树>
    20170918~24周总结
    BZOJ1934【SHOI2007】善意的投票 <网络流>
  • 原文地址:https://www.cnblogs.com/doubleyoujs/p/7761200.html
Copyright © 2011-2022 走看看