1. 程式人生 > >Android Services (後臺服務)

Android Services (後臺服務)

jobs order 長時間 但是 網絡 恢復 pan 自己的 活動

一、簡介

服務是可以在後臺執行長時間運行的應用程序組件,它不提供用戶界面。 另一個應用程序組件可以啟動一個服務,並且即使用戶切換到另一個應用程序,它仍然在後臺運行。 另外,組件可以綁定到一個服務來與它進行交互,甚至執行進程間通信(IPC)。 例如,服務可以從後臺處理網絡交易,播放音樂,執行文件I / O或與內容提供商交互。

這些是三種不同類型的服務:

Scheduled(計劃的服務)--- Android 5.0後可用
當在Android 5.0(API級別21)中引入的諸如JobScheduler之類的API啟動服務時,將安排一項服務。您可以通過註冊作業並指定其網絡和時間要求來使用JobScheduler。然後系統在適當的時候優雅地安排作業執行。 JobScheduler提供許多方法來定義服務執行條件。
註意:如果您的應用定位到Android 5.0(API級別21),Google建議您使用JobScheduler執行後臺服務。有關使用此類的更多信息,請參閱JobScheduler參考文檔。

Started(開始的服務)
當應用程序組件(如活動)調用startService()時,服務將啟動。啟動後,服務可以在後臺無限期運行,即使啟動它的組件被銷毀。通常,啟動服務執行單個操作,並且不會將結果返回給調用者。例如,它可以通過網絡下載或上傳文件。操作完成後,服務應該停止。

Bound(綁定的服務)

當應用程序的組建調用bindService()時,此組件將綁定到服務。一個綁定的服務提供了 client-server 的接口,允許組件與服務之間進行交互,發送請求,接收結果,甚至可以通過進程間通信(IPC)進行交互。只要綁定了另一個應用程序組件,綁定的服務就會運行。多個組件可以同時綁定到服務,但是當所有組件都解除綁定時,服務將被銷毀。

雖然本文通常單獨討論啟動和綁定的服務,但您的服務可以以兩種方式工作 - 它可以啟動(無限期運行)並允許綁定。這只是你是否實現了一些回調方法:onStartCommand()允許組件啟動它,並使用onBind()來允許綁定。

無論您的應用程序是啟動,綁定還是兩者都可以,任何應用程序組件都可以使用該服務(即使是單獨的應用程序)也可以使用任何組件可以使用活動(通過以Intent啟動它)。但是,您可以在清單文件中將服務聲明為私有,並阻止其他應用程序的訪問。具體的設置方法,在下面會說明。

註意:服務運行在主線程中,不會創建自己的線程,並且不會在單獨的進程中運行,除非另有指定。如果您的服務將執行任何CPU密集型工作或阻塞操作(如MP3播放或網絡),則應在服務中創建一個新的線程來完成此工作。通過使用單獨的線程,您可以降低應用程序ANR錯誤的風險,並且應用程序的主線程可以保持專用於與您的活動的用戶交互。

二、API概述

重要的回調方法:

onStartCommand()

當另一個組件請求啟動該服務時,該系統通過調用startService()來調用此方法。當執行此方法時,服務將啟動並可以無限期地在後臺運行。 如果您實現了此功能,則您需要通過調用stopSelf()或stopService()來停止其工作完成。 如果您只想提供綁定,則不需要實現此方法。

onBind()

當另一個組件想要與服務綁定(例如執行RPC)時,系統通過調用bindService()來調用此方法。 在實現此方法時,您必須提供一個客戶端通過返回IBinder與服務進行通信的接口。 您必須始終執行此方法; 但是,如果您不想允許綁定,則應返回null。
onCreate() 當服務最初創建時(在調用onStartCommand()或onBind())之前,系統調用此方法來執行一次性設置過程。 如果服務已經運行,則不會調用此方法。
onDestroy() 當服務不再使用並被銷毀時,系統調用此方法。 您的服務應該實現這一點,以清理任何資源,如線程,註冊的聽眾或接收者。 這是服務接收的最後一個調用。

如果組件通過調用startService()(調用onStartCommand())來啟動服務,則服務將繼續運行,直到它停止自己的stopSelf()或另一個組件通過調用stopService()來停止它。

如果一個組件調用了bindService()來創建服務,並且onStartCommand()不被調用,那麽只要組件被綁定就可以運行這個服務。服務從其所有客戶端解除綁定後,系統會將其破壞。

Android系統會在內存不足的時候強制停止服務,並且必須為具有用戶焦點的Activity恢復系統資源。如果服務被綁定到具有用戶焦點的Activity,則不太可能被殺死;如果服務被聲明在前臺運行,很少會被殺死。如果服務啟動並且長時間運行,系統將隨著時間的推移在後臺任務列表中降低其位置,並且服務變得非常容易被殺死 - 如果您的服務已啟動,則必須設計它以優雅地處理重新啟動系統。如果系統殺死您的服務,它將在資源可用時立即重新啟動,但這也取決於從onStartCommand()返回的值。

Android Services (後臺服務)