引言
應用程序組件有一個生命周期——一開始Android實例化他們響應意圖,直到結束實例被銷毀。在這期間,他們有時候處于激活狀態,有時候處于非激活狀態;對于活動,對用戶有時候可見,有時候不可見。組件生命周期將討論活動、服務、廣播接收者的生命周期——包括在生命周期中他們可能的狀態、通知狀態改變的方法、及這些狀態的組件寄宿的進程被終結和實例被銷毀的可能性。
本文主要討論活動的生命周期及他們可能的狀態、通知狀態改變的方法。分為以下三部分:
- 1、活動生命周期
- 2、保存活動狀態
- 3、協調活動
1、活動生命周期
一個活動有三個基本狀態:
- 激活狀態 或 運行狀態 ,這時它運行在屏幕的前臺(處于當前任務活動棧的最上面)。這個活動有用戶的操作的焦點。
- 暫停狀態 ,這時活動失去焦點但是它對用戶仍可見。也就是說,另一個活動在它的上面且那個活動是透明的或者沒有覆蓋整個屏幕,因此通過它可以看見暫停狀態的活動。一個暫停的活動完全是活著的(它維護著所有的狀態和成員信息,且仍然依附在窗口管理器),但是 當內存極小時 可以被系統殺掉。
- 停止狀態 ,這時活動完全被其他活動掩蓋。它仍然保留所有狀態和成員信息,但是對用戶它不可見,因此它的窗口時隱藏的且 當其他地方需要內存時 它往往被系統殺掉。
如果一個活動被暫停或停止,系統可以將它從內存移除,通過要求它結束(通過調用它的 finish() 方法),或簡單地殺掉它的進程。當它再次顯示給用戶時,必須要完全重新啟動和恢復到之前的狀態。隨著活動從一個狀態轉為另一個狀態,通過調用下面的受保護的方法通知該改變:
- void onCreate(Bundle saveInstanceState )
- void onStart()
- void onRestart()
- void onResume()
- void onPause()
- void onStop()
- void onDestroy()
所有這些方法都是鉤子,你可以重寫當狀態改變時做適當的工作。所有的活動必須要實現 onCreate() 去做一些初始化的設置,當對象第一次實例化的時候。很多活動也會實現 onPause() 去提交數據修改或準備停止與用戶交互。
將他們合并在一起,這七個方法定義了活動的整個生命周期。有三個嵌套的循環,你可以通過這七個方法監視:
- 活動的整個生命時間 ,從第一次調用 onCreate() 開始直到調用 onDestroy() 結束。一個活動在 onCreate() 中做所有的“全局”狀態的初始設置,在 onDestroy() 中釋放所有保留的資源。舉例來說,有一個線程運行在后臺從網絡上下載數據,它可能會在 onCreate() 中創建線程,在 onDestroy() 中結束線程。
- 活動的可視生命時間 ,從調用 onStart() 到相應的調用 onStop() 。在這期間,用戶可以在屏幕上看見活動,雖然它可能不是運行在前臺且與用戶交互。在這兩個方法之間,你可以保持顯示活動所需要的資源。舉例來說,你可以在 onStart() 中注冊一個廣播接收者監視影響你的UI的改變,在 onStop() 中注銷。因為活動在可視和隱藏之間來回切換, onStart() 和 onStop() ? 可以調用多次。
- 活動的前臺生命時間 ,從調用 onResume() 到相應的調用 onPause() 。在這期間,頻繁地在重用和暫停狀態轉換——例如,當設備進入睡眠狀態或一個新的活動啟動時調用 onPause() ,當一個活動返回或一個新的意圖被傳輸時調用 onResume() 。因此,這兩個方法的代碼應當是相當輕量級的。
下面這個圖解釋了這三個循環和狀態之間狀態的可能路徑。著色的橢圓表示活動的主要狀態,矩形表示當活動在狀態之間轉換時你可以執行的回調方法。
?
?
?
?
?
?
?
?
圖1、活動生命周期(來源:Android SDK)
下面的表格對每個方法更詳細的描述和在活動的整個生命周期中的定位。
注意上面表格的 Killable 列,它表示當方法返回時沒有執行活動的其它代碼,系統是否能殺死活動寄宿的進程。三個方法( onPause() 、 onStop() 、 onDestroy() )標記為 Yes 。因為 onPause() 是唯一一個保證在進程被殺之前會調用的,因此你應該使用 onPause() 來寫任何持久化存儲數據。
被標記為 No 的方法保護活動寄宿的進程在他們調用的時候不會被殺掉。因此活動是可殺掉狀態,例如 onPause() 返回到 onResume() 調用期間。直到 onPause() 再次返回,活動是不可殺掉的。其實,沒有標記為 Killable 的活動也是可以系統被殺掉的,不過這僅僅發生在極端困難的情況下,沒有有任何其他資源可用。
2、保存活動狀態
當系統而不是用戶關閉一個活動來節省內存時,用戶可能希望返回到活動且是它之前的狀態。為了獲得活動被殺之前的狀態,你可以執行活動的 onSaveInstanceState() 方法。Android在活動容易被銷毀前調用這個方法,也就是調用 onPause() 之前。該方法的參數是一個 Bundle 對象,在這個對象你可以以名值對記錄活動的動態狀態。當活動再次啟動時, Bundle 同時被傳遞到 onCreate() 和調用 onCreate() 之后的方法, onRestoreInstanceState() ,因此使用一個或兩個可以重新創建捕獲的狀態。
因為 onSaveInstanceState() 方法不總是被調用,你應該僅使用 onSaveInstanceState() 它來記錄活動的臨時狀態,而不是持久的數據。應該使用 onPause() 來存儲持久數據。
3、協調活動
當一個活動啟動另一個活動,他們都經歷生命周期轉換。一個暫停或許是停止,然而另一個啟動。有時,你可能需要協調這些活動。生命周期的回調順序是明確界定的,特別是當這兩個活動在同一個進程中:
- 當前活動的 onPause() 方法被調用。
- 接下來,啟動活動的 onCreate() 、 onStart() 、 onResume() 方法按序被調用。
- 然后,如果獲得不再在屏幕上可見,它的 onStop() 方法被調用。
修正
:第一節
——
活動生命周期中的表格第一、二行中的第二列(description)中的onRestart()應該為onStart()。
1000多的點擊,居然沒有人發現這個錯誤,看了大家根本就沒認真看或者說根本沒有靜心看園子里的任何博文,心痛!還是水帖比較受歡迎。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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