IntentService源碼解析

上套路,說廢話。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解決了重開線程以及托管的問題,我們就從這兩個地方下手

  1. 線程問題
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源碼解析

onCreate函數(shù)實現(xiàn)

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

onStart,onStartCommand

這里面,不斷往handler發(fā)消息,而前面我們發(fā)的就是處理函數(shù),每當處理完一個任務,就調(diào)用* stopSelf(msg.arg1) *保證了該任務的關(guān)閉

這邊解析比較淺顯,其實實質(zhì)就是一個handler,自己也可以實現(xiàn),是不是有帶你想打我,講這么多廢話,就最后兩句核心.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容