ServiceService 是長期運行在后臺的應用程序組件。Service 不是一個單獨的進程,它和應用程序在同一個進程中,Service 也不是一個線程,它和線程沒有任何關系,所以它不能直接處理耗時操作。如果直接把耗時操作放在 Service 的 onStartCommand() 中,很容易引起 ANR .如果有耗時操作就必須開啟一個單獨的線程來處理。IntentServiceIntentService 是繼承于 Service 并處理異步請求的一個類,在 IntentService 內有一個工作線程來處理耗時操作,啟動 IntentService 的方式和啟動傳統 Service 一樣,同時,當任務執行完后,IntentService 會自動停止,而不需要我們去手動控制。另外,可以啟動 IntentService 多次,而每一個耗時操作會以工作隊列的方式在IntentService 的 onHandleIntent 回調方法中執行,并且,每次只會執行一個工作線程,執行完第一個再執行第二個,以此類推。而且,所有請求都在一個單線程中,不會阻塞應用程序的主線程(UI Thread),同一時間只處理一個請求。 那么,用 IntentService 有什么好處呢?首先,我們省去了在 Service 中手動開線程的麻煩,第二,當操作完成時,我們不用手動停止 Service。IntentService源碼查看:public abstract class IntentService extends Service { PRivate volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; 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); } } @Override public void onCreate() { super.onCreate(); //在此創建并開啟新的線程HandlerThread來處理耗時操作 //HandlerThread 繼承Thread 在其run方法中創建了一個Looper,初始化和啟動了一個線程, HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); //返回的就是我們在run方法中創建的mLooper mServiceLooper = thread.getLooper(); //與UI線程管理的handler 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() { //該方法實際上是調用了MessageQueue中的removeAllMessagesLocked,作用是將消息池中所有的消息全部清空 mServiceLooper.quit(); } @Override @Nullable public IBinder onBind(Intent intent) { //默認返回為null return null; } @WorkerThread //子類需要實現的接口 protected abstract void onHandleIntent(@Nullable Intent intent);}
新聞熱點
疑難解答