串行java
public class LocalIntentService extends IntentService { public static final String TAG="LocalIntentService"; public LocalIntentService( ) { super(TAG); } @Override protected void onHandleIntent(Intent intent) { String task=intent.getStringExtra("task"); Log.e(TAG, "onHandleIntent: task:"+task ); } @Override public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate: " ); } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy: " ); } }
<service android:name=".LocalIntentService"/>
findViewById(R.id.bt1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent service=new Intent(MainActivity.this,LocalIntentService.class); service.putExtra("task","task1"); startService(service); service.putExtra("task","task2"); startService(service); service.putExtra("task","task3"); startService(service); service.putExtra("task","task4"); startService(service); } });
//IntentService第一次啓動調用 public void onCreate() { super.onCreate(); //1. 建立一個HanlderThread HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); //2. 經過HanlderThread的Looper來構建Handler對象mServiceHandler mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper);
- HandlerThread會串行的取出任務而且執行,會調用ServiceHandler的handleMessage去處理任務。
- handlerMessage會去調用咱們自定義的onHandleIntent
- 任務執行完畢後經過stopSelf(startId)中止Service。
- 任務結束後,在onDestory()中會退出HandlerThread中Looper的循環。
//ServiceHandler接收並處理onStart()方法中發送的Msg private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { //1. 直接在onHandleIntent中處理(由子類實現) onHandleIntent((Intent)msg.obj); /**================================================= * 2. 嘗試中止服務(會等待全部消息都處理完畢後,纔會中止) * 不能採用stopSelf()——會當即中止服務 *================================================*/ stopSelf(msg.arg1); //會判斷啓動服務次數是否與startId相等 } } public void onDestroy() { mServiceLooper.quit(); }//銷燬時會中止looper
- 採用stopSelf()——會當即中止服務
- 採用stopSelf(startId),會等全部消息所有處理完畢後,纔會中止。
會判斷啓動服務次數是否與startId相等
- 調用stopSelf(startId)後。
- 任務所有執行完,會中止服務,而且回調onDestory()。調用Looper的quit()方法便可
- startService()->onStartCommand()->onStart()
- 經過HandlerThread的handler去發送消息。
- HandlerThread在處理任務時,會去調用onHandleIntent方法。
public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; ...省略... //IntentService每次啓動都會調用 public int onStartCommand(Intent intent, int flags, int startId) { //3. 直接調用onStart onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } public void onStart(Intent intent, int startId) { //4. 經過mServiceHandler發送一個消息(該消息會在HanlderThread中處理) Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); } //2. 該Intent與startService(intent)中的Intent徹底一致 protected abstract void onHandleIntent(Intent intent); }
- IntentService經過發送消息的方式向HandlerThread請求執行任務
- HandlerThread中的looper是順序處理消息,所以有多個後臺任務時,都會按照外界發起的順序排隊執行
- 啓動流程:onCreate()->onStartCommand()->onStart()
- 消息處理流程:ServiceHandler.handleMessage()->onHandleIntent()