黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

系統(tǒng) 2261 0

引言

應(yīng)用程序組件有一個(gè)生命周期——一開始Android實(shí)例化他們響應(yīng)意圖,直到結(jié)束實(shí)例被銷毀。在這期間,他們有時(shí)候處于激活狀態(tài),有時(shí)候處于非激活狀態(tài);對(duì)于活動(dòng),對(duì)用戶有時(shí)候可見,有時(shí)候不可見。組件生命周期將討論活動(dòng)、服務(wù)、廣播接收者的生命周期——包括在生命周期中他們可能的狀態(tài)、通知狀態(tài)改變的方法、及這些狀態(tài)的組件寄宿的進(jìn)程被終結(jié)和實(shí)例被銷毀的可能性。

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

  • 服務(wù)生命周期
  • 廣播接收者生命周期

1、服務(wù)生命周期

一個(gè)服務(wù)可以用在兩個(gè)方面:

  • 它可以啟動(dòng)且允許一直運(yùn)行直到有人停止它,或者它自己停止。在這種模式,通過調(diào)用 Context.startService() 啟動(dòng)服務(wù)及通過調(diào)用 Context.stopService() 停止服務(wù)。服務(wù)也可以通過調(diào)用 Service.stopSelf() Service.stopSelfResult() 停止自己。僅需要調(diào)用一次 stopService() 停止服務(wù),而不管調(diào)用 startService() 了多少次。
  • 通過使用相關(guān)接口可以編程地操作服務(wù)。客戶端建立與Service對(duì)象的一個(gè)連接及使用該連接調(diào)入服務(wù)。連接通過調(diào)用 Context.bindService() 建立,通過調(diào)用 Context.unbindService() 關(guān)閉。多個(gè)客戶端可以綁定到同一個(gè)服務(wù)。如果服務(wù)尚未啟動(dòng), bindService() 可以選擇啟動(dòng)它。

這兩種模式并不是完全分離的。你可以綁定到一個(gè)用 startService() 啟動(dòng)的服務(wù)。例如,一個(gè)后臺(tái)音樂服務(wù)可以通過使用定義了音樂播放的Intent對(duì)象調(diào)用 startService() 啟動(dòng)。直到后來,用戶可能想對(duì)播放器做一些控制或者獲取當(dāng)前歌曲的一些信息,一個(gè)活動(dòng)將調(diào)用 bindService() 與服務(wù)建立連接。在這種情況下,實(shí)際上直到最后一個(gè)綁定關(guān)閉 stopService() 并不會(huì)停止。

像活動(dòng)一樣,一個(gè)服務(wù)也有生命周期方法,你可以執(zhí)行監(jiān)視它的狀態(tài)改變。但是比活動(dòng)的生命周期方法更少,只有三個(gè)且它們是公有的(public)而不是受保護(hù)的(protected)(說明:活動(dòng)的生命周期方法是protected的):

  • void onCreate()
  • void onStart(Intent intent )
  • void onDestory()

通過這三個(gè)方法,你可以監(jiān)視服務(wù)生命周期的兩個(gè)嵌套循環(huán):

  • 服務(wù)的整個(gè)生命時(shí)間(entire lifetime) ,從調(diào)用 onCreate() 到相應(yīng)地調(diào)用 onDestory() 。像一個(gè)活動(dòng)一樣,服務(wù)在 onCreate() 中做一些初始設(shè)置,且在中釋放所有的資源。例如,一個(gè)音樂播放服務(wù)可以在 onCreate() 中創(chuàng)建線程,然后在 onDestory() 中停止線程。
  • 服務(wù)的活躍生命時(shí)間(active lifetime) ,從調(diào)用 onStart() 開始。這個(gè)方法傳遞參數(shù)是傳送給 startService() 的Intent對(duì)象。音樂服務(wù)將打開Intent,了解播放哪個(gè)音樂并且開始播放。
    沒有相應(yīng)的回調(diào)方法,因?yàn)榉?wù)停止沒有onStop()方法。

startService() onDestory() 被所有服務(wù)調(diào)用,不管是通過 Context.startService() 啟動(dòng)還是通過 Context.bindService() 啟動(dòng)的。然而, onStart() 僅被通過 startService() 啟動(dòng)的服務(wù)調(diào)用。

如果一個(gè)服務(wù)允許別的綁定到它,有一些額外的回調(diào)方法來實(shí)現(xiàn)它:

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

onBind() 回調(diào)傳遞的參數(shù)是傳給 bindService() 的Intent對(duì)象, onUnbind() 回調(diào)傳遞的參數(shù)是傳給 unbindService() 的Intent對(duì)象。如果服務(wù)允許綁定, onBind() 返回客戶端與服務(wù)交互的通信通道。 onUnbind() 方法可以要求調(diào)用 onRebind() ,如果一個(gè)新的客戶端連接到服務(wù)。

下圖解釋了服務(wù)的回調(diào)方法。雖然,它分離了由 startService() 啟動(dòng)的服務(wù)和由 bindService() 啟動(dòng)的服務(wù),記住任何服務(wù),無論它怎么啟動(dòng)的,都可能允許客戶端綁定到它,因此任何服務(wù)可能接收 onBind() onUnbind() 調(diào)用。

service_lifecycle

2、廣播接收者生命周期

一個(gè)廣播接收者有一個(gè)回調(diào)方法: void onReceive(Context curContext , Intent broadcastMsg ) 。當(dāng)一個(gè)廣播消息到達(dá)接收者是,Android調(diào)用它的 onReceive() 方法并傳遞給它包含消息的Intent對(duì)象。廣播接收者被認(rèn)為僅當(dāng)它執(zhí)行這個(gè)方法時(shí)是活躍的。當(dāng) onReceive() 返回后,它是不活躍的。

有一個(gè)活躍的廣播接收者的進(jìn)程是受保護(hù)的,不會(huì)被殺死。但是系統(tǒng)可以在任何時(shí)候殺死僅有不活躍組件的進(jìn)程,當(dāng)占用的內(nèi)存別的進(jìn)程需要時(shí)。

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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論