美文网首页
Android多线程之IntentService

Android多线程之IntentService

作者: Leon_hy | 来源:发表于2018-03-26 15:24 被阅读7次

    在上一篇我们已经讲过HandlerThread的原理以及使用,今天我们来讲一下IntentService

    IntentService简介

    IntentService是一个抽象类,继承自Service,所以IntentService就是一个Service,只是InentService可以执行耗时操作,逐一处理异步任务,直到任务结束自动结束Service。

    public abstract class IntentService extends Service {...}
    

    IntentService源码解析

    public abstract class IntentService extends Service {
        private volatile Looper mServiceLooper;
        private volatile ServiceHandler mServiceHandler;
        private String mName;
        private boolean mRedelivery;
    
    /**
    一个内部类Handler
        private final class ServiceHandler extends Handler {
            public ServiceHandler(Looper looper) {
                super(looper);
            }
    
            @Override
            public void handleMessage(Message msg) {
              //调用这个方法处理数据
                onHandleIntent((Intent)msg.obj);
             //处理完成结束Service
                stopSelf(msg.arg1);
            }
        }
    
        /**
         * Creates an IntentService.  Invoked by your subclass's constructor.
         *
         * @param name Used to name the worker thread, important only for debugging.
         */
        public IntentService(String name) {
            super();
            mName = name;
        }
    
        public void setIntentRedelivery(boolean enabled) {
            mRedelivery = enabled;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
           //创建一个HandlerThread,
            HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
          //启动HandlerThread
            thread.start();
          //获取HandlerThread的Looper对象
            mServiceLooper = thread.getLooper();
            mServiceHandler = new ServiceHandler(mServiceLooper);
        }
    
        @Override
        public void onStart(@Nullable Intent intent, int startId) {
            Message msg = mServiceHandler.obtainMessage();
            msg.arg1 = startId;
            msg.obj = intent;
            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 onDestroy() {
            mServiceLooper.quit();
        }
    
        @Override
        @Nullable
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @WorkerThread
        protected abstract void onHandleIntent(@Nullable Intent intent);
    }
    

    1.启动IntentService调用onCreate方法,首先会启动一个HandlerThread线程,然后获取到HandlerThread的Looper对象,然后根据这个Looper对象实例化Handler。
    2.在onStart方法里面用Handler发送消息,在onStartCommand方法调用onStart方法。
    3.在handleMessage方法里面调用onHandleIntent((Intent)msg.obj)方法,所有继承IntentService的Service都会实现onHandleIntent((Intent)msg.obj)方法,在这个方法里面处理耗时事件

    总结

    在第一次启动 IntentService 后,IntentService 仍然可以接受新的请求,接受到的新的请求被放入了工作队列中,等待被串行执行。

    用 IntentService 显著简化了启动服务的实现,如果您决定还重写其他回调方法(如 onCreate()、onStartCommand() 或 onDestroy()),请确保调用超类实现,
    以便 IntentService 能够妥善处理工作线程的生命周期。
    

    由于大多数启动服务都不必同时处理多个请求(实际上,这种多线程情况可能很危险),因此使用 IntentService 类实现服务也许是最好的选择。

    拓展:如何在IntentService里面并行执行消息队列?
    在onHandleIntent方法回调时采用线程池,当有消息来时将线程放入线程池执行。

    相关文章

      网友评论

          本文标题:Android多线程之IntentService

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