1. 程式人生 > >Android多執行緒-----非同步(IntentService)

Android多執行緒-----非同步(IntentService)

一、Service 是什麼

1、大家隨口就能答得上來,Service是一個在後臺執行長時間執行操作而不用提供使用者介面的應用元件,可由其他元件啟動,即使使用者切換到其他應用程式,Service 仍然在後臺繼續執行。

2、service的弊端:
service既不是獨立的程序也不是獨立的執行緒,是依賴於主執行緒的,所以是不建議在service裡面做過多的耗時操作的,避免ANR。

3、Service 有兩種啟動方式,並且它的兩種啟動方式的生命週期是不一樣的。

A)startService方式,注意引數

從Android官方文件中,我們知道onStartCommand有4種返回值:
1、START_STICKY:如果service程序被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent物件。隨後系統會
嘗試重新建立service,由於服務狀態為開始狀態,所以建立服務後一定會呼叫onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那麼引數Intent將為null。
2、START_NOT_STICKY:“非粘性的”。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統不會自動重啟該服務。
那個直到接收新的intent物件,這個服務才會被重新建立。這是最安全的選項,用來避免在不需要的時候執行你的服務。
3、START_REDELIVER_INTENT:重傳Intent。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,
系統會自動重啟該服務,並將Intent的值傳入。
4、START_STICKY_COMPATIBILITY:START_STICKY的相容版本,但不保證服務被kill後一定能重啟。

B)bindService 方式,多個元件可以繫結到同一個服務上,繫結服務的時候,需要提供一個ServiceConnection 介面,在介面回撥中獲取Binder 物件,與服務進行通訊。

二、IntentService是什麼

1、IntentService是繼承Service處理非同步請求的一個類,擁有service的全部生命週期,包含了service的全部特性;
2、它有一個工作執行緒來處理耗時操作,啟動IntentService的方式和啟動傳統的Service一樣
3、同時,當任務執行完後,IntentService會自動停止,而不需要我們手動去控制或stopSelf()。
4、可以啟動IntentService多次,這就會產生多個job,而每一個耗時操作會以工作佇列的方式在IntentService的onHandleIntent回撥方法中執行,並且,每次只會執行一個工作執行緒,執行完第一個再執行第二個,即one-by-one方式

三、IntentService能做什麼

1、舉個例子,檔案下載

    @Override
    protected void onHandleIntent(Intent intent) {
        HttpURLConnection conn = null;
        InputStream is = null;
        String blogUrl = intent.getStringExtra("url");
        String blogName = intent.getStringExtra("name");
        try {
            //下載指定的檔案
            URL url = new URL(blogUrl);
            conn = (HttpURLConnection) url.openConnection();
            if (conn != null) {
                //我們在此處得到所下載文章的輸入流,可以將其以檔案的形式寫入到儲存卡上面或
                //將其讀取出文字顯示在App中
                is = conn.getInputStream();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }

2、Application裡初始化三方控制元件等