Android IntentService 源码解读

Posted by hurshi on 2018.01.01
先上源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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 IntentService(String name) {
          super();
          mName = name;
      }
  
      public void setIntentRedelivery(boolean enabled) {
          mRedelivery = enabled;
      }
  
      @Override
      public void onCreate() {
          super.onCreate();
          HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
          thread.start();
  
          mServiceLooper = thread.getLooper();
          //👈关键点:指定handler的在HandlerThread中运行,HandlerThread其实就是一个普通的新线程
          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();
      }
  
      @Override
      @Nullable
      public IBinder onBind(Intent intent) {
          return null;
      }
  
      @WorkerThread
      protected abstract void onHandleIntent(@Nullable Intent intent);
}

自己的理解:

  1. 新建Thread HandlerThread;
  2. 指定ServiceHandler运行在HandlerThread中;👈关键点
  3. onStartCommand接收到消息全都send到ServiceHandler中;
  4. ServiceHandler在新线程中handleMessage然后调用onHandleIntent;