Android學習筆記15—Services(1)

Service是一種運行在後臺進行長時間工作的應用程序組件,並且它沒有任何用戶界面。另一個應用程序組件能開啓一個Service,並且它會繼續運行在後臺即使用戶轉換到另一個應用程序。另外要說的是,一個應用程序組件能夠綁定一個Service並且和它進行交互,甚至進行進程間的通信。例如,一個Service可能在後臺操作網絡事務,播放音樂,進行文件的I/O操作,和一個Content Provider進行交互等後臺事務。

一個Service可以進行兩種操作:StartedBound

Started:當一個應用程序組件調用startService()方法啓動這個service,那麼這個Service就開啓了。一旦這個Service開啓,那麼這個Service就會就會立即運行在後臺,即使這個組件被銷燬掉。通常情況下,一個被開啓的Service表現的是一個單獨的操作並且不會給調用者返回一個結果。

Bound:當一個應用程序組件調用bindService()方法綁定一個Service時,那麼這個Service就被綁定了。一個Bound Service提供了一套客戶端——服務器接口,這個接口允許組件和這個Service進行通信、發送請求、獲取結果、甚至用進程間通信(IPC)進行跨進程操作。一個Bind Service和綁定它的其他組件具有相同的存活時間,也就是說當一次性有多個組件綁定這個Service的時候,只有當所有組件與這個Service解綁的時候這個Service纔會被銷燬。

儘管以上講述了這兩種方式的區別,但是一個Service這兩種方式都可以使用,只是在我們定義一個Service的時候,是否實現onStartCommand()或者onBind()方法的問題。

然而,不論你的應用程序的Service是被started或者被bind,甚至是這兩種都有的,任何應用程序組件都能通過Intent對象使用你的Service(甚至是不同的應用程序)。但是我們也可以在Manifest文件中定義我們的Service的私有化(android:exported = false),不允許其他應用程序的組件訪問我們的Service。

如何定義一個Service?

爲了創建一個Service,我們首先需要定義一個Service的子類,這個子類需要實現Service幾個回調方法,以下是最重要的幾種需要實現的回調函數:

onStartCommand():當另一個應用程序組件通過startService方法請求這個Service被開啓的時候,系統調用這個方法。一旦這個方法被執行的時候,這個Service就會被開啓並且立即在後臺運行。如果你實現這個方法的時候,當這個Service完成它的任務的時候,你必須調用stopSelf()和stopService()方法來停止這個Service。(如果我們想要使用bind,我們不需要實現這個方法。)

onBind():當兩一個應用程序組件想要通過bindService()綁定這個Service的時候,系統調用這個方法。在這個方法的實現中,你必須提供一個客戶端用來和這個Service通信的接口,這個接口返回一個IBinder。你必須總是實現這個方法,但是如果我們不允許這個Service被綁定,我們應該返回null。

onCreate():當這個Service第一次被調用的時候系統調用這個方法,在這個方法之後系統調用onStartCommond或者onBind。如果這個Service方法是運行狀態,那麼這個方法不被調用。

onDestroy():當一個Service不再被用並且要被銷燬的時候調用這個方法。你的應用程序應該實現這個方法去回收資源,例如線程、註冊的監聽器、reciever等,這個方法這個Service調用的最後一個方法。


如果一個組件調用startService方法啓動一個Service,那麼將會調用這個service的onStartCommond方法,這個service會一直運行着,直到這個service自己調用stopself方法或者另一個組件調用stopService方法停止它。

Android系統僅僅在低內存的情況下才會強制停止service,它必須爲獲取到用戶焦點的Activity回收資源。但是如果一個Service綁定到一個已經獲取到焦點的Activity,那麼它將要不太可能被殺死,並且如果一個Service被定義運行在前臺,那麼它將要從不會被殺死。然而,如果一個Service被啓動並且長時間工作,那麼系統將會降低他在後臺任務列表中的位置,並且這個Service就會變得更加可能被殺死。

發佈了43 篇原創文章 · 獲贊 25 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章