亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android開發之組件生命周期(二)

系統 1806 0

引言

應用程序組件有一個生命周期——一開始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() 調用。

service_lifecycle

2、廣播接收者生命周期

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

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

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

Android開發之組件生命周期(二)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 视频一区国产 | 偷偷狠狠的日日日日 | 日韩欧美综合在线二区三区 | 在线视频亚洲一区 | 拍拍拍精品视频在线观看 | 天天爱天天操 | 99热久| 久久精品国产精品青草不卡 | 中文字幕久热精品视频免费 | 国产一区福利 | 我要看欧美精品一级毛片 | 狠狠色成人综合网图片区 | 亚洲精品乱码久久久久久中文字幕 | 久久久精品久久久久久 | www.色片| 久久精品视频在线 | 国产高清一区二区三区视频 | 青青青国产在线 | 爱爱免费观看高清视频在线播放 | 蜜桃日本一道无卡不码高清 | 91手机在线观看 | 国产a网| 老司机激情影院 | 青草娱乐极品免费视频 | 久久一区二区三区精品 | a网在线| 久久精品国产99久久3d动漫 | 中文字幕日韩一区 | 国产亚洲精品成人久久网站 | 亚洲欧美成人网 | 99久久精品国产自免费 | 国产高清一区二区三区 | 亚洲精品高清久久 | 国产一区二区三区久久精品小说 | 中文字幕亚洲欧美 | 国产这里只有精品 | 色爱b| 中文字幕在线免费观看视频 | 免费福利入口在线观看 | 欧美日韩精选 | 我想看一级播放片一级的 |