天天看點

Service的子類IntentService(三)

1、簡介

它使用工作線程逐一處理所有啟動請求。如果不要求服務同時處理多個請求,這是最好的選擇。隻需實作 onHandleIntent() 方法即可,該方法會接收每個啟動請求的 Intent,一個一個的在背景執行。
           

2、IntentService與Service之間的不同

1)Service要處理耗時操作需要自己啟動一個工作線程,如果啟動了多個工作線程來處理相關事務的話,給線程之間不能很好的控制;而IntentService将多個異步的請求的Intent放到隊列中,封裝了一個開啟工作線程的onHandleIntent()方法,來依次處理放入隊列中的Intent,隻有一個完成才會處理下一個。

2)Service可以通過開啟和綁定兩種方式開啟,但是IntentService隻能通過開啟服務的方式來開啟。

3)Service适合多個線程處理異步請求,IntentService适合排隊的異步請求。

3、IntentService的實作步驟

1)建立預設的工作線程,用于在應用的主線程外執行傳遞給 onStartCommand() 的所有 Intent。

2)建立工作隊列,用于将一個 Intent 逐一傳遞給 onHandleIntent() 實作,這樣您就永遠不必擔心多線程問題。

3)在處理完所有啟動請求後停止服務,是以您永遠不必調用 stopSelf()。 提供 onBind() 的預設實作(傳回 null)。

4)提供 onStartCommand() 的預設實作,可将 Intent 依次發送到工作隊列和 onHandleIntent() 實作。

綜上所述,您隻需實作 onHandleIntent() 來完成用戶端提供的工作即可。(不過,您還需要為服務提供小型構造函數。)

public class HelloIntentService extends IntentService {

  public HelloIntentService() {
      super("HelloIntentService");
  }

  @Override
  protected void onHandleIntent(Intent intent) {
      // 在這裡做耗時操作
      long endTime = System.currentTimeMillis() + *;
      while (System.currentTimeMillis() < endTime) {
          synchronized (this) {
              try {
                  wait(endTime - System.currentTimeMillis());
              } catch (Exception e) {
              }
          }
      }
  }
}
           

需要注意:如果還重寫其他回調方法(如 onCreate()、onStartCommand() 或 onDestroy()),要確定調用超類實作,以便 IntentService 能夠妥善處理工作線程的生命周期。

更多了解看API