一、IntentService源码解析
(1)IntentService源码
//该构造方法需在子类中调用,用于创建一个IntentService对象。
public IntentService(String name) {
super();
//用于定义工作线程的名称,仅仅用于调式作用。
mName = name;
}
@Override
public void onCreate() {
super.onCreate();
//创建了一个循环的工作线程thread
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
//将工作线程中的Looper对象作为参数来创建ServiceHandler消息执行者
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
//在IntentService子类中你无需重写该方法。你需要重写onHandlerIntent方法,系统会在IntentService接受一个请求开始调用该方法
@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 onStart(@Nullable Intent intent, int startId) {
//获得一个消息对象msg
Message msg = mServiceHandler.obtainMessage();
//将startId作为该消息的消息码。
msg.arg1 = startId;
//将异步任务请求intent作为消息内容封装成一个消息msg
msg.obj = intent;
//发送到mServiceHandler消息执行者中去处理
mServiceHandler.sendMessage(msg);
}
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
//处理异步任务intent的请求
onHandleIntent((Intent)msg.obj);
//自动结束IntentService服务
stopSelf(msg.arg1);
}
}
//该方法用于处理intent异步任务请求,在工作线程中调用该方法。
protected abstract void onHandleIntent(@Nullable Intent intent);
@Override
public void onDestroy() {
//让当前工作线程HandlerThread退出当前Looper循环,进而结束线程
mServiceLooper.quit();
}
每一个时刻只能处理一个intent请求,当同时又多个intent请求时,也就是客户端同时多次调用startService方法启动同一个服务时,其他的intent请求会暂时被挂起,直到前面的intent异步任务请求处理完成才会处理下一个intent请求。直到所有的intent请求结束之后,IntentService服务会调用stopSelf停止当前服务。也就是当intent异步任务处理结束之后,对应的IntentService服务会自动销毁,进而调用onDestroy方法。
总结
- 子类需继承IntentService并且实现里面的onHandlerIntent抽象方法来处理intent类型的任务请求。
- 子类需要重写默认的构造方法,且在构造方法中调用父类带参数的构造方法。
- IntentService类内部利用HandlerThread+Handler构建了一个带有消息循环处理机制的后台工作线程,客户端只需调用startService(Intent)将Intent任务请求放入后台工作队列中,且客户端无需关注服务是否结束,非常适合一次性的后台任务。
网友评论