溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android 中Service的生命周期有哪些

發(fā)布時(shí)間:2021-06-28 15:07:51 來(lái)源:億速云 閱讀:418 作者:Leah 欄目:移動(dòng)開(kāi)發(fā)

這篇文章給大家介紹Android 中Service的生命周期有哪些,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

Android Service 生命周期可以促使移動(dòng)設(shè)備的創(chuàng)新,讓用戶體驗(yàn)到***越的移動(dòng)服務(wù),只有broadcast receivers執(zhí)行此方法的時(shí)候才是激活的,當(dāng) onReceive()返回的時(shí)候,它就是非激活狀態(tài)。

如果沒(méi)有程序停止它或者它自己停止,service將一直運(yùn)行。在這種模式下,service開(kāi)始于調(diào)用Context.startService() ,停止于Context.stopService(). service可以通過(guò)調(diào)用Android Service 生命周期() 或 Service.stopSelfResult()停止自己。不管調(diào)用多少次startService() ,只需要調(diào)用一次 stopService() 就可以停止service

可以通過(guò)接口被外部程序調(diào)用。外部程序建立到service的連接,通過(guò)連接來(lái)操作service。建立連接調(diào)開(kāi)始于Context.bindService(), 結(jié)束于Context.unbindService(). 多個(gè)客戶端可以綁定到同一個(gè)service,如果service沒(méi)有啟動(dòng), bindService() 可以選擇啟動(dòng)它。

這2種模式不是完全分離的。你可以可以綁定到一個(gè)通過(guò)startService()啟動(dòng)的服務(wù)。如一個(gè)intent想要播放音樂(lè),通過(guò)startService() 方法啟動(dòng)后臺(tái)播放音樂(lè)的service。然后,也許用戶想要操作播放器或者獲取當(dāng)前正在播放的樂(lè)曲的信息,一個(gè)activity就會(huì)通過(guò)bindService()建立一個(gè)到此service的連接. 這種情況下 stopService() 在全部的連接關(guān)閉后才會(huì)真正停止service

像activity一樣, service也有可以通過(guò)監(jiān)視狀態(tài)實(shí)現(xiàn)的生命周期。但是比activity要少――只有3個(gè)――而且是public的而不是protected的

void onCreate()   void onStart(Intent intent)   void onDestroy()

通過(guò)實(shí)現(xiàn)這3個(gè)方法,可以監(jiān)視service生命周期的2個(gè)嵌套循環(huán):

整個(gè)生命周期 從onCreate() 開(kāi)始,從onDestroy() 結(jié)束,像activity一樣, a Android Service 生命周期在 onCreate()中執(zhí)行初始化操作,在 onDestroy()中釋放所有用到的資源。如:后臺(tái)播放音樂(lè)的service可能在 onCreate()創(chuàng)建一個(gè)播放音樂(lè)的線程,在onDestroy()中銷毀這個(gè)線程。

活動(dòng)生命周期 開(kāi)始于 onStart(). 這個(gè)方法處理傳入到startService()方法的intent。 音樂(lè)服務(wù)會(huì)打開(kāi)intent查看要播放哪首歌曲,并開(kāi)始播放。當(dāng)服務(wù)停止的時(shí)候,沒(méi)有方法檢測(cè)到――沒(méi)有 onStop() 方法,onCreate() 和 onDestroy() 用于所有通過(guò)Context.startService() or Context.bindService() 啟動(dòng)的service。onStart() 只用于通過(guò)startService()開(kāi)始的service。

如果一個(gè)Android Service 生命周期是可以從外部綁定的,它就可以觸發(fā)以下的方法:

IBinder onBind(Intent intent)   boolean onUnbind(Intent intent)   void onRebind(Intent intent)

onBind() 回調(diào)被傳遞給調(diào)用bindService 的intent, onUnbind() 被unbindService()中的intent處理。如果服務(wù)允許被綁定。那么onBind() 方法返回客戶端和sercie的溝通通道。如果一個(gè)新的客戶端連接到服務(wù),onUnbind() 會(huì)觸發(fā)onRebind() 調(diào)用。

下面的圖表說(shuō)明了sercice的回調(diào)方法。下面的圖片將通過(guò) startService 和通過(guò)bindService()啟動(dòng)的service分開(kāi)了,但是要注意不管他們?cè)趺磫?dòng)的,都有可能被客戶端連接,因此都有可能觸發(fā)到onBind() 和 onUnbind() 方法。

當(dāng)經(jīng)過(guò)receiver 請(qǐng)求,broadcast message到達(dá)的時(shí)候, Android 調(diào)用持有message的intent的 onReceive() 方法,只有broadcast receivers執(zhí)行此方法的時(shí)候才是激活的,當(dāng) onReceive()返回的時(shí)候,它就是非激活狀態(tài)

一個(gè)含有激活的broadcast receiver的進(jìn)程是不會(huì)被中止的。但是只含有非激活組件的進(jìn)程在它占用的內(nèi)存被其他程序請(qǐng)求的時(shí)候,任何時(shí)間都可以被中止。 當(dāng)響應(yīng)broadcast message的程序因?yàn)橄暮芏鄷r(shí)間而在另外一個(gè)線程 而非UI所在的線程處理的時(shí)候會(huì)出現(xiàn)一個(gè)問(wèn)題。

當(dāng) onReceive() 開(kāi)啟一個(gè)線程并返回后,整個(gè)程序(包括新建的線程)狀態(tài)是非激活的(除非此進(jìn)程中有其他激活的組件), 因此這個(gè)進(jìn)程就有被中止的危險(xiǎn)。解決這個(gè)問(wèn)題的辦法是onReceive() 方法啟動(dòng)一個(gè)Android Service 生命周期,讓sercie去做耗時(shí)的工作,這樣系統(tǒng)就知道此進(jìn)程中還有活動(dòng)的工作。

關(guān)于Android 中Service的生命周期有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI