package android.app; import android.annotation.WorkerThread; import android.annotation.Nullable; import android.content.Intent; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.Looper; import android.os.Message; /** * ä½è ï¼å¶åºæ¯å¶ * æ¶é´ï¼2018/6/22 13:39 * æè¿°ï¼https://github.com/leavesC * https://www.jianshu.com/u/9df45b87cfdf */ public abstract class IntentService extends Service { private volatile Looper mServiceLooper; //å ³èäº mServiceLooper ç Handler private volatile ServiceHandler mServiceHandler; //IntentService å é¨ä½¿ç¨çå线ç¨ç线ç¨å private String mName; //ç¨äºå³å® onStartCommand() æ¹æ³çè¿åå¼ private boolean mRedelivery; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { //å°èæ¶ä»»å¡è½¬äº¤ç» onHandleIntent() æ¹æ³æ¥å®æ //onHandleIntent() éè¦ç±åç±»æ¥å®ç° onHandleIntent((Intent)msg.obj); //msg.arg1 å³ startId //妿å½å stopSelf(msg.arg1); } } //ä¼ å ¥å线ç¨å public IntentService(String name) { super(); mName = name; } //ç¨äºå³å® onStartCommand() æ¹æ³çè¿åå¼ //å¦æåæ°ä¸º true åè¿å START_REDELIVER_INTENT //å¦æç³»ç»å¨ onStartCommand() è¿ååç»æ¢æå¡ï¼åä¼é建æå¡ï¼å¹¶éè¿ä¼ éç»æå¡çæåä¸ä¸ª Intent è°ç¨ onStartCommand() //ä»»ä½æèµ· Intent å便¬¡ä¼ éãè¿éç¨äºä¸»å¨æ§è¡åºè¯¥ç«å³æ¢å¤çä½ä¸ï¼ä¾å¦ä¸è½½æä»¶ï¼çæå¡ //å¦æåæ°ä¸º false åè¿å START_NOT_STICKY //å¦æç³»ç»å¨ onStartCommand() è¿ååç»æ¢æå¡ï¼åé¤éææèµ· Intent è¦ä¼ éï¼å¦åç³»ç»ä¸ä¼é建æå¡ //è¿æ¯æå®å ¨çé项ï¼å¯ä»¥é¿å å¨ä¸å¿ è¦æ¶ä»¥ååºç¨è½å¤è½»æ¾éå¯æææªå®æçä½ä¸æ¶è¿è¡æå¡ public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; } @Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); //触å HandlerThread å建 Looper 对象 thread.start(); //è·å Looper 对象ï¼ä»¥æ¤æ¥æå»ºå¯ä»¥åå线ç¨åé Message ç Handler 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); } //æ¯æ¬¡åè° onStartCommand() æ¹æ³æ¶ï¼åæ° startId çå¼é½æ¯èªå¨éå¢çï¼startId ç¨äºå¯ä¸æ è¯æ¯æ¬¡å¯¹ Service åèµ·çå¤çè¯·æ± //妿 Service åæ¶å¤çå¤ä¸ª onStartCommand() 请æ±ï¼åä¸åºå¨å¤çå®ä¸ä¸ªå¯å¨è¯·æ±ä¹åç«å³éæ¯ Service //å ä¸ºæ¤æ¶å¯è½å·²ç»æ¶å°äºæ°çå¯å¨è¯·æ±ï¼å¨ç¬¬ä¸ä¸ªè¯·æ±ç»ææ¶åæ¢æå¡ä¼å¯¼è´ç¬¬äºä¸ªè¯·æ±è¢«ç»æ¢ //为äºé¿å è¿ä¸é®é¢ï¼å¯ä»¥ä½¿ç¨ stopSelf(int) ç¡®ä¿ Service åæ¢è¯·æ±å§ç»æ¯åºäºææ°ä¸æ¬¡çå¯å¨è¯·æ± //ä¹å°±æ¯è¯´ï¼å¦æè°ç¨ stopSelf(int) æ¹æ³çåæ°å¼ä¸ onStartCommand() æ¥åå°çææ°ç startId å¼ä¸ç¸ç¬¦çè¯ï¼stopSelf(int) æ¹æ³å°±ä¼å¤±æï¼ä»èé¿å ç»æ¢å°æªå¤ççè¯·æ± @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() { //ç§»é¤ææå¾ åéç Message mServiceLooper.quit(); } @Override @Nullable public IBinder onBind(Intent intent) { return null; } //æ¤æ¹æ³éè¦ç±åç±»æ¥å®ç° //卿¤æ¹å¼ä¸å®æå ·ä½çèæ¶ä»»å¡ @WorkerThread protected abstract void onHandleIntent(@Nullable Intent intent); }