IntentService源码欣赏

1. IntentService源码欣赏

  • 咱们先来看源码吧
public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;

    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);
        }
    }
    public IntentService(String name) {
        super();
        mName = name;
    }
    public void setIntentRedelivery(boolean enabled) {
        mRedelivery = enabled;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        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. 构造函数,一个参数的构造以下java

public IntentService(String name) {
        super();
        mName = name;
        //传入了一个名字,这个名字是在建立一个HandlerThread ,为该线程取名用的,至于HandlerThread 是个什么东西,咱们现放在这里后面再讲
        /*new HandlerThread("IntentService[" + mName + "]"); */
         }
  1. onCreatea() 方法
    咱们看到onCreate 方法作了这么几件事情,建立了一个HandlerThread,同时根据HandlerThread获取到的Looper建立了ServiceHandler,这里基本就是HandlerThread的使用方法了,须要和结合handler使用,同时handler 的handleMessage方法,回调的子线程了哟,也就是HandlerThread对应的子线程!
@Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
  1. ServiceHandler
    上面咱们看到在onCreate方法里面建立了一个ServiceHandler,那么这个又是一个什么呢,只是一个普通 的Handler类可是把handleMessage接受道的消息交给了抽象方法onHandleIntent(),也就是子类须要处理的事情.
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);
        }
    }


@WorkerThread
 protected abstract void onHandleIntent(@Nullable Intent intent);
  1. 继续看onStart方法和onStartCommand
    在service建立以后会走到onStartCommand这里,这个方法里面调用了onStart方法,而onStart方法则是利用mServiceHandler发出了一条消息,回调给 onHandleIntent,看到这里咱们明白了同样东西,也就是建立Service是时候,咱们能够经过Intent来传递数据给Service,他们指点的传递正是经过 onHandleIntent方法
@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;
    }

5.销毁
mServiceLooper.quit(); 这个是什么呢?
mServiceLooper = thread.getLooper(); mServiceLooper 是根据当HandlerThread的工做线程获取到的 一个 Looper对象,在销毁时中止web

@Override
    public void onDestroy() {
        mServiceLooper.quit(); 
    }

整个service的流程如上所讲几个小点,咱们发现其实IntentService是一个用来处理异步任务而且处理完任务以后会自行退出的service(handleMessage 里面回调 onHandleIntent以后调用了 stopSelf(msg.arg1);)。异步

2. IntentService 总结

    • 它内部使用了HanderThread ,那么咱们能够知道他是用来处理异步任务的service
    • 在处理完任务以后不一样于普通的service的地方是,任务结束后本身中止,不须要手动中止
    • 若是咱们屡次启动服务会是什么状况呢?
      直接上吧:屡次启动后不会建立多个service的实例,而是每次都会走 onStartCommand和onstart方法,由于内部是HandlerThread的缘故,多个任务不会同时执行,由于HandlerThread内部只有一个子线程,任务会排成队列逐个执行直到结束
    • 那么咱们什么状况下会用到它呢? 根据他的这样一个特色,咱们确认,通常要一部执行,而且执行结束后自行结束的服务,比方说,咱们下载apk,比方说咱们安装apk,等等。