激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android Service生命周期詳解

Android Service生命周期詳解

2021-04-12 10:26Android開發網 Android

Android Service 生命周期可以促使移動設備的創新,讓用戶體驗到最優越的移動服務,只有broadcast receivers執行此方法的時候才是激活的,當 onReceive()返回的時候,它就是非激活狀態

引言

應用程序組件有一個生命周期——一開始android實例化他們響應意圖,直到結束實例被銷毀。在這期間,他們有時候處于激活狀態,有時候處于非激活狀 態;對于活動,對用戶有時候可見,有時候不可見。組件生命周期將討論活動、服務、廣播接收者的生命周期——包括在生命周期中他們可能的狀態、通知狀態改變 的方法、及這些狀態的組件寄宿的進程被終結和實例被銷毀的可能性。

上篇android開發之旅:組件生命周期(一)講解了論活動的生命周期及他們可能的狀態、通知狀態改變的方法。本篇將介紹服務和廣播接收者的生命周期:

服務生命周期

廣播接收者生命周期

1、服務生命周期

一個服務可以用在兩個方面:

它可以啟動且允許一直運行直到有人停止它,或者它自己停止。在這種模式,通過調用context.startservice()啟動服務及通過調用 context.stopservice()停止服務。服務也可以通過調用service.stopself()或 service.stopselfresult()停止自己。僅需要調用一次stopservice()停止服務,而不管調用 startservice()了多少次。

通過使用相關接口可以編程地操作服務。客戶端建立與service對象的一個連接及使用該連接調入服務。連接通過調用 context.bindservice()建立,通過調用context.unbindservice()關閉。多個客戶端可以綁定到同一個服務。如果 服務尚未啟動,bindservice()可以選擇啟動它。

這兩種模式并不是完全分離的。你可以綁定到一個用startservice()啟動的服務。例如,一個后臺音樂服務可以通過使用定義了音樂播放的 intent對象調用startservice()啟動。直到后來,用戶可能想對播放器做一些控制或者獲取當前歌曲的一些信息,一個活動將調用 bindservice()與服務建立連接。在這種情況下,實際上直到最后一個綁定關閉stopservice()并不會停止。

像活動一樣,一個服務也有生命周期方法,你可以執行監視它的狀態改變。但是比活動的生命周期方法更少,只有三個且它們是公有的(public)而不是受保護的(protected)(說明:活動的生命周期方法是protected的):

void oncreate()
void onstart(intent intent)
void ondestory()

通過這三個方法,你可以監視服務生命周期的兩個嵌套循環:

服務的整個生命時間(entire lifetime),從調用oncreate()到相應地調用ondestory()。像一個活動一樣,服務在oncreate()中做一些初始設置,且 在中釋放所有的資源。例如,一個音樂播放服務可以在oncreate()中創建線程,然后在ondestory()中停止線程。

服務的活躍生命時間(active lifetime),從調用onstart()開始。這個方法傳遞參數是傳送給startservice()的intent對象。音樂服務將打開intent,了解播放哪個音樂并且開始播放。

沒有相應的回調方法,因為服務停止沒有onstop()方法。

startservice()和ondestory()被所有服務調用,不管是通過context.startservice()啟動還是通過 context.bindservice()啟動的。然而,onstart()僅被通過startservice()啟動的服務調用。
如果一個服務允許別的綁定到它,有一些額外的回調方法來實現它:

ibinder onbind(intent intent)
boolean onunbind(intent intent)
void onrebind(intent intent)

onbind()回調傳遞的參數是傳給bindservice()的intent對象,onunbind()回調傳遞的參數是傳給 unbindservice()的intent對象。如果服務允許綁定,onbind()返回客戶端與服務交互的通信通道。onunbind()方法可以 要求調用onrebind(),如果一個新的客戶端連接到服務。

下圖解釋了服務的回調方法。雖然,它分離了由startservice()啟動的服務和由bindservice()啟動的服務,記住任何服務,無論 它怎么啟動的,都可能允許客戶端綁定到它,因此任何服務可能接收onbind()和onunbind()調用。

Android Service生命周期詳解

可以發現第一次startservice時,會調用oncreate和onstart,在沒有stopservice前,無論點擊多少次 startservice,都只會調用onstart。而stopservice時調用ondestroy。再次點擊stopservice,會發現不會 進入service的生命周期的,即不會再調用oncreate,onstart和ondestroy。

而onbind在startservice/stopservice中沒有調用。

需要注意一個問題,當activity退出的時候,sercvice并不會停止,此時我們可以再進入activity重新綁定,當這時候service 就會調用onrebind()方法,但是調用onrebind()方法的前提是先前的onunbind()方法執行成功,但是使用 super.onunbind(intent)是執行不成功的,這時候我們要手動的使其返回true,再次綁定時rebind()就會執行。否則,如果退 出時不顯示的指定onunbind()為成功的話(為false),那么重新啟動此activity來綁定服務時,service的onbind()方法 和onrebind都不會執行,但是serviceconnection方法確一定會回調了。這說明在service中的onbind()方法不同于 onstart()方法不能被重復調用。

2、廣播接收者生命周期

一個廣播接收者有一個回調方法:void onreceive(context curcontext, intent broadcastmsg)。當一個廣播消息到達接收者是,android調用它的onreceive()方法并傳遞給它包含消息的intent對象。廣 播接收者被認為僅當它執行這個方法時是活躍的。當onreceive()返回后,它是不活躍的。

有一個活躍的廣播接收者的進程是受保護的,不會被殺死。但是系統可以在任何時候殺死僅有不活躍組件的進程,當占用的內存別的進程需要時。

這帶來一個問題,當一個廣播消息的響應時費時的,因此應該在獨立的線程中做這些事,遠離用戶界面其它組件運行的主線程。如果onreceive()衍 生線程然后返回,整個進程,包括新的線程,被判定為不活躍的(除非進程中的其它應用程序組件是活躍的),將使它處于被殺的危機。解決這個問題的方法是 onreceive()啟動一個服務,及時服務做這個工作,因此系統知道進程中有活躍的工作在做。

ps:service 類兩種啟動方法:

• context.startservice()
• context.bindservice()

1.  在同一個應用任何地方調用 startservice() 方法就能啟動 service 了,然后系統會回調 service 類的 oncreate() 以及 onstart() 方法。這樣啟動的 service 會一直運行在后臺,直到 context.stopservice() 或者 selfstop() 方法被調用。
另外如果一個 service 已經被啟動,其他代碼再試圖調用 startservice() 方法,是不會執行 oncreate() 的,但會重新執行一次 onstart() 。

2. 另外一種 bindservice() 方法的意思是,把這個 service 和調用 service 的客戶類綁起來,如果調用這個客戶類被銷毀,service 也會被銷毀。用這個方法的一個好處是,bindservice() 方法執行后 service 會回調上邊提到的 onbind() 方發,你可以從這里返回一個實現了 ibind 接口的類,在客戶端操作這個類就能和這個服務通信了,比如得到 service 運行的狀態或其他操作。如果 service 還沒有運行,使用這個方法啟動 service 就會 oncreate() 方法而不會調用 onstart()。

總結:

1. startservice()的目的是回調onstart()方法,oncreate() 方法是在service不存在的時候調用的,如果service存在(例如之前調用了bindservice,那么service的oncreate方法已經調用了)那么startservice()將跳過oncreate() 方法。

2.  bindservice()目的是回調onbind()方法,它的作用是在service和調用者之間建立一個橋梁,并不負責更多的工作(例如一個service需要連接服務器的操作),一般使用bindservice來綁定到一個現有的service(即通過startservice啟動的服務)。

由于service 的onstart()方法只有在startservice()啟動service的情況下才調用,故使用onstart()的時候要注意這點。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: av在线浏览 | 欧美三日本三级少妇三级99观看视频 | 中文字幕精品亚洲 | 成人午夜免费av | 国产在线精品91 | 色播视频在线播放 | 国产精品69久久 | 国产美女做爰免费视 | 日韩精品一区二区三区中文 | 精品亚洲午夜久久久久91 | 久久91亚洲人成电影网站 | 亚洲一区在线视频观看 | 黄网站色成年大片免费高 | 91不雅视频| 鲁人人人鲁人人鲁精品 | 在线成人一区二区 | 色妇视频 | 国产资源在线免费观看 | 中国嫩模一级毛片 | 天天夜夜操操 | 丰满年轻岳中文字幕一区二区 | 国产第一页精品 | 毛片电影网址 | av观看国产| 成年人国产视频 | 亚洲网站在线观看视频 | 欧洲黄色一级视频 | 日本高清在线播放 | 搜一级毛片 | 国产一精品久久99无吗一高潮 | 亚洲片在线观看 | 久久99精品久久久久久秒播放器 | 亚洲成人福利电影 | av成人免费在线观看 | 国产亚洲精品视频中文字幕 | 4399一级成人毛片 | 亚洲特黄a级毛片在线播放 久久久入口 | 日韩欧美激情视频 | 欧美中文日韩 | 国产91精品久久久 | 欧美日韩亚州综合 |