日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习:组件生命周期(1)

發(fā)布時(shí)間:2025/3/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习:组件生命周期(1) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

應(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í)例被銷毀的可能性。

本文主要討論活動(dòng)的生命周期及他們可能的狀態(tài)、通知狀態(tài)改變的方法。分為以下三部分:

  • 1、活動(dòng)生命周期
  • 2、保存活動(dòng)狀態(tài)
  • 3、協(xié)調(diào)活動(dòng)

1、活動(dòng)生命周期

一個(gè)活動(dòng)有三個(gè)基本狀態(tài):

  • 激活狀態(tài)運(yùn)行狀態(tài),這時(shí)它運(yùn)行在屏幕的前臺(tái)(處于當(dāng)前任務(wù)活動(dòng)棧的最上面)。這個(gè)活動(dòng)有用戶的操作的焦點(diǎn)。
  • 暫停狀態(tài),這時(shí)活動(dòng)失去焦點(diǎn)但是它對(duì)用戶仍可見。也就是說,另一個(gè)活動(dòng)在它的上面且那個(gè)活動(dòng)是透明的或者沒有覆蓋整個(gè)屏幕,因此通過它可以看見暫停狀態(tài)的活動(dòng)。一個(gè)暫停的活動(dòng)完全是活著的(它維護(hù)著所有的狀態(tài)和成員信息,且仍然依附在窗口管理器),但是當(dāng)內(nèi)存極小時(shí)可以被系統(tǒng)殺掉。
  • 停止?fàn)顟B(tài),這時(shí)活動(dòng)完全被其他活動(dòng)掩蓋。它仍然保留所有狀態(tài)和成員信息,但是對(duì)用戶它不可見,因此它的窗口時(shí)隱藏的且當(dāng)其他地方需要內(nèi)存時(shí)它往往被系統(tǒng)殺掉。

如果一個(gè)活動(dòng)被暫?;蛲V?#xff0c;系統(tǒng)可以將它從內(nèi)存移除,通過要求它結(jié)束(通過調(diào)用它的finish()方法),或簡(jiǎn)單地殺掉它的進(jìn)程。當(dāng)它再次顯示給用戶時(shí),必須要完全重新啟動(dòng)和恢復(fù)到之前的狀態(tài)。隨著活動(dòng)從一個(gè)狀態(tài)轉(zhuǎn)為另一個(gè)狀態(tài),通過調(diào)用下面的受保護(hù)的方法通知該改變:

  • void onCreate(Bundle saveInstanceState)
  • void onStart()
  • void onRestart()
  • void onResume()
  • void onPause()
  • void onStop()
  • void onDestroy()

所有這些方法都是鉤子,你可以重寫當(dāng)狀態(tài)改變時(shí)做適當(dāng)?shù)墓ぷ?。所有的活?dòng)必須要實(shí)現(xiàn)onCreate()去做一些初始化的設(shè)置,當(dāng)對(duì)象第一次實(shí)例化的時(shí)候。很多活動(dòng)也會(huì)實(shí)現(xiàn)onPause()去提交數(shù)據(jù)修改或準(zhǔn)備停止與用戶交互。

將他們合并在一起,這七個(gè)方法定義了活動(dòng)的整個(gè)生命周期。有三個(gè)嵌套的循環(huán),你可以通過這七個(gè)方法監(jiān)視:

  • 活動(dòng)的整個(gè)生命時(shí)間,從第一次調(diào)用onCreate()開始直到調(diào)用onDestroy()結(jié)束。一個(gè)活動(dòng)在onCreate()中做所有的“全局”狀態(tài)的初始設(shè)置,在onDestroy()中釋放所有保留的資源。舉例來說,有一個(gè)線程運(yùn)行在后臺(tái)從網(wǎng)絡(luò)上下載數(shù)據(jù),它可能會(huì)在onCreate()中創(chuàng)建線程,在onDestroy()中結(jié)束線程。
  • 活動(dòng)的可視生命時(shí)間,從調(diào)用onStart()到相應(yīng)的調(diào)用onStop() 。在這期間,用戶可以在屏幕上看見活動(dòng),雖然它可能不是運(yùn)行在前臺(tái)且與用戶交互。在這兩個(gè)方法之間,你可以保持顯示活動(dòng)所需要的資源。舉例來說,你可以在onStart()中注冊(cè)一個(gè)廣播接收者監(jiān)視影響你的UI的改變,在onStop() 中注銷。因?yàn)榛顒?dòng)在可視和隱藏之間來回切換,onStart()onStop()? 可以調(diào)用多次。
  • 活動(dòng)的前臺(tái)生命時(shí)間,從調(diào)用onResume()到相應(yīng)的調(diào)用onPause()。在這期間,頻繁地在重用和暫停狀態(tài)轉(zhuǎn)換——例如,當(dāng)設(shè)備進(jìn)入睡眠狀態(tài)或一個(gè)新的活動(dòng)啟動(dòng)時(shí)調(diào)用onPause(),當(dāng)一個(gè)活動(dòng)返回或一個(gè)新的意圖被傳輸時(shí)調(diào)用onResume()。因此,這兩個(gè)方法的代碼應(yīng)當(dāng)是相當(dāng)輕量級(jí)的。

下面這個(gè)圖解釋了這三個(gè)循環(huán)和狀態(tài)之間狀態(tài)的可能路徑。著色的橢圓表示活動(dòng)的主要狀態(tài),矩形表示當(dāng)活動(dòng)在狀態(tài)之間轉(zhuǎn)換時(shí)你可以執(zhí)行的回調(diào)方法。

圖1、活動(dòng)生命周期(來源:Android SDK)

下面的表格對(duì)每個(gè)方法更詳細(xì)的描述和在活動(dòng)的整個(gè)生命周期中的定位。

注意上面表格的Killable列,它表示當(dāng)方法返回時(shí)沒有執(zhí)行活動(dòng)的其它代碼,系統(tǒng)是否能殺死活動(dòng)寄宿的進(jìn)程。三個(gè)方法(onPause()、onStop()、onDestroy())標(biāo)記為Yes。因?yàn)?span style="color:#ff8040;">onPause()是唯一一個(gè)保證在進(jìn)程被殺之前會(huì)調(diào)用的,因此你應(yīng)該使用onPause()來寫任何持久化存儲(chǔ)數(shù)據(jù)。

被標(biāo)記為No的方法保護(hù)活動(dòng)寄宿的進(jìn)程在他們調(diào)用的時(shí)候不會(huì)被殺掉。因此活動(dòng)是可殺掉狀態(tài),例如onPause()返回到onResume()調(diào)用期間。直到onPause()再次返回,活動(dòng)是不可殺掉的。其實(shí),沒有標(biāo)記為Killable的活動(dòng)也是可以系統(tǒng)被殺掉的,不過這僅僅發(fā)生在極端困難的情況下,沒有有任何其他資源可用。

2、保存活動(dòng)狀態(tài)

當(dāng)系統(tǒng)而不是用戶關(guān)閉一個(gè)活動(dòng)來節(jié)省內(nèi)存時(shí),用戶可能希望返回到活動(dòng)且是它之前的狀態(tài)。為了獲得活動(dòng)被殺之前的狀態(tài),你可以執(zhí)行活動(dòng)的onSaveInstanceState()方法。Android在活動(dòng)容易被銷毀前調(diào)用這個(gè)方法,也就是調(diào)用onPause()之前。該方法的參數(shù)是一個(gè)Bundle對(duì)象,在這個(gè)對(duì)象你可以以名值對(duì)記錄活動(dòng)的動(dòng)態(tài)狀態(tài)。當(dāng)活動(dòng)再次啟動(dòng)時(shí),Bundle同時(shí)被傳遞到onCreate()和調(diào)用onCreate()之后的方法,onRestoreInstanceState(),因此使用一個(gè)或兩個(gè)可以重新創(chuàng)建捕獲的狀態(tài)。

因?yàn)?span style="color:#ff8040;">onSaveInstanceState()方法不總是被調(diào)用,你應(yīng)該僅使用onSaveInstanceState()它來記錄活動(dòng)的臨時(shí)狀態(tài),而不是持久的數(shù)據(jù)。應(yīng)該使用onPause()來存儲(chǔ)持久數(shù)據(jù)。

3、協(xié)調(diào)活動(dòng)

當(dāng)一個(gè)活動(dòng)啟動(dòng)另一個(gè)活動(dòng),他們都經(jīng)歷生命周期轉(zhuǎn)換。一個(gè)暫停或許是停止,然而另一個(gè)啟動(dòng)。有時(shí),你可能需要協(xié)調(diào)這些活動(dòng)。生命周期的回調(diào)順序是明確界定的,特別是當(dāng)這兩個(gè)活動(dòng)在同一個(gè)進(jìn)程中:

  • 當(dāng)前活動(dòng)的onPause()方法被調(diào)用。
  • 接下來,啟動(dòng)活動(dòng)的onCreate()onStart()、onResume()方法按序被調(diào)用。
  • 然后,如果獲得不再在屏幕上可見,它的onStop()方法被調(diào)用。
  • 修正:第一節(jié)——活動(dòng)生命周期中的表格第一、二行中的第二列(description)中的onRestart()應(yīng)該為onStart()。
    1000多的點(diǎn)擊,居然沒有人發(fā)現(xiàn)這個(gè)錯(cuò)誤,看了大家根本就沒認(rèn)真看或者說根本沒有靜心看園子里的任何博文,心痛!還是水帖比較受歡迎。

    轉(zhuǎn)載于:https://www.cnblogs.com/forlina/archive/2011/06/29/2093366.html

    總結(jié)

    以上是生活随笔為你收集整理的学习:组件生命周期(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。