一、什么是Service?
Service是安卓的服務類,是一種沒有界面的工具類,可以長時間在后臺運行,用來執(zhí)行一些不需要界面但需要在長時間執(zhí)行的任務,比如:音樂播放和地圖導航,網(wǎng)絡下載等。
此章節(jié)沒有太多代碼好貼,去官方找了些概念性的東西。
二、Service的運行邏輯
服務可由其他應用組件啟動,一般有兩種形式:啟動和綁定
startService(intent);
stopService(intent);
- 啟動:當應用組件(如 Activity)通過調(diào)用 startService() 啟動服務時,服務即處于“啟動”狀態(tài)。一旦啟動,服務即可在后臺無限期運行,即使啟動服務的組件已被銷毀也不受影響。 已啟動的服務通常是執(zhí)行單一操作,而且不會將結(jié)果返回給調(diào)用方。例如,它可能通過網(wǎng)絡下載或上傳文件。 操作完成后,服務會自行停止運行。
ServiceConnection conn = new ServiceConnection() {
//服務連接時調(diào)用
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
service = ((MyBinderService.MyBinder)iBinder).getService();
}
//服務被異常中斷時調(diào)用
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
bindService(intent,conn, Service.BIND_AUTO_CREATE);
unbindService(conn);
- 綁定:當應用組件通過調(diào)用 bindService() 綁定到服務時,服務即處于“綁定”狀態(tài)。綁定服務提供了一個客戶端-服務器接口,允許組件與服務進行交互、發(fā)送請求、獲取結(jié)果,甚至是利用進程間通信 (IPC) 跨進程執(zhí)行這些操作。 僅當與另一個應用組件綁定時,綁定服務才會運行。 多個組件可以同時綁定到該服務,但全部取消綁定后,該服務即會被銷毀。
服務可以同時以這兩種方式運行,也就是說,它既可以是啟動服務(以無限期運行),也允許綁定。問題只是在于您是否實現(xiàn)了一組回調(diào)方法:onStartCommand()(允許組件啟動服務)和 onBind()(允許綁定服務)。
無論應用是處于啟動狀態(tài)還是綁定狀態(tài),抑或處于啟動并且綁定狀態(tài),任何應用組件均可像使用活動那樣通過調(diào)用 Intent 來使用服務(即使此服務來自另一應用)。 不過,您可以通過清單文件將服務聲明為私有服務,并阻止其他應用訪問。 使用清單文件聲明服務部分將對此做更詳盡的闡述。
PS:服務在其托管進程的主線程中運行,它既不創(chuàng)建自己的線程,也不在單獨的進程中運行(除非另行指定)。 這意味著,如果服務將執(zhí)行任何 CPU 密集型工作或阻止性操作(例如 MP3 播放或聯(lián)網(wǎng)),則應在服務內(nèi)創(chuàng)建新線程來完成這項工作。通過使用單獨的線程,可以降低發(fā)生“應用無響應”(ANR) 錯誤的風險,而應用的主線程仍可繼續(xù)專注于運行用戶與 Activity 之間的交互。
三、服務的生命周期
服務生命周期(從創(chuàng)建到銷毀)可以遵循兩條不同的路徑:
啟動服務
該服務在其他組件調(diào)用 startService() 時創(chuàng)建,然后無限期運行,且必須通過調(diào)用 stopSelf() 來自行停止運行。此外,其他組件也可以通過調(diào)用 stopService() 來停止服務。服務停止后,系統(tǒng)會將其銷毀。綁定服務
該服務在另一個組件(客戶端)調(diào)用 bindService() 時創(chuàng)建。然后,客戶端通過 IBinder 接口與服務進行通信。客戶端可以通過調(diào)用 unbindService() 關(guān)閉連接。多個客戶端可以綁定到相同服務,而且當所有綁定全部取消后,系統(tǒng)即會銷毀該服務。 (服務不必自行停止運行。)
這兩條路徑并非完全獨立。也就是說,您可以綁定到已經(jīng)使用 startService() 啟動的服務。例如,可以通過使用 Intent(標識要播放的音樂)調(diào)用 startService() 來啟動后臺音樂服務。隨后,可能在用戶需要稍加控制播放器或獲取有關(guān)當前播放歌曲的信息時,Activity 可以通過調(diào)用 bindService() 綁定到服務。在這種情況下,除非所有客戶端均取消綁定,否則 stopService() 或 stopSelf() 不會真正停止服務。
官方生命周期圖
通過實現(xiàn)這些方法,您可以監(jiān)控服務生命周期的兩個嵌套循環(huán):
服務的整個生命周期從調(diào)用 onCreate() 開始起,到 onDestroy() 返回時結(jié)束。與 Activity 類似,服務也在 onCreate() 中完成初始設置,并在 onDestroy() 中釋放所有剩余資源。例如,音樂播放服務可以在 onCreate() 中創(chuàng)建用于播放音樂的線程,然后在 onDestroy() 中停止該線程。
無論服務是通過 startService() 還是 bindService() 創(chuàng)建,都會為所有服務調(diào)用 onCreate() 和 onDestroy() 方法。服務的有效生命周期從調(diào)用 onStartCommand() 或 onBind() 方法開始。每種方法均有 Intent 對象,該對象分別傳遞到 startService() 或 bindService()。
對于啟動服務,有效生命周期與整個生命周期同時結(jié)束(即便是在 onStartCommand() 返回之后,服務仍然處于活動狀態(tài))。對于綁定服務,有效生命周期在 onUnbind() 返回時結(jié)束。
Ps:盡管啟動服務是通過調(diào)用 stopSelf() 或 stopService() 來停止,但是該服務并無相應的回調(diào)(沒有 onStop() 回調(diào))。因此,除非服務綁定到客戶端,否則在服務停止時,系統(tǒng)會將其銷毀—onDestroy() 是接收到的唯一回調(diào)。