天天看點

Activity的生命周期

典型情況下的生命周期分析

Activity的生命周期

Activity生命周期

  1. activity 第一次啟動 :

    onCreate

    ->

    onStart

    onResume

  2. 使用者打開新activity,原activity的過程 :

    onPause

    onStop

    .(如果新activity采用透明主題,目前activity不會調用

    onStop

    )
  3. 再次回到原activity :

    onRestart

    onStart

    onResume

  4. 使用者按回退鍵 :

    onPause

    onStop

    onDestory

  5. 螢幕息屏 :
  6. 螢幕亮屏 :
  7. onCreate

    ,

    onDestory

    表示一個activity的建立和銷毀,一次生命周期過程中,隻能調用一次.
  8. onStart

    onStop

    是從activity的是否可見
  9. onResume

    onPause

    是從activity是否位于前台來判斷的
新頁面啟動時,舊Activity 調用

onPause

後,新Activity才調用

onResume

.

onPause

->新

onCreate

onStart

onResume

->舊

onStop

是以,不能在

onPause

中做耗時的操作.

異常情況下生命周期分析

Activity的生命周期

activity異常中斷生命周期

常見的兩種情況下,導緻Activity重建

  1. 資源相關的系統配置發生改變導緻Activity被殺死後重建
  2. 資源記憶體不足導緻優先級低的Activity被殺死

異常重建過程中,資料的儲存和恢複

Activity被異常終止後,會調用

onSaveInstanceState

方法, 改方法在

onStop

之前調用,使用

Bundle

對象來儲存資料.正常結束Activity生命周期的過程是不會調用

onSaveInstanceState

方法.

Activity 重建後, 将調用

onRestoreInstanceState

用于恢複資料,銷毀時儲存的

Bundle

資料,将以回調參數的形式傳回給

onRestoreInstanceState

,和

onCreate

正常啟動時,

onCreate

中的

Bundle

為空,異常重建時不為空.

是以,在

onCreate

中恢複資料,需要判斷

Bundle

資料是否為空,而

onRestoreInstanceState

隻有異常重建時,才會被調用.

官方建議,在

onRestoreInstanceState

中恢複資料.

onSaveInstanceState

onRestoreInstanceState

系統自動恢複某些資料

系統在Activity異常銷毀過程中,會為我們儲存目前Activity的視圖結構,并在重建過程中恢複.

如 文本輸入框的 輸入資料, 清單滾動的位置, TextView中的選中狀态和文本内容

Activity的優先級

  1. 前台Activity (正在和使用者互動的Activity) 優先級最高
  2. 可見但非前台Activity (如被對話框擋住的Activity)
  3. 背景Activity (onStop) 優先級最低

當系統記憶體不足時, 按照上述優先級去殺死目标Activity所在的程序.

配置改變後,不銷毀Activity

Android 配置檔案中, 可以給Activity指定

configChanges

屬性, 不讓Activity銷毀.

  • configChanges含義
說明
“mcc” IMSI 移動國家/地區代碼 (MCC) 發生了變化 - 檢測到了 SIM 并更新了 MCC。
“mnc” IMSI 移動網絡代碼 (MNC) 發生了變化 - 檢測到了 SIM 并更新了 MNC。
“locale” 語言區域發生了變化 — 使用者為文本選擇了新的顯示語言。
“touchscreen” 觸摸屏發生了變化。(這種情況通常永遠不會發生。)
“keyboard” 鍵盤類型發生了變化 — 例如,使用者插入了一個外置鍵盤。
“keyboardHidden” 鍵盤無障礙功能發生了變化 — 例如,使用者顯示了硬體鍵盤。
“navigation” 導航類型(軌迹球/方向鍵)發生了變化。(這種情況通常永遠不會發生。)
“screenLayout” 螢幕布局發生了變化 — 這可能是由激活了其他顯示方式所緻。
“fontScale” 字型縮放系數發生了變化 — 使用者選擇了新的全局字号。
“uiMode” 使用者界面模式發生了變化 — 這可能是因使用者将裝置放入桌面/車載基座或夜間模式發生變化所緻。 請參閱 UiModeManager。 此項為 API 級别 8 中新增配置。
“orientation” 螢幕方向發生了變化 — 使用者旋轉了裝置。注:如果您的應用面向 API 級别 13 或更進階别(按照 minSdkVersion 和 targetSdkVersion 屬性所聲明的級别),則還應聲明 "screenSize" 配置,因為當裝置在橫向與縱向之間切換時,該配置也會發生變化。
“screenSize” 目前可用螢幕尺寸發生了變化。它表示目前可用尺寸相對于目前縱橫比的變化,是以會在使用者在橫向與縱向之間切換時發生變化。 不過,如果您的應用面向 API 級别 12 或更低級别,則 Activity 始終會自行處理此配置變更(即便是在 Android 3.2 或更高版本的裝置上運作,此配置變更也不會重新啟動 Activity)。此項為 API 級别 13 中新增配置。
“smallestScreenSize” 實體螢幕尺寸發生了變化。它表示與方向無關的尺寸變化,是以隻有在實際實體螢幕尺寸發生變化(如切換到外部顯示器)時才會變化。 對此配置的變更對應于smallestWidth 配置的變化。 不過,如果您的應用面向 API 級别 12 或更低級别,則 Activity 始終會自行處理此配置變更(即便是在 Android 3.2 或更高版本的裝置上運作,此配置變更也不會重新啟動 Activity)。此項為 API 級别 13 中新增配置。
“layoutDirection” 布局方向發生了變化。例如,從從左至右 (LTR) 更改為從右至左 (RTL)。 此項為 API 級别 17 中新增配置。

如要禁止螢幕翻轉,導緻Activity銷毀,可做如下操作

<activity android:name=".MyActivity"
          android:configChanges="orientation|“screenSize”"
          android:label="@string/app_name">
           

如果螢幕發生旋轉,Activity不會銷毀,但是會回調

onConfigurationChanged

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
           

參考

  1. Android開發藝術探索(任玉剛)
  2. Understand the Activity Lifecycle(android官方教程)

繼續閱讀