簡體   English   中英

Android平台中的Service vs IntentService

[英]Service vs IntentService in the Android platform

我正在尋找一個可以用IntentService完成而不能用Service完成的事情的例子(反之亦然)?

我也相信IntentService在不同的線程中運行,而Service則沒有。 因此,據我所知,在自己的線程中啟動服務就像啟動IntentService 那是對的嗎?

Tejas Lagvankar 寫了一篇關於這個主題的好文章 以下是 Service 和 IntentService 之間的一些主要區別。

什么時候使用?

  • Service可以在沒有 UI 的任務中使用,但不應太長。 如果需要執行長時間的任務,則必須在 Service 中使用線程。

  • IntentService可用於通常不與主線程通信的長任務。 如果需要通信,可以使用主線程處理程序或廣播意圖。 另一種使用情況是需要回調(意圖觸發的任務)。

如何觸發?

  • 服務是通過調用方法startService()觸發的。

  • IntentService使用 Intent 觸發,它產生一個新的工作線程,並在該線程上調用onHandleIntent()方法。

觸發自

  • ServiceIntentService可以從任何線程、活動或其他應用程序組件觸發。

運行

  • 服務在后台運行,但它在應用程序的主線程上運行。

  • IntentService在單獨的工作線程上運行。

限制/缺點

  • 服務可能會阻塞應用程序的主線程。

  • IntentService不能並行運行任務。 因此,所有連續的意圖都將進入工作線程的消息隊列,並按順序執行。

什么時候停止?

  • 如果您實現了Service ,則您有責任在服務完成后通過調用stopSelf()stopService()來停止該服務。 (如果只想提供綁定,則不需要實現此方法)。

  • IntentService在處理所有啟動請求后停止服務,因此您永遠不必調用stopSelf()

如果有人可以向我展示一個可以使用IntentService完成而無法使用Service完成的示例, IntentService

根據定義,這是不可能的。 IntentServiceService的子類,用 Java 編寫。 因此,通過包含IntentService使用的相關代碼位, IntentService所做的任何事情, Service都可以做。

使用自己的線程啟動服務就像啟動一個 IntentService。 不是嗎?

IntentService的三個主要特性是:

  • 后台線程

  • 傳遞給onStartCommand()Intent的自動排隊,因此如果后台線程上的onHandleIntent()正在處理一個Intent ,則其他命令將排隊等待輪到它們

  • 一旦隊列為空,通過調用stopSelf()自動關閉IntentService

任何和所有這些都可以由Service實現,而無需擴展IntentService

服務

  • 通過startService()調用
  • 從任何Thread觸發
  • Main Thread上運行
  • 可能會阻塞主 (UI) 線程。 始終在服務中使用線程來完成長期任務
  • 一旦任務完成,我們有責任通過調用stopSelf()stopService()來停止服務

意圖服務

  • 它執行長任務,通常不與主線程通信,如果需要通信,則由HandlerBroadcastReceiver
  • 通過Intent調用
  • Main Thread觸發
  • 在單獨的線程上運行
  • 無法並行運行任務,並且多個意圖在同一個工作線程上排隊。

不要重新發明輪子

IntentService擴展了Service類,這顯然意味着IntentService是為相同目的而有意制作的。

那么目的是什么?

`IntentService 的目的是讓我們的工作更容易運行后台任務,甚至不用擔心

  • 工作線程的創建

  • 一一排隊處理多請求( Threading

  • 銷毀Service

所以NOService可以完成IntentService可以完成的任何任務。 如果您的需求符合上述標准,那么您不必在Service類中編寫這些邏輯。 所以不要重新發明輪子,因為IntentService是發明的輪子。

“主要”區別

Service 在 UI 線程上運行,而 IntentService 在單獨的線程上運行

你什么時候使用 IntentService?

當您想要一個一個地執行多個存在於 Activity 范圍之外的后台任務時,那么IntentService是完美的。

IntentService如何由Service

一個普通的服務在 UI 線程上運行(默認情況下,任何 Android 組件類型都在 UI 線程上運行,例如ActivityBroadcastReceiverContentProviderService )。 如果您必須做一些可能需要一段時間才能完成的工作,那么您必須創建一個線程。 在多個請求的情況下,您將不得不處理synchronization IntentService提供了一些默認實現,可以為您完成這些任務。
根據開發者頁面

  1. IntentService創建一個工作線程

  2. IntentService創建一個工作隊列,將請求onHandleIntent()發送到onHandleIntent()方法

  3. 當沒有工作時IntentService調用stopSelf()方法
  4. onBind()方法提供默認實現, onBind()方法為 null
  5. onStartCommand()默認實現, onStartCommand() Intent請求發送到 WorkQueue 並最終發送到onHandleIntent()

為接受的答案添加分數:

查看 Android API 中 IntentService 的用法。 例如:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

要為您的應用程序創建 IntentService 組件,請定義一個擴展 IntentService 的類,並在其中定義一個覆蓋 onHandleIntent() 的方法。

另外,請參閱 IntentService 的源代碼,它的構造函數和生命周期方法,如 onStartCommand ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

將 AsyncTask 服務在一起是許多負載不大的用例的最佳方法之一。 或者只是創建一個擴展 IntentSerivce 的類。 從 Android 4.0 版本開始,所有網絡操作都應該在后台進程中,否則應用程序編譯/構建失敗。 將線程與 UI 分開。 AsyncTask 類提供了從 UI 線程觸發新任務的最簡單方法之一。 有關此主題的更多討論,請參閱博客文章

來自Android 開發者指南

IntentService 是按需處理異步請求(表示為 Intent)的服務的基類。 客戶端通過 startService(Intent) 調用發送請求; 該服務根據需要啟動,依次使用工作線程處理每個 Intent,並在工作用完時自行停止。

IntentService 中使用的設計模式

:這種“工作隊列處理器”模式通常用於從應用程序的主線程卸載任務。 IntentService 類的存在是為了簡化這種模式並處理機制。 要使用它,請擴展 IntentService 並實現 onHandleIntent(Intent)。 IntentService 將接收 Intent,啟動一個工作線程,並根據需要停止服務。

所有請求都在一個工作線程上處理——它們可能需要盡可能長的時間(並且不會阻塞應用程序的主循環),但一次只會處理一個請求。

IntentService 類為在單個后台線程上運行操作提供了一個簡單的結構。 這允許它處理長時間運行的操作,而不會影響用戶界面的響應能力。 此外,IntentService 不受大多數​​用戶界面生命周期事件的影響,因此它會在會關閉 AsyncTask 的情況下繼續運行。

IntentService 有一些限制:

它不能直接與您的用戶界面交互。 要將其結果放在 UI 中,您必須將它們發送到 Activity。 工作請求按順序運行。 如果一個操作正在 IntentService 中運行,並且您向它發送另一個請求,則該請求將一直等到第一個操作完成。 在 IntentService 上運行的操作不能被中斷。 然而,在大多數情況下

IntentService 是簡單后台操作的首選方式

**

凌空圖書館

有一個名為volley-library 的庫,用於開發 android 網絡應用程序,源代碼在 GitHub 中向公眾提供。

后台作業最佳實踐的 android 官方文檔:有助於更好地理解意圖服務、線程、處理程序、服務。 以及執行網絡操作

我相信您可以通過簡單地在谷歌上搜索諸如“Android IntentService vs Service”之類的內容來找到廣泛的差異列表

每個示例更重要的區別之一是 IntentService 在完成后自行結束。

一些例子(快速編造)可能是;

IntentService:如果您想在打開應用程序開始時下載一堆圖像。 這是一個一次性過程,可以在下載所有內容后自行清理。

服務:將不斷用於通過 Web API 調用在您的應用程序和后端之間進行通信的服務。 即使它完成了當前的任務,您仍然希望它在幾分鍾后出現,以便進行更多的交流。

意圖服務

IntentService在它自己的線程上運行。 完成后它會自行停止。 更像是火與遺忘。 后續呼叫將排隊。 適合排隊呼叫。 如果需要,您還可以在IntentService旋轉多個線程 - 您可以使用ThreadPoolExecutor實現這一點。 我這么說是因為很多人問我“為什么要使用IntentService因為它不支持並行執行”。 IntentService只是一個線程。 您可以在其中執行任何您需要的操作 - 甚至可以旋轉多個線程。 唯一的警告是IntentService在您旋轉這些多個線程后IntentService完成。 它不會等待那些線程回來。 你需要注意這一點。 所以我建議在這些場景中使用ThreadPoolExecutor

  • 適合同步、上傳等……

服務

默認Service在主線程上運行。 你需要旋轉一個工作線程來完成你的工作。 您需要明確停止service 我將它用於需要在后台運行內容的情況,即使您離開應用程序並返回更多無頭service

  • 如果需要,您可以再次運行多個線程。
  • 可用於音樂播放器等應用。

如果需要,您始終可以使用BroadcastReceivers與您的活動進行通信。

IntentService 是 Service 的擴展,用於簡化需要在后台和單獨線程中執行的任務的執行。

IntentService 啟動,創建一個線程並在線程中運行它的任務。 完成后,它會清理所有內容。 只有一個 IntentService 實例可以同時運行,多個調用被排隊。

它使用起來非常簡單,而且對於很多用途來說都非常方便,例如下載東西。 但它有一些限制,可能會讓您想要使用更基本(不簡單)的服務。

例如,連接到 xmpp 服務器並由活動綁定的服務不能簡單地使用 IntentService 完成。 你最終會忽略或覆蓋 IntentService 的東西。

如果有人可以向我展示一個您可以使用IntentService完成而無法使用service完成的示例, IntentService

IntentService不能用於長時間監聽,就像 XMPP 監聽器一樣,它是一個單一的時間操作符,完成工作並揮手告別。

它也只有一個線程工作者,但是通過一個技巧,您可以無限地使用它。

Android IntentService 與服務

1.服務

  • 使用 startService() 調用服務。
  • 可以從任何線程調用 Service。
  • 默認情況下,服務在應用程序的主線程上運行后台操作。 因此它可以阻止您的應用程序的 UI。
  • 多次調用的服務會創建多個實例。
  • 需要使用 stopSelf() 或 stopService() 停止服務。
  • Android 服務可以並行運行。

2. 意向服務

  • 使用 Intent 調用 IntentService。
  • IntentService 只能從主線程調用。
  • IntentService 創建一個單獨的工作線程來運行后台操作。
  • 多次調用的 IntentService 不會創建多個實例。
  • IntentService 在隊列完成后自動停止。 無需觸發 stopService() 或 stopSelf()。
  • 在 IntentService 中,多個 Intent 調用會自動排隊並按順序執行。
  • IntentService 不能像服務一樣運行並行操作。

這里參考

ServiceIntentService的主要區別描述如下:

服務 :

1.A Service默認運行在應用程序的主線程上。(這里沒有默認的工作線程可用)。因此用戶需要創建一個單獨的線程並在該線程中完成所需的工作。

2.一次允許多個請求。(多線程)

意圖服務:

1.現在,來到IntentService ,這里有一個默認的工作線程可以執行任何操作。 請注意- 您需要實現onHandleIntent()方法,該方法接收每個啟動請求的意圖,您可以在其中執行后台工作。

2.但它一次只允許一個請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM