从源代码理解IntentService

IntentService的源代码分析路径如下:

onCreate( ) -> onStartCommand(Intent , int ) -> onStart(Intent ,int ) ->(内部类)ServiceHandler.handleMessage(Message )   -> onHandleIntent(Intent) ->stopSelf(Int)


一.

我们看onCreate()构造方法:

 public void onCreate() {
       super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        mServiceLooper = thread.getLooper();
       mServiceHandler = new ServiceHandler(mServiceLooper);
    }
我们看到,在构造器中做了以下一些准备工作:

1. 创建一个HandlerThread ,并启动

2. 由HandlerThread实例中获得一个Looper

3. 将2中获得的looper作为参数传进内部类ServiceHandler的构造方法中构造一个ServiceHandler 



二.

每次启动IntentService就会调用一次onStartCommand(Intent ,Int),然后它紧接着就调用了onStart(Intent ,Int),我们来看一下onStart(Intent, Int):

  public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }
明显看到在onStart中做了以下工作:

1.创建一个Message对象

2.将onStart的参数传进message对象中

3.调用内部类ServiceHandler的sendMessage方法发送消息,这会使得ServiceHandler接受到消息后调用handleMessage(Message);


三.

我们接下来看看内部类ServiceHandler的内容是什么:

 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);
         }
 
这里我们看到,在IntentService中有一个ServiceHandler的内部类,在内部类的handleMessage 方法中,onHandleIntent(Intent)被调用,而这个onHandleIntent(Intent)是一个抽象方法,它由IntentService的子类提供实现;

而真正的任务的执行就是发生在这个由子类实现的onHandleIntent(Intent)方法里;

在任务结束后,handleMessage(Message)会调用stopSelf来停止自身(IntentService);

这样一个IntentService就完成它的任务了。






你可能感兴趣的:(从源代码理解IntentService)