在 AS 中新建服務(wù)時(shí),Exported 屬性表示是否允許除了當(dāng)前程序之外的其他程序訪問這個(gè)服務(wù),Enabled 屬性表示是否啟用這個(gè)服務(wù)。
onStartCommand 方法會在每次服務(wù)啟動的時(shí)候調(diào)用。通常情況下,如果我們希望服務(wù)一旦啟動就立刻去執(zhí)行某個(gè)動作,就可以將邏輯寫在 onStartCommand 方法中。
啟動和停止服務(wù)的方法
startService(Intent intent)
stopService(Intent intent)
這兩個(gè)方法都是定義在 Context 類中,可以在活動里直接調(diào)用這兩個(gè)方法
另外,可以在 Service 的任何一個(gè)位置調(diào)用 stopSelf() 方法讓服務(wù)停下來。
- startService 和 bindService 的區(qū)別
- 執(zhí)行 startService 時(shí),Service 會經(jīng)歷 onCreate -> onStartCommand 。當(dāng)執(zhí)行stopService 時(shí),直接調(diào)用onDestroy方法。
執(zhí)行bindService時(shí),Service會經(jīng)歷onCreate->onBind。這個(gè)時(shí)候調(diào)用者和Service綁定在一起。調(diào)用者調(diào)用unbindService方法或者調(diào)用者Context不存在了(如Activity被finish了),Service就會調(diào)用onUnbind->onDestroy。這里所謂的綁定在一起就是說兩者共存亡了。 - 多次調(diào)用startService,該Service只能被創(chuàng)建一次,即該Service的onCreate方法只會被調(diào)用一次。但是每次調(diào)用startService,onStartCommand方法都會被調(diào)用。
第一次執(zhí)行bindService時(shí),onCreate和onBind方法會被調(diào)用,但是多次執(zhí)行bindService時(shí),onCreate和onBind方法并不會被多次調(diào)用,即并不會多次創(chuàng)建服務(wù)和綁定服務(wù)。
*onBind回調(diào)方法將返回給客戶端一個(gè)IBinder接口實(shí)例,IBinder允許客戶端回調(diào)服務(wù)的方法,比如得到Service運(yùn)行的狀態(tài)或其他操作。我們需要IBinder對象返回具體的Service對象才能操作,所以說具體的Service對象必須首先實(shí)現(xiàn)Binder對象。 -
既調(diào)用 startService 又調(diào)用 bindService
-
本地服務(wù)與遠(yuǎn)程服務(wù)
- 活動和服務(wù)間的通信
- Service 中的 onBind 方法返回null,表示客戶端不能建立到此服務(wù)的連接。
- 當(dāng)一個(gè)活動和服務(wù)綁定了之后,就可以調(diào)用該服務(wù)里的 Binder 提供的方法了。
- onBind(Intent) 這個(gè)方法 返回了一個(gè)實(shí)現(xiàn)了 IBinder 接口的對象,這個(gè)對象將用于綁定Service 的 Activity 與 Service 通信。
每個(gè)服務(wù)都只會存在一個(gè)實(shí)例,所以不管你調(diào)用了多少次 startService()方法,只需調(diào)用一次 stopService() 或 stopSelf() 方法,服務(wù)就會停止下來。
根據(jù) Android 系統(tǒng)的機(jī)制,一個(gè)服務(wù)只要被啟動或被綁定之后,就會一直處于運(yùn)行狀態(tài),必須要讓以上兩種條件同時(shí)不滿足才可以被銷毀。所以,這種情況下要同時(shí)調(diào)用 stopService() 和 unbindService() 方法, onDestroy() 方法才能執(zhí)行。
IntentService 類
服務(wù)中的代碼是默認(rèn)運(yùn)行在主線程當(dāng)中的,如果直接在服務(wù)里去處理一些耗時(shí)的邏輯,就很容易出現(xiàn) ANR 的情況。為了可以簡單地創(chuàng)建一個(gè)異步的、會自動停止的服務(wù),Android 專門提供了一個(gè) IntentService 類前臺服務(wù)

