Android多线程之IntentService

2018-03-26  本文已影响7人  Leon_hy

在上一篇我们已经讲过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方法回调时采用线程池,当有消息来时将线程放入线程池执行。

上一篇下一篇

猜你喜欢

热点阅读