Android Service詳解(三)---IntentService

Android Service詳解(三)---IntentService

這是第三篇文章主要講的是IntentService的使用

一、Service的耗時操作如何解決呢?

不管是何種Service,它默認都是在應用程序的主線程(亦即UI線程)中運行的。所以,如果你的Service將要運行非常耗時或者可能被阻塞的操作時,你的應用程序將會被掛起,甚至會出現ANR錯誤。爲了避免這一問題,你應該在Service中重新啓動一個新的線程來進行這些操作。現有兩種方法大家參考:

① 直接在Service的onStartCommand()方法中新建一個線程來執行;

② Android SDK 中爲我們提供了一個現成的Service類來實現這個功能,它就是IntentService,它主要負責以下幾個方面:
Creates a default worker thread that executes all intents delivered to onStartCommand() separate from your application's main thread.
    生成一個默認的且與主線程互相獨立的工作者線程來執行所有傳送至 onStartCommand() 方法的Intetnt
Creates a work queue that passes one intent at a time to your onHandleIntent() implementation, so you never have to worry about multi-threading.
    生成一個工作隊列來傳送Intent對象給你的onHandleIntent()方法,同一時刻只傳送一個Intent對象,這樣一來,你就不必擔心多線程的問題。
Stops the service after all start requests have been handled, so you never have to call stopSelf().
    在所有的請求(Intent)都被執行完以後會自動停止服務,所以,你不需要自己去調用stopSelf()方法來停止該服務
Provides default implementation of onBind() that returns null.
    提供了一個onBind()方法的默認實現,它返回null
Provides a default implementation of onStartCommand() that sends the intent to the work queue and then to your onHandleIntent() implementation
    提供了一個onStartCommand()方法的默認實現,它將Intent先傳送至工作隊列,然後從工作隊列中每次取出一個傳送至onHandleIntent()方法,在該方法中對Intent對相應的處理
;

思路就是
IntentService使用隊列的方式將請求的Intent加入隊列,然後開啓一個worker thread(線程)來處理隊列中的Intent,對於異步的startService請求,IntentService會處理完成一個之後再處理第二個,每一個請求都會在一個單獨的worker thread中處理,不會阻塞應用程序的主線程。
這裏就給我們提供了一個思路,如果有耗時的操作可以在Service裏面開啓新線程,也可以使用IntentService來處理耗時操作。 但你若是想在Service中讓多個線程併發的話,就得使用第一種方法,在Service內部起多個線程,但是這樣的話,你可要處理好線程的同步。
也就是說,如果只是需要有一個線程的話那麼我們使用IntentService是很方便的,如果需要處理多個線程併發的話那隻能使用第一種方法。第一種方法寫在我的上篇博客當中Android Service詳解(一)---概述和StartService

二、如何創建一個IntentService呢?

1.還是以Android Studio爲環境,非常的方便

可以將這個勾選取消


這樣會自動生成一個IntentService,但是你發現整個代碼很亂,你可以把這些去掉只留下關鍵的方法就可以,我只留下了構造方法和onHandleIntent方法。
2.修改代碼,在onHandleIntent方法種實現業務方法,例如
<span style="font-size:18px;">@Override
protected void onHandleIntent(Intent intent) {
    Log.e(TAG, intent.getStringExtra("info"));
Intent intent = new Intent(this, MyIntentService.class);
intent.putExtra("info", "傳遞數據");
startService(intent);


    for(int i = 0;i<20;i++){
        Log.e(TAG, "onHandleIntent-" + i);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}</span>
3.在Mainactivity種修改
<span style="font-size:18px;">Intent intent = new Intent(this, MyIntentService.class);
intent.putExtra("info", "傳遞數據");
startService(intent);</span>
4.當IntentService全部執行完後將自動停止


可以看出在啓動這個intentService後再次點擊則會在上個耗時操作完成後繼續執行(隊列的方式),並且在所有操作執行後自動銷燬。並且不會阻塞主線程
通常使用該IntentService完成本App內部的耗時操作

至此IntentService的基本使用方法就結束了十分的簡單實用
那麼最後附上:源碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章