2017-06-03 66 views
0

有人可以幫助我瞭解如何正確使用Android服務或IntentService。文檔似乎本身在這裏反駁:如何使用Android服務或ServiceIntent

Caution: A service runs in the same process as the application in which it is 
declared and in the main thread of that application by default. If your service 
performs intensive or blocking operations while the user interacts with an 
activity from the same application, the service slows down activity performance. 
To avoid impacting application performance, start a new thread inside the service. 

這裏

public class HelloIntentService extends IntentService { 

    /** 
    * A constructor is required, and must call the super IntentService(String) 
    * constructor with a name for the worker thread. 
    */ 
    public HelloIntentService() { 
     super("HelloIntentService"); 
    } 

    /** 
    * The IntentService calls this method from the default worker thread with 
    * the intent that started the service. When this method returns, IntentService 
    * stops the service, as appropriate. 
    */ 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     // Normally we would do some work here, like download a file. 
     // For our sample, we just sleep for 5 seconds. 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      // Restore interrupt status. 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

考慮到服務的整個目的或ServiceIntent是運行長在後臺運行的作業,而不影響UI那麼爲什麼在示例代碼完成的注意事項表明你不應該這樣做 - 我假設調用Thread.sleep()將導致主線程阻塞。

難道我的理解如下更正:

  1. 服務本身仍然運行在主應用程序線程,但沒有UI組件(活動),並會繼續即使應用程序沒有被用戶運行不像的活性,這不會
  2. 任何長期運行的後臺工作仍必須創建一個單獨的線程來避免阻塞主應用程序線程
  3. 的AsyncTask被與活動相關聯這大概會停止運行,如果應用程序沒有時間r活動應用程序(即如果用戶切換到另一個應用程序),這就是爲什麼如果任務需要繼續運行,可以使用Service或ServiceIntent。
  4. IntentService將在單獨的線程上將任務運行到主線程,因此不需要擔心用長任務或調用Thread.sleep()時阻塞主線程。

有我誤解與Android服務或ServiceIntents的說明些什麼呢?

回答

0

您的第一條評論來自於有關服務的文檔

Android中沒有任何名字爲ServiceIntent。你的代碼片段是IntentService

在Java中,我們有類和繼承。 Service是所有服務繼承的基類。 IntentService延伸Service

如果您致電startService(),指向您直接從Service繼承的您的一類,則需要自行實施後臺線程,因爲Service不會爲您執行此操作。

但是,如果你打電話startService(),指着一個類你的,從IntentService繼承,那麼你將得到通過IntentService自動爲您創建一個後臺線程。這是IntentService添加的代碼,超出Service的規定。

我假設調用Thread.sleep()會導致主線程阻塞。

不,因爲在提供IntentService的後臺線程上調用onHandleIntent()

服務本身仍然運行在主應用程序線程

號在Java中,對象不上線運行。方法在線程上運行。

任何長期運行的後臺工作仍必須創建一個單獨的線程,以避免阻塞主應用程序線程

任何長期運行的後臺工作需要在後臺線程上執行。無論這是您創建的線程(例如,在Service的直接子類中)還是它是提供給您的線程(例如,在IntentService的直接子類中)都不相同。

的AsyncTask與某活動可能會停止運行,如果應用程序不再是活動的應用程序

服務的主要作用是告訴Android的,我們正在做的工作背景相關聯應該會持續一段時間,即使應用的用戶界面移至背景。這是因爲Android最終會終止您的流程,爲其他應用程序釋放系統內存。

使用服務將使您的流程保持一段時間。一個AsyncTask或一個裸的Thread不會這樣做。當應用程序的UI移動到後臺,你的進程沒有結束立即,但它可能很快會結束,所以如果你想更好地保證你的工作將得到完成,您可以使用服務來管理這項工作。

+0

太棒了 - 非常感謝我需要確認 - 您應該幫助編寫文檔。 –

+0

@DuncanGroenewald:對不起。你必須解決[書](https://commonsware.com/Android)。 :-) – CommonsWare