文章腦圖

1、Service 啟動過程
2、什么是Service
- Service服務(wù)是Android四大組件之一,是一種程序后臺運(yùn)行的方案,用于執(zhí)行長時間運(yùn)行且不需要用戶交互的任務(wù)。
- Service并不是在單獨進(jìn)程中運(yùn)行,而是運(yùn)行在應(yīng)用程序的主線程中,在執(zhí)行具體耗時任務(wù)過程中要手動開啟子線程,應(yīng)用程序進(jìn)程被殺死,所有依賴該進(jìn)程的服務(wù)也會停止運(yùn)行。
3、Service分類
Service本地、可通信的、前臺、遠(yuǎn)程使用
遠(yuǎn)程服務(wù)Service,AIDL & IPC講解
4、Service兩種狀態(tài)
啟動狀態(tài)(Started):
Android的應(yīng)用程序組件,如Activity,通過startService()啟動了服務(wù),則服務(wù)是Started狀態(tài)。一旦啟動,服務(wù)可以在后臺無限期運(yùn)行,即使啟動它的組件已經(jīng)被銷,除非手動調(diào)用才能停止服務(wù), 已啟動的服務(wù)通常是執(zhí)行單一操作,而且不會將結(jié)果返回給調(diào)用方。
綁定狀態(tài)(Bound):
當(dāng)Android的應(yīng)用程序組件通過bindService()綁定了服務(wù),則服務(wù)是Bound狀態(tài)。Bound狀態(tài)的服務(wù)提供了一個客戶服務(wù)器接口來允許組件與服務(wù)進(jìn)行交互,如發(fā)送請求,獲取結(jié)果,甚至通過IPC來進(jìn)行跨進(jìn)程通信。僅當(dāng)與另一個應(yīng)用組件綁定時,綁定服務(wù)才會運(yùn)行。 多個組件可以同時綁定到該服務(wù),但全部取消綁定后,該服務(wù)即會被銷毀。
5、Service生命周期

onCreate()
首次創(chuàng)建服務(wù)時,系統(tǒng)將調(diào)用此方法。如果服務(wù)已在運(yùn)行,則不會調(diào)用此方法,該方法只調(diào)用一次。
onStartCommand()
當(dāng)另一個組件通過調(diào)用startService()請求啟動服務(wù)時,系統(tǒng)將調(diào)用此方法。
onDestroy()
當(dāng)服務(wù)不再使用且將被銷毀時,系統(tǒng)將調(diào)用此方法。
onBind()
當(dāng)另一個組件通過調(diào)用bindService()與服務(wù)綁定時,系統(tǒng)將調(diào)用此方法。
onUnbind()
當(dāng)另一個組件通過調(diào)用unbindService()與服務(wù)解綁時,系統(tǒng)將調(diào)用此方法。
onRebind()
當(dāng)舊的組件與服務(wù)解綁后,另一個新的組件與服務(wù)綁定,onUnbind()返回true時,系統(tǒng)將調(diào)用此方法。
參考
6、Service兩種啟動方式
startService 啟動的服務(wù):主要用于啟動一個服務(wù)執(zhí)行后臺任務(wù),不進(jìn)行通信。停止服務(wù)使用stopService。同一個Service Start多次,onCreate()執(zhí)行一次,onStartCommand()執(zhí)行多次。
bindService 啟動的服務(wù):該方法啟動的服務(wù)可以進(jìn)行通信。停止服務(wù)使用unbindService。同一個Service bind多次, onCreate()執(zhí)行一次,onBind()也執(zhí)行一次。
7、Service顯式和隱式
顯式啟動
Intent intent = new Intent(this, Service.class);
startService(intent);
隱式啟動
- Android5.0之前
<-- AndroidManifest.xml清單配置 -->
<service android:name=".service">
<intent-filer>
<action android:name="com.android.service"/>
<intent-filer>
</service>
//代碼
Intent intent = new Intent("com.android.service");
startService(intent);
- Android5.0之后
// 方式一
Intent intent = new Intent();
//serviceName="com.ara.test",serviceName 必須是完整的類名
ComponentName componentName = new ComponentName(pkgName, serviceName);
intent.setComponent(componentName);
context.startService(intent);
// 方式二
Intent intent = new Intent();
intent.setAction("com.android.service");//Service能夠匹配的Action
intent.setPackage("com.ara.test");//應(yīng)用的包名
context.startService(intent);