Service是標(biāo)準(zhǔn)應(yīng)用組件之一,適用于長期運行,且無需用戶交互的任務(wù);或者提供可供其他應(yīng)用使用的功能
類型
- Normal Service
- IntentService
IntentService是一種處理通過Intent傳遞的異步請求的服務(wù),Client通過startService(Intent)發(fā)起請求,如果對應(yīng)服務(wù)已經(jīng)啟動,則該請求會放到請求隊列中;如果對應(yīng)服務(wù)沒有啟動,則先啟動服務(wù),再處理請求。請求是在onHandleIntent(Intent)函數(shù)中處理,該函數(shù)運行在一個由IntentService自動啟動的worker thread中。請求隊列中的所有請求都是在這個相同的thread中順序處理。當(dāng)所有請求都處理完后,IntentService會自行退出。
啟動方式
-
startService(Intent)
Intent必須是顯式的,包含具體的class name或者服務(wù)所在的包名。用這種方式啟動的服務(wù)必須調(diào)用stopSelf或者stopService才能正常退出。 -
bindService(Intent)
Intent可以是顯式的;也可以是隱式的,且匹配服務(wù)在manifest中聲明的intent filter。用這種方式啟動的服務(wù),只有第一次綁定,服務(wù)啟動時,會執(zhí)行onBind回調(diào),之后再次綁定服務(wù),系統(tǒng)會直接返回第一次綁定時onBind返回的IBinder。綁定服務(wù)的Client銷毀后系統(tǒng)會自動unBind,但推薦Client不需要服務(wù)時就立刻調(diào)用unBind。當(dāng)所有的Client都unBind之后,服務(wù)會自行退出。
交互方式
- Intent
適用于進程間和進程內(nèi)通信,用于啟動或綁定服務(wù) - Binder
進程內(nèi)通信時,可以調(diào)用Service的接口;進程間通信時,可以利用IBinder.transact和Binder.onTransact傳遞數(shù)據(jù) - Messenger
適用于進程間通信,但只能是Client單向向Service發(fā)送消息。 - AIDL
使用于進程間通信,Client可以同步或異步(keyword in aidl: oneway)調(diào)用Service的接口。