Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 活動的生命周期

Android 活動的生命周期

編輯:關於Android編程

1.返回棧

Android 是使用任務(Task)來管理活動的,一個任務就是一組存放在棧裡的活動的集合,這個棧也被稱作返回棧(Back Stack)。棧是一種後進先出的數據結構,在默認情況下,每當我們啟動了一個新的活動,它會在返回棧中入棧,並處於棧頂的位置。而每當我們按下 Back 鍵或調用 finish()方法去銷毀一個活動時,處於棧頂的活動會出棧,這時前一個入棧的活動就會重新處於棧頂的位置。系統總是會顯示處於棧頂的活動給用戶。

 

活動返回棧

2.活動狀態

 

(1)運行狀態

活動位於返回棧棧頂時,活動就處在運行狀態,系統最不願回收的就是處於運行狀態的活動。

(2)暫停狀態

活動不再處於棧頂位置,但仍然可見時活動進入暫停狀態。因為並不是每一個活動都會占滿整個屏幕的,比如對話框形式的活動只會占用屏幕中間的部分區域,所以位於這種活動後面的活動仍是可見的,處於暫停狀態。處於暫停狀態的活動仍然是完全存活著的,系統也不願意回收這種活動(因為它還是可見的,回收可見的東西都會在用戶體驗方面有不好的影響) ,只有在內存極低的情況下,系統才會去考慮回收這種活動。

(3)停止狀態

當一個活動不再處於棧頂位置,並且完全不可見時,就進入了停止狀態。系統會為這種活動保存相應的狀態和成員變量,但是這並不是完全可靠的,當其他地方需要內存時,處於停止狀態的活動有可能會被系統回收。

(4)銷毀狀態

當一個活動從返回棧中移除後就變成了銷毀狀態。系統會最傾向於回收處於這種狀態的活動,從而保證手機的內存充足

4.活動的生存期

Activity類中定義了七個回調方法,覆蓋活動生命周期的每一個環節。

(1)onCreate()

會在活動第一次被創建的時候調用。你應該在這個方法中完成活動的初始化操作,比如說加載布局、綁定事件等。

(2)onStart()

這個方法在活動由不可見變為可見的時候調用。

(3)onResume()

這個方法在活動准備好和用戶進行交互的時候調用。 此時的活動一定位於返回棧的棧頂,並且處於運行狀態。

(4)onPause()

這個方法在系統准備去啟動或者恢復另一個活動的時候調用。 我們通常會在這個方法中將一些消耗 CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。

(5)onStop

這個方法在活動完全不可見的時候調用。它和onPause()方法的主要區別在於,如果啟動的新活動是一個對話框式的活動,那麼 onPause()方法會得到執行,而 onStop()方法並不會執行。

(6)onDestory()

這個方法在活動被銷毀之前調用,之後活動的狀態將變為銷毀狀態。

(7)onRestart()

這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。

七種方法除了onRestart()外兩兩相對。

(1)完整生命周期

onCreate()和onDestory()之間經歷的過程就是完整的生存周期。onCreate() 完成初始化 onDestory()釋放內存。

(2)可見生存期

onStart()和onStop()之間 是可見周期。

活動對於用戶總是可見的,即便有可能無法和用戶進行交互。

我們可以通過這兩

個方法,合理地管理那些對用戶可見的資源。比如在 onStart()方法中對資源進行加載,而在onStop()方法中對資源進行釋放, 從而保證處於停止狀態的活動不會占用過多內存。

(3)前台生存期

onResume()方法和 onPause()方法之間。可進行互動。

 

活動生命周期

 

5.活動被回收

活動在停止狀態可能被系統回收。

用戶在活動 A 的基礎上啟動了活動 B,活動 A 就進入了停止狀態,這個時候由於系統內存不足,將活動 A 回收掉了,然後用戶按下 Back 鍵返回活動A不會執行 onRestart()方法,而是會執行活動 A 的 onCreate()方法,因為活動 A 在這種情況下會被重新創建一次。

活動被系統回收時默認情況下會回收資源,用戶體驗不好,可以通過onSaveInstanceState()這個方法會保證一定在活動被回收之前調用, 因此我們可以通過這個方法來解決活動被回收時臨時數據得不到保存的問題。

onSaveInstanceState()方法會攜帶一個 Bundle 類型的參數,Bundle 提供了一系列的方法用於保存數據,比如可以使用 putString()方法保存字符串,使用 putInt()方法保存整型數據,以此類推。每個保存方法需要傳入兩個參數,第一個參數是鍵,用於後面從 Bundle中取值,第二個參數是真正要保存的內容。

protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}

onCreate()方法其實也有一個 Bundle類型的參數。這個參數在一般情況下都null,但是當活動被系統回收之前有通過onSaveInstanceState()方法來保存數據的話,這個參數就會帶有之前所保存的全部數據,我們只需要再通過相應的取值方法將數據取出即可。

if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved