通常我们在做后台操作的时候,需要启动一个service来执行任务,启动service通常是两种方式:
(1)startService,这种方式一旦启动,该service就一直在后台运行,与启动service的其他组件的生命周期没有关系。
(2)bindService,这种方式启动service,那么该service会与启动它的组件的生命周期绑定,比如用activity启动,那么activity销毁的时候,那么这个service也会销毁。
这里会有一个误解,很多人认为service可以用于做耗时操作,但是实际上,service中是不能做耗时操作的,如果我们想要做一些耗时操作,并且在任务执行完成后可以销毁服务,这个时候可以借助IntentService。
为什么说IntentService可以做耗时操作呢?我们看下源码。
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread =new HandlerThread("IntentService[" +mName +"]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler =new ServiceHandler(mServiceLooper);
}
在oncreate方法中,会创建一个HandlerThread,这个HandlerThread实质上就是一个线程,只不过在他内部维护了一个Handler,我们要做的耗时操作主要是在这个Thread中进行,并且HandlerThread内部会维护一台Handler机制,mServiceLooper就是该Thread中包含的looper,然后将这个looper放入serviceHandler的构造函数中,
private final class ServiceHandlerextends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
耗时操作交给HandlerThread后,经过其内部的Handler调度,会传递给ServiceHandler的回调handleMessage()中,在handleMessage方法中,有两个重要操作,一个是onHandleIntent()来处理msg传递过来的耗时操作,另一个操作就是stopSelf()方法将服务终止。
所以IntentService就适合处理这种耗时操作,并且在操作结束后会结束自身,防止资源的占用。