IntentService是什么?
IntentService是一个用来在子线程中执行任务的服务。
为什么这么说呢?我们一起来看看IntentService的源码
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(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
protected abstract void onHandleIntent(Intent intent);
}
onCreate创建了HandlerThread
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
可以看到,IntentService中用到了HeadlerThread(不了解HandlerThread的可以先看这篇文章HandlerThread源码解析)
并创建了一个用该HandlerThread的Looper创建的Handler-mServiceHandler
ServiceHandler是一个重写了handleMessage的Handler
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);
}
}
可以看到,这是一个重写了handleMessage的Handler,并且在handleMessage方法中调用了一个抽象方法onHandlerIntent,
- 并且,在调用完onHandleIntent后,调用stopSelf结束了当前的IntentService.
handleMessage的执行时期
@Override
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
可以看到,在onStart方法中,使用mServiceHandler发送了一个消息,即在Looper接收到这个消息的时候就会调用handleMessage方法,并在调用完onHandleIntent之后退出服务。
@Override
public void onDestroy() {
mServiceLooper.quit();
}
并且,在退出服务的同时,也退出了Looper。
要点
- Service的生命周期的回调都是在主线程执行的,不能做耗时操作;
- onHandleIntent执行在HandlerThread这个子线程中,可以做耗时操作;
- onHandleIntent执行完成之后服务会自动结束,并且停止HandlerThread的Looper,不需要做额外的处理;
为什么不直接使用HandlerThread来在子线程执行耗时操作
- 因为没有依附于四大组件的线程优先级很低,容易被系统杀死,在服务中的线程拥有较高的优先级。