Android四大組件Service

文章腦圖

文章內(nèi)容

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生命周期

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)用此方法。

參考

Service生命周期淺析

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);

8、IntentService源碼分析

9、Service面試題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容