Activity 生命周期及其棧管理方式


Activity 生命周期

Android 系統用棧的形式管理 Activity , 當新的 Activity 被創建是, 會被放置到棧頂, 這個 Activity 會進入到運行狀態, 而前一個 Activity 則會被壓入棧, 直到新的 Activity 退出, 否則不會出現在前台。

單個 Activity 的生命周期狀態以及生命周期方法

根據 Android 文檔, 每一個 Activity 都有四個狀態, 它們分別是:

  • 當 Activity 位於屏幕的最前面(棧頂),稱之為 運行(活動)狀態:
  • 當 Activity 失去焦點, 但是依舊可見, 比如被非全屏的對話框遮住部分, 稱之為 暫停狀態 , 暫停的 Activity 依然是活動的, 但是當系統內存嚴重不足時, 有可能被系統結束;
  • 當 Activity 完全不可見時, 稱之為 停止狀態 , 這時 Activity 依然保持其狀態以及成員信息, 不過由於此時 Activity 對用戶不可見, 當系統其它地方需要內存時, 經常會被結束;
  • 當 Activity 由不可見變成可見時, 稱之為 重啟狀態 , 這時 Activity 必須迅速恢復它以前的狀態。

下圖表示 Activity 在這四種狀態之間切換的生命周期, 以及狀態切換時調用的對應的方法:

Activity lifecycle

Activity 生命周期中的各個方法描述如下:

  • onCreate() 當 Activity 首次創建時調用, 這里通常的工作是創建視圖, 綁定數據到列表等。 這個方法還有一個 Bundle 參數, 如果這個 Activity 之前由凍結的狀態, 這個狀態將包含在里面。 之后, 通常會接着調用 onStart() 方法。
  • onRestart() Activity 已經被停止, 在其被重新開始之前調用。 接下來回調用 onStart() 方法。
  • onStart() 當 Activity 變到用戶可見時調用, 接下來如果 Activity 變成不可見的話, 將會調用 onStop() , 否則將調用 onResume() 。
  • onResume() 當 Activity 開始能和用戶交互時調用, 此時的 Activity 位於棧頂, 接下來通常會調用 onPause() 。
  • onPause() 當系統准備開始一個新的 Activity 或者重置一個已有的 Activity 時調用。 通常需要在這里進行保存數據、 停止動畫以及其它占用 CPU 資源的活動等。 這個方法完成之前, 下一個 Activity 不會繼續, 所以這個方法的必須較快的完成。 接下來如果 Activity 又回到棧頂將調用 onResume() , 如果 Activity 變的不可見, 將調用 onStop() 。
  • onStop() 當 Activity 不可見時調用, 如果 Activity 變的可見, 將會調用 onRestart() , 如果 Activity 將銷毀, 調用 onDestroy() 。
  • onDestroy() 這是 Activity 被銷毀之前最后一次調用, 可能是調用了 Activity 的 finish() 方法, 或者系統要回收資源, 這兩者可以通過 isFinishing() 方法進行區別。

多個 Activity 的棧管理方式

多個 Activity 之間采用的是棧道管理方式, 當用戶啟動新的 Activity 時, 新啟動的 Activity 位於棧頂,當用戶按后退按鈕時, 棧頂的 Activity 被推出棧道並銷毀, 如下圖所示:

Activity Stack Manage

生命周期測試代碼

我們在上次創建的程序中添加 Activity 的生命周期代碼, 並加入一些輸出, 以便清晰的理解:

[Activity(Label = "MyFirstApp", MainLauncher = true)]
public class MainActivity : Activity {
	
	public const string ExtraMessage = "Cn.Beginor.MyFirstApp.MainActivity.ExtraMessage";
	
	protected override void OnCreate(Bundle bundle) {
		base.OnCreate(bundle);
		/** 其它代碼省略 **/
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
	}

	protected override void OnStart() {
		base.OnStart();
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
	}

	protected override void OnResume() {
		base.OnResume();
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
	}

	protected override void OnPause() {
		base.OnPause();
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
	}

	protected override void OnStop() {
		base.OnStop();
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
	}

	protected override void OnRestart() {
		base.OnRestart();
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
	}

	protected override void OnDestroy() {
		base.OnDestroy();
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);
		Android.Util.Log.Debug("Debug", this.GetType().Name + "." + this.IsFinishing);
	}
}

以上是 MainActivity 添加的生命周期代碼, 由於代碼完全一直, 就不在貼出來了。 接下來開始調試, 首先會啟動 MainActivity , 從輸出窗口能看到下面的提示:

MainActivity.OnCreate
MainActivity.OnStart
MainActivity.OnResume

點擊“發送”按鈕,啟動 SecondActivity ,看到下面的提示:

MainActivity.OnPause
SecondActivity.OnCreate
SecondActivity.OnStart
SecondActivity.OnResume
MainActivity.OnStop

點擊返回按鈕, 返回 MainActivity , 得到的提示如下:

SecondActivity.OnPause
MainActivity.OnRestart
MainActivity.OnStart
MainActivity.OnResume
SecondActivity.OnStop
SecondActivity.OnDestroy
SecondActivity.IsFinishing = True

再次點擊“發送”按鈕,啟動 SecondActivity ,看到下面的提示(與第一次是一致的):

MainActivity.OnPause
SecondActivity.OnCreate
SecondActivity.OnStart
SecondActivity.OnResume
MainActivity.OnStop

這時, 如果點擊 Home 按鈕, 會得到下面的提示:

SecondActivity.OnPause
SecondActivity.OnStop

點擊“最近程序”按鈕, 打開 MyFirstApp , 會看到下面的提示:

SecondActivity.OnRestart
SecondActivity.OnStart
SecondActivity.OnResume

如果在 MainActivity 點擊“返回”按鈕, 應用將會退出, 可以看到下面的提示:

MainActivity.OnPause
MainActivity.OnStop
MainActivity.OnDestroy
MainActivity.IsFinishing = True

至此, 整個生命周期測試完成, 有了上面的測試, 應該可以對 Android 的 Activity 生命周期有一個比較清楚的認識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM