上套路,說廢話。IntentService是個Service的管理器,源碼也不是很難,幫助我們簡化任務創(chuàng)建。當然在此之前,我們要比較熟悉service的一些基本知識。
對于新東西我覺得都可以從,做什么,怎么做兩方面下手。
IntentService做什么
做什么也就是應用場景,首先Service的初衷是用來做一些無需ui交互的耗時操作,但是由于Service也是寄存于主線程,所以我們還是要另開線程,另外由于遠程Service與activity脫離,我們對于Service的關(guān)閉也要在代碼中處理,而IntentService的出現(xiàn),很好的解決了這兩個問題。
IntentService怎么做
首先我們看看怎樣使用IntentService
1.我們要先繼承IntentService,實現(xiàn)他的默認函數(shù),這里有個坑,我用as自動生成的函數(shù)是帶參數(shù)的,無法運行起來
正確的打開方式
public DemoIntentService(){
super("com.leo.demoplantform.demointentservice");
}
錯誤的打開方式
/**
* Creates an IntentService. Invoked by your subclass's constructor.
* * @param name Used to name the worker thread, important only for debugging.
*/
public DemoIntentService(String name) {
super(name);
}
2.然后就是IntentService的處理函數(shù),在這邊判斷你開啟的任務類型,執(zhí)行相應的任務
@Overrideprotected void onHandleIntent(Intent intent) {
String fromAct = intent.getStringExtra(Constants.INTENT_SERVICE_TAG);
if (!TextUtils.isEmpty(fromAct)) {
LogUtil.i("--------", "From Activity" + fromAct);
excuteTask(fromAct);
}
}
private void excuteTask(final String fromAct) {
try {
Thread.sleep(1000);
LogUtil.i("--------", fromAct + " taask finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
接下來我們看看IntentService的源碼層怎么實現(xiàn)的
我們知道IntentService解決了重開線程以及托管的問題,我們就從這兩個地方下手
- 線程問題
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);
}
}
內(nèi)部實現(xiàn)了一個Handler,在onCreat里面綁定了一個線程,因為onCreate只會走一次,也就確保了這個handler的唯一性(不懂的可以看看我寫的handler源碼解析)

其實我們不斷開啟同一個IntentService的過程其實就是走
onStartCommand版本較早應該是onStart,為了保證兼容性

這里面,不斷往handler發(fā)消息,而前面我們發(fā)的就是處理函數(shù),每當處理完一個任務,就調(diào)用* stopSelf(msg.arg1) *保證了該任務的關(guān)閉
這邊解析比較淺顯,其實實質(zhì)就是一個handler,自己也可以實現(xiàn),是不是有帶你想打我,講這么多廢話,就最后兩句核心.