IntentService原理

我们都知道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相等,相等则停止,不等就等待。

你可能感兴趣的:(IntentService原理)