1.4 組件生命周期
應(yīng)用程序組件都有生命周期——由Android實(shí)例化以響應(yīng)Intent對(duì)象開(kāi)始、直到這個(gè)實(shí)例被銷毀。在此期間,組件可以是激活或者非激活狀態(tài)。 如果是Activity,則還包括對(duì)用戶的可見(jiàn)或不可見(jiàn)狀態(tài)。本節(jié)討論Activity、服務(wù)以及廣播接收器的生命周期,包括它們?cè)谏芷谥械目赡軤?態(tài)、在狀態(tài)轉(zhuǎn)變時(shí)調(diào)用的通知方法、以及當(dāng)這些進(jìn)程被關(guān)閉或?qū)嵗讳N毀時(shí),這些狀態(tài)產(chǎn)生的影響。
1.4.1 Activity生命周期
本質(zhì)上Activity有三個(gè)狀態(tài):
- 當(dāng)它在屏幕前臺(tái)時(shí)(位于當(dāng)前任務(wù)堆棧的頂部),它是激活或運(yùn)行狀態(tài)。它就是響應(yīng)用戶操作的Activity。
- 當(dāng)它失去焦點(diǎn)但仍然對(duì)用戶可見(jiàn)時(shí),它處于暫停狀態(tài)。即在它之上有另外一個(gè)Activity。這個(gè)Activity也許是透明的,或者沒(méi)有完全覆蓋 全屏,所以被暫停的Activity仍對(duì)用戶可見(jiàn)。暫停的Activity仍然是存活狀態(tài)(它保留著所有的狀態(tài)和成員信息并保持和窗口管理器的連接),但 系統(tǒng)處于極低內(nèi)存時(shí)仍然可以殺死這個(gè)Activity。
- 完全被另一個(gè)Activity覆蓋時(shí)則處于停止?fàn)顟B(tài)。它仍然保留所有的狀態(tài)和成員信息。然而對(duì)用戶是不可見(jiàn)的,所以它的窗口將被隱藏,如果其它地方需要內(nèi)存,則系統(tǒng)經(jīng)常會(huì)殺死這個(gè)Activity。
如果Activity處于暫停或停止?fàn)顟B(tài),系統(tǒng)可以通過(guò)要求它結(jié)束(調(diào)用它的 finish() 方法)或直接殺死它的進(jìn)程來(lái)將它驅(qū)出內(nèi)存。當(dāng)它再次為用戶可見(jiàn)的時(shí)候,只能完全重新啟動(dòng)并恢復(fù)至以前的狀態(tài)。
當(dāng)Activity從一種狀態(tài)轉(zhuǎn)變到另一種狀態(tài)時(shí),會(huì)調(diào)用以下保護(hù)方法來(lái)通知這種變化:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
所有這些方法都被掛接,因此我們可以重載他們以在狀態(tài)改變時(shí)進(jìn)行適當(dāng)?shù)奶幚怼K械腁ctivity都必須實(shí)現(xiàn) onCreate()來(lái)執(zhí)行對(duì)象第一次實(shí)例化時(shí)的初始化。很多Activity會(huì)實(shí)現(xiàn)onPause()以提交數(shù)據(jù)變化或準(zhǔn)備停止與用戶的交互。
所有Activity的生命周期方法實(shí)現(xiàn)中都必須先調(diào)用其父類的版本。比如說(shuō):
protected void onPause() {
super.onPause();
. . .
}
總得來(lái)說(shuō),這七個(gè)方法定義了Activity的完整生命周期。實(shí)現(xiàn)這些方法可以幫助我們監(jiān)視其中的 三個(gè)嵌套生命周期循環(huán) :
- Activity 的完整生命周期 自第一次調(diào)用onCreate()開(kāi)始,直至調(diào)用onDestroy()為 止。Activity在onCreate()中設(shè)置所有“全局”狀態(tài)以完成初始化,而在onDestroy()中釋放所有系統(tǒng)資源。例如,如果 Activity有一個(gè)線程在后臺(tái)運(yùn)行從網(wǎng)絡(luò)上下載數(shù)據(jù),它會(huì)在onCreate()創(chuàng)建線程,而在 onDestroy()銷毀線程。
- Activity的 可視生命周期 自onStart()調(diào)用開(kāi)始直到相應(yīng)的onStop()調(diào)用結(jié)束。在此期 間,用戶可以在屏幕上看到Activity,盡管它也許并不是位于前臺(tái)或者也不與用戶進(jìn)行交互。在這兩個(gè)方法之間,我們可以保留用來(lái)向用戶顯示這個(gè) Activity所需的資源。例如,當(dāng)用戶不再看見(jiàn)我們顯示的內(nèi)容時(shí),我們可以在onStart()中注冊(cè)一個(gè)BroadcastReceiver來(lái)監(jiān)控 會(huì)影響UI的變化,而在onStop()中來(lái)注消。onStart() 和 onStop() 方法可以隨著應(yīng)用程序是否為用戶可見(jiàn)而被多次調(diào)用。
- Activity的 前臺(tái)生命周期 自onResume()調(diào)用起,至相應(yīng)的onPause()調(diào)用為止。在此期 間,Activity位于前臺(tái)最上面并與用戶進(jìn)行交互。Activity會(huì)經(jīng)常在暫停和恢復(fù)之間進(jìn)行狀態(tài)轉(zhuǎn)換——例如當(dāng)設(shè)備轉(zhuǎn)入休眠狀態(tài)或者有新的 Activity啟動(dòng)時(shí),將調(diào)用onPause() 方法。當(dāng)Activity獲得結(jié)果或者接收到新的Intent時(shí)會(huì)調(diào)用onResume() 方法。因此,這兩個(gè)方法中的代碼應(yīng)當(dāng)是輕量級(jí)的。
下圖展示了上述循環(huán)過(guò)程以及Activity在此過(guò)程中歷經(jīng)的狀態(tài)改變。著色的橢圓是Activity可以經(jīng)歷的主要狀態(tài)。矩形框表示在Activity狀態(tài)間發(fā)生改變的時(shí)候,我們可以實(shí)現(xiàn)的方法進(jìn)行適當(dāng)?shù)奶幚怼?
下表詳細(xì)描述了這些方法,以及他們?cè)贏ctivity整個(gè)生命周期中的位置。
請(qǐng)注意上表中可被殺死一列。它標(biāo)示了在方法返回后,還沒(méi)執(zhí)行Activity的其余代碼的任意時(shí)間里,系統(tǒng)是否可以殺死包含此Activity的進(jìn)程。三個(gè)方法(onPause()、 onStop()和onDestroy())被標(biāo)記為“是”。 onPause()是 三個(gè)中的第一個(gè),它也是 唯一一個(gè)在進(jìn)程被殺死之前必然會(huì)調(diào)用的方法──onStop() 和 onDestroy() 有可能不被執(zhí)行。因此你應(yīng)該用 onPause() 來(lái)將所有持久性數(shù)據(jù)(比如用戶的編輯結(jié)果)寫(xiě)入存儲(chǔ)之中。
在可被殺死一列中標(biāo)記為“否”的方法在它們被調(diào)用時(shí)將保護(hù)Activity所在的進(jìn)程不會(huì)被殺死。所以只有在onPause()方法返回后到 onResume() 方法被調(diào)用時(shí),一個(gè)Activity才處于可被殺死的狀態(tài)。在onPause()再次被調(diào)用并返回之前,它不會(huì)被系統(tǒng)殺死。
如后面一節(jié)進(jìn)程和生命周期所述,即使是在這里技術(shù)上沒(méi)有被定義為“可殺死”的Activity仍然有可能被系統(tǒng)殺死──但這僅會(huì)發(fā)生在實(shí)在沒(méi)有其它方法的極端情況之下。
保存Activity狀態(tài)
當(dāng)系統(tǒng)而不是用戶自己出于回收內(nèi)存的考慮,關(guān)閉了一個(gè)Activity之后。用戶會(huì)期望當(dāng)他再次回到那個(gè)Activity的時(shí)候,它仍保持著上次離開(kāi)時(shí)的樣子。
為了獲取Activity被殺死前的狀態(tài),你應(yīng)該為Activity實(shí)現(xiàn)onSaveInstanceState() 方法。Android在Activity有可能被銷毀之前(即onPause() 調(diào)用之前)會(huì)調(diào)用此方法。它會(huì)將一個(gè)以名稱-值對(duì)方式記錄了Activity動(dòng)態(tài)狀態(tài)的Bundle 對(duì)象傳遞給該方法。當(dāng)Activity再次啟動(dòng)時(shí),這個(gè)Bundle會(huì)傳遞給onCreate()方法和隨著onStart()方法調(diào)用的 onRestoreInstanceState(),所以它們兩個(gè)都可以恢復(fù)捕獲的狀態(tài)。
與onPause()或先前討論的其它方法不同,onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它們并不是總會(huì)被調(diào)用。比如說(shuō),Android會(huì)在Activity易于被系統(tǒng)銷毀之前調(diào)用 onSaveInstanceState(),但用戶動(dòng)作(比如按下了BACK鍵)造成的銷毀則不調(diào)用。在這種情況下,用戶沒(méi)打算再次回到這個(gè) Activity,所以沒(méi)有保存狀態(tài)的必要。
因?yàn)閛nSaveInstanceState()不是總被調(diào)用,所以你應(yīng)該只用它來(lái)為Activity保存一些臨時(shí)的狀態(tài),而不能用來(lái)保存持久性數(shù)據(jù)。而是應(yīng)該用onPause()來(lái)達(dá)到這個(gè)目的。
協(xié)調(diào)Activity
當(dāng)一個(gè)Activity啟動(dòng)了另外一個(gè)的時(shí)候,它們都會(huì)經(jīng)歷生命周期變化。一個(gè)會(huì)暫停乃至停止,而另一個(gè)則啟動(dòng)。這種情況下,可能需要協(xié)調(diào)好這些Activity:
生命周期回調(diào)順序是已經(jīng)定義好的,尤其是在兩個(gè)Activity在同一個(gè)進(jìn)程內(nèi)的情況下:
1. 調(diào)用當(dāng)前Activity的 onPause() 方法。
2. 接著,順序調(diào)用新啟動(dòng)Activity的onCreate()、 onStart()和onResume()方法。
3. 然后,如果啟動(dòng)的Activity不再于屏幕上可見(jiàn),則調(diào)用它的onStop()方法。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
