####1、定義及做用 IntentService 是繼承於Service,用於處理異步請求,實現多線程的一個類。 ####2、使用及原理 如何使用: 步驟1:定義IntentService的子類:傳入線程名稱、複寫onHandleIntent()方法android
package com.example.administrator.test; import android.app.IntentService; import android.content.Intent; import android.util.Log; public class myIntentService extends IntentService { public myIntentService() { //構造函數參數=工做線程的名字 super("myIntentService"); } /*複寫onHandleIntent()方法*/ //實現耗時任務的操做 @Override protected void onHandleIntent(Intent intent) { //不一樣的事務用不一樣的ntent標記 String taskName = intent.getExtras().getString("taskName"); switch (taskName) { case "task1": Log.i("myIntentService", "do task1"); break; case "task2": Log.i("myIntentService", "do task2"); break; default: break; } } @Override public void onCreate() { Log.i("myIntentService", "onCreate"); super.onCreate(); } /*複寫onStartCommand()方法*/ //默認實現將請求的Intent添加到工做隊列裏 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("myIntentService", "onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.i("myIntentService", "onDestroy"); super.onDestroy(); } }
步驟2:在Manifest.xml中註冊服務多線程
<service android:name=".myIntentService"/>
步驟3:在Activity中開啓Service服務app
package com.example.administrator.test; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //同一服務只會開啓一個工做線程 //在onHandleIntent函數裏依次處理intent請求。 Intent i = new Intent("cn.scu.finch"); Bundle bundle = new Bundle(); bundle.putString("taskName", "task1"); i.putExtras(bundle); startService(i); Intent i2 = new Intent("cn.scu.finch"); Bundle bundle2 = new Bundle(); bundle2.putString("taskName", "task2"); i2.putExtras(bundle2); startService(i2); startService(i); //屢次啓動 } }
####3、爲什麼能成: 由於IntentService本質 = Handler + HandlerThread: (1)經過HandlerThread 單獨開啓1個工做線程 (2)該線程繼承了Thread,封裝了Looper (3)建立1個內部 Handler :ServiceHandler (4)綁定 ServiceHandler 與 Looper (5)經過 onStartCommand() 傳遞服務intent 到ServiceHandler 、依次插入Intent到工做隊列中 & 逐個發送給 onHandleIntent() (6)經過onHandleIntent() 依次處理全部Intent對象所對應的任務 ####4、對比Service以及後臺線程異步
Service:不能直接進行耗時操做(會ANR),若是有耗時操做就必須開啓一個單獨的線程來處理。IntentService不用再單獨開線程,由於其內部已經開了工做線程進行處理。而且在處理完成後會自動中止服務。欸~這裏就體現好處了,service須要調用stopSelf()或者stopService()中止服務,那麼就會出現有時候忘記中止的狀況,可是使用IntentService就不用擔憂會出現這個問題 Service須要主動調用stopSelft()來結束服務,而IntentService不須要(在全部intent被處理完後,系統會自動關閉服務)ide
IntentService:能處理想要順序執行的耗時操做,反之,沒法處理同時進行的耗時操做 後臺線程:優先級沒有IntentService高,畢竟人家IntentService是繼承Service,在資源緊張的狀況下,相對來講後臺線程比較容易被消滅掉函數
####5、使用場景oop
線程任務須要按順序、在後臺執行的使用場景最多見的場景:離線下載 因爲全部的任務都在同一個Thread looper裏面來作,因此不符合多個數據同時請求的場景。線程
####最後 若是你看到了這裏,以爲文章寫得不錯就給個讚唄!歡迎你們評論討論!若是你以爲那裏值得改進的,請給我留言。必定會認真查詢,修正不足,按期免費分享技術乾貨。感興趣的小夥伴能夠點一下關注哦。謝謝! code