学习:组件生命周期(1)
引言
應(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)程中:
修正:第一節(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在泰山地区开展生态产业?
- 下一篇: oracle时间运算