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. 构造函数,一个参数的构造如下
public IntentService(String name) {
super();
mName = name;
//传入了一个名字,这个名字是在创建一个HandlerThread ,为该线程取名用的,至于HandlerThread 是个什么东西,我们现放在这里后面再讲
/*new HandlerThread("IntentService[" + mName + "]");
*/
}
- 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);
}
- 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);
- 继续看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对象,在销毁时停止
@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,等等。
- 那么我们什么情况下会用到它呢?