我们都知道Service是Android四大组件之一,与Activity相似的组件,它们都代表可以执行的程序,Service与Activity的区别在于:Service一直在后台运行,没有用户界面,因此绝不会到前台来。一旦Service被启动起来之后,就与Activity一样,具有自己的生命周期。
IntentService是Servicer的子类,它不是普通的Service,它比普通的Service增加了额外的功能。因为Service本身存在两个问题:
1)Service不会专门启动一个单独的进程,它与所在的应用位于同一个进程中。
2)Service不是一个线程,因此不应该在Service中直接处理耗时操作的任
IntentService正好弥补了Service这两点不足,它具有如下特性:
1)IntentService会创建单独的worker线程来处理所有的Intent请求。IntentService重写了Service的onCreate()方法:
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
在IntentService的onCreate()方法里面创建了一个HandlerThread对象,然后使用它的Looper来构建一个Handler对象ServiceHandler,这样通过mServiceHandler发送的消息最终都会在HandlerThread中执行。
2)IntentService会创建单独的worker线程来处理onHandlerIntent()方法实现的代码,开发者无需要处理多线程问题。
@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;
}
启动IntentService启动都会调用一次onStartCommand()方法,而其会调用onStart()方法,请求发送一个Message给ServiceHandler处理。ServiceHandler接收到消息之后,会将Intent对象传递给onHandleIntent(Intent)方法处理,这个Intent参数正是onStartCommand中传递过来的,通过它即可得到启动时外界传递过来的参数。
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);
}
}
3)当所有请求处理完成后,IntentService会自动停止,开发者无须调用stopSelf(startId)方法来尝试停止该Service。
这里stopSelf(startId)和stopSelf()区别:
stopSelf()会立刻停止服务,这个时候还有可能有其他消息未处理;
stopSelf(int startId)会等待所有的消息都处理完毕后才会终止服务。一般来说,stopSelf(int startId)会在停止之前判断最近启动服务的次数是否和startId相等,相等则停止,不等就等待。