Android中Service的生命周期有哪些,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司專注于汝南企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,成都做商城網(wǎng)站。汝南網(wǎng)站建設(shè)公司,為汝南等地區(qū)提供建站服務(wù)。全流程按需開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
service的生命周期,從它被創(chuàng)建開始,到它被銷毀為止,可以有兩條不同的路徑:
被開啟的service通過其他組件調(diào)用 startService()被創(chuàng)建。
這種service可以無限地運(yùn)行下去,必須調(diào)用stopSelf()方法或者其他組件調(diào)用stopService()方法來停止它。
當(dāng)service被停止時(shí),系統(tǒng)會(huì)銷毀它。
被綁定的service是當(dāng)其他組件(一個(gè)客戶)調(diào)用bindService()來創(chuàng)建的。
客戶可以通過一個(gè)IBinder接口和service進(jìn)行通信。
客戶可以通過 unbindService()方法來關(guān)閉這種連接。
一個(gè)service可以同時(shí)和多個(gè)客戶綁定,當(dāng)多個(gè)客戶都解除綁定之后,系統(tǒng)會(huì)銷毀service。
這兩條路徑并不是完全分開的。
即是說,你可以和一個(gè)已經(jīng)調(diào)用了 startService()而被開啟的service進(jìn)行綁定。
比如,一個(gè)后臺(tái)音樂service可能因調(diào)用 startService()方法而被開啟了,稍后,可能用戶想要控制播放器或者得到一些當(dāng)前歌曲的信息,可以通過bindService()將一個(gè)activity和service綁定。這種情況下,stopService()或 stopSelf()實(shí)際上并不能停止這個(gè)service,除非所有的客戶都解除綁定。
和activity一樣,service也有一系列的生命周期回調(diào)函數(shù),你可以實(shí)現(xiàn)它們來監(jiān)測(cè)service狀態(tài)的變化,并且在適當(dāng)?shù)臅r(shí)候執(zhí)行適當(dāng)?shù)墓ぷ鳌?/p>
下面的service展示了每一個(gè)生命周期的方法:
public class ExampleService extends Service { int mStartMode; // indicates how to behave if the service is killed IBinder mBinder; // interface for clients that bind boolean mAllowRebind; // indicates whether onRebind should be used @Override public void onCreate() { // The service is being created } @Override public int onStartCommand(Intent intent, int flags, int startId) { // The service is starting, due to a call to startService() return mStartMode; } @Override public IBinder onBind(Intent intent) { // A client is binding to the service with bindService() return mBinder; } @Override public boolean onUnbind(Intent intent) { // All clients have unbound with unbindService() return mAllowRebind; } @Override public void onRebind(Intent intent) { // A client is binding to the service with bindService(), // after onUnbind() has already been called } @Override public void onDestroy() { // The service is no longer used and is being destroyed } }
不像是activity的生命周期回調(diào)函數(shù),你不需要調(diào)用基類的實(shí)現(xiàn)。
這個(gè)圖說明了service典型的回調(diào)方法,盡管這個(gè)圖中將開啟的service和綁定的service分開,但是你需要記住,任何service都潛在地允許綁定。
所以,一個(gè)被開啟的service仍然可能被綁定。
實(shí)現(xiàn)這些方法,你可以看到兩層嵌套的service的生命周期:
service整體的生命時(shí)間是從onCreate()被調(diào)用開始,到onDestroy()方法返回為止。
和activity一樣,service在onCreate()中進(jìn)行它的初始化工作,在onDestroy()中釋放殘留的資源。
比如,一個(gè)音樂播放service可以在onCreate()中創(chuàng)建播放音樂的線程,在onDestory()中停止這個(gè)線程。
onCreate() 和 onDestroy()會(huì)被所有的service調(diào)用,不論service是通過startService()還是bindService()建立。
service積極活動(dòng)的生命時(shí)間(active lifetime)是從onStartCommand() 或onBind()被調(diào)用開始,它們各自處理由startService()或 bindService()方法傳過來的Intent對(duì)象。
如果service是被開啟的,那么它的活動(dòng)生命周期和整個(gè)生命周期一同結(jié)束。
如果service是被綁定的,它們它的活動(dòng)生命周期是在onUnbind()方法返回后結(jié)束。
注意:盡管一個(gè)被開啟的service是通過調(diào)用 stopSelf() 或 stopService()來停止的,沒有一個(gè)對(duì)應(yīng)的回調(diào)函數(shù)與之對(duì)應(yīng),即沒有onStop()回調(diào)方法。所以,當(dāng)調(diào)用了停止的方法,除非這個(gè)service和客戶組件綁定,否則系統(tǒng)將會(huì)直接銷毀它,onDestory()方法會(huì)被調(diào)用,并且是這個(gè)時(shí)候唯一會(huì)被調(diào)用的回調(diào)方法。
當(dāng)綁定service和所有客戶端解除綁定之后,Android系統(tǒng)將會(huì)銷毀它,(除非它同時(shí)被onStartCommand()方法開啟)。
因此,如果你的service是一個(gè)純粹的綁定service,那么你不需要管理它的生命周期。
然而,如果你選擇實(shí)現(xiàn)onStartCommand()回調(diào)方法,那么你必須顯式地停止service,因?yàn)閟ervice此時(shí)被看做是開啟的。
這種情況下,service會(huì)一直運(yùn)行到它自己調(diào)用 stopSelf()
或另一個(gè)組件調(diào)用stopService()
,不論它是否和客戶端綁定。
另外,如果你的service被開啟并且接受綁定,那么當(dāng)系統(tǒng)調(diào)用你的 onUnbind()
方法時(shí),如果你想要在下次客戶端綁定的時(shí)候接受一個(gè)onRebind()的調(diào)用(而不是調(diào)用 onBind()
),你可以選擇在 onUnbind()
中返回true。
onRebind()的返回值為void,但是客戶端仍然在它的 onServiceConnected()
回調(diào)方法中得到 IBinder
對(duì)象。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。