如果我们启动一个服务,让这个服务在后台开启一个子线程去做一些事情,可以使用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 void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
@Override
public void onCreate() {
// TODO: It would be nice to have an option to hold a partial wakelock
// during processing, and to have a static startService(Context, Intent)
// method that would launch the service & hand off a wakelock.
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();/退出looper
}
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
从源码可以看出,IntentService做了如下几件事情
-1,在onCreate方法里面创建了一个HandlerThread 和使用HandlerThread子线程的Looper构建了一个mServiceHandler对象 , 所以mServiceHandler对象的handleMessage方法是在子线程执行
-2,在onStartCommand方法中调用onStart方法,传入intent
-3,在onStart方法中将将开启服务的intent打包到message中,使用mServiceHandler.sendMessage 发送给子线程的MessageQueue中
-4,在子线程的handleMessage中调用onHandleIntent方法,传入intent做参数
-5, 当onHandleIntent处理完之后,就会自动调用stopSelf停止服务。
如果继承自IntentService ,注意如下几点:
-如果要重写onCreate onStart onStartCommand,onDestory方法,记得调用super
-在子线程的操作请重写onHandleIntent方法,在此方法里面做一些耗时的操作。
使用IntentService service执行耗时的操作,不需要自己开启子线程,也不需要去stop服务,只需要重写onHandleIntent方法,将耗时的操作放入此方法中即可。