[英]Service vs IntentService in the Android platform
我正在尋找一個可以用IntentService
完成而不能用Service
完成的事情的例子(反之亦然)?
我也相信IntentService
在不同的線程中運行,而Service
則沒有。 因此,據我所知,在自己的線程中啟動服務就像啟動IntentService
。 那是對的嗎?
Tejas Lagvankar 寫了一篇關於這個主題的好文章。 以下是 Service 和 IntentService 之間的一些主要區別。
什么時候使用?
Service可以在沒有 UI 的任務中使用,但不應太長。 如果需要執行長時間的任務,則必須在 Service 中使用線程。
IntentService可用於通常不與主線程通信的長任務。 如果需要通信,可以使用主線程處理程序或廣播意圖。 另一種使用情況是需要回調(意圖觸發的任務)。
如何觸發?
該服務是通過調用方法startService()
觸發的。
IntentService使用 Intent 觸發,它產生一個新的工作線程,並在該線程上調用onHandleIntent()
方法。
觸發自
運行
該服務在后台運行,但它在應用程序的主線程上運行。
IntentService在單獨的工作線程上運行。
限制/缺點
服務可能會阻塞應用程序的主線程。
IntentService不能並行運行任務。 因此,所有連續的意圖都將進入工作線程的消息隊列,並按順序執行。
什么時候停止?
如果您實現了Service ,則您有責任在服務完成后通過調用stopSelf()
或stopService()
來停止該服務。 (如果只想提供綁定,則不需要實現此方法)。
IntentService在處理完所有啟動請求后停止服務,因此您永遠不必調用stopSelf()
。
如果有人可以向我展示一個可以使用
IntentService
完成而無法使用Service
完成的示例,IntentService
。
根據定義,這是不可能的。 IntentService
是Service
的子類,用 Java 編寫。 因此,通過包含IntentService
使用的相關代碼位, IntentService
所做的任何事情, Service
都可以做。
使用自己的線程啟動服務就像啟動一個 IntentService。 不是嗎?
IntentService
的三個主要特性是:
后台線程
傳遞給onStartCommand()
的Intent
的自動排隊,因此如果后台線程上的onHandleIntent()
正在處理一個Intent
,則其他命令將排隊等待輪到它們
一旦隊列為空,通過調用stopSelf()
自動關閉IntentService
任何和所有這些都可以由Service
實現,而無需擴展IntentService
。
服務
startService()
調用Thread
觸發Main Thread
上運行stopSelf()
或stopService()
來停止服務意圖服務
Handler
或BroadcastReceiver
Intent
調用Main Thread
觸發 IntentService擴展了Service類,這顯然意味着IntentService
是為相同目的而有意制作的。
那么目的是什么?
`IntentService 的目的是讓我們的工作更容易運行后台任務,甚至不用擔心
工作線程的創建
一一排隊處理多請求( Threading
)
Service
所以NO , Service
可以完成IntentService
可以完成的任何任務。 如果您的需求符合上述標准,那么您不必在Service
類中編寫這些邏輯。 所以不要重新發明輪子,因為IntentService
是發明的輪子。
Service 在 UI 線程上運行,而 IntentService 在單獨的線程上運行
當您想要一個一個地執行多個存在於 Activity 范圍之外的后台任務時,那么IntentService
是完美的。
IntentService
如何由Service
一個普通的服務在 UI 線程上運行(默認情況下,任何 Android 組件類型都在 UI 線程上運行,例如Activity
、 BroadcastReceiver
、 ContentProvider
和Service
)。 如果您必須做一些可能需要一段時間才能完成的工作,那么您必須創建一個線程。 在多個請求的情況下,您將不得不處理synchronization
。 IntentService
提供了一些默認實現,可以為您完成這些任務。
根據開發者頁面
IntentService
創建一個工作線程
IntentService
創建一個工作隊列,將請求onHandleIntent()
發送到onHandleIntent()
方法
IntentService
調用stopSelf()
方法onBind()
方法提供默認實現, onBind()
方法為 nullonStartCommand()
默認實現, 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 線程觸發新任務的最簡單方法之一。 有關此主題的更多討論,請參閱博客文章
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 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.服務
2. 意向服務
從這里參考
Service
和IntentService
的主要區別描述如下:
服務 :
1.A Service
默認運行在應用程序的主線程上。(這里沒有默認的工作線程可用)。因此用戶需要創建一個單獨的線程並在該線程中完成所需的工作。
2.一次允許多個請求。(多線程)
意圖服務:
1.現在,來到IntentService
,這里有一個默認的工作線程可以執行任何操作。 請注意- 您需要實現onHandleIntent()
方法,該方法接收每個啟動請求的意圖,您可以在其中執行后台工作。
2.但它一次只允許一個請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.