橫豎屏切換時候的生命週期以及configchanges介紹

一、橫豎屏切換時的生命週期執行順序

啓動activity時的執行:onCreate---onStart---onResume
橫豎屏切換時:onPause()----onSaveInstanceState()----onStop()----onDestroy()----onCreate()-----onStart()-----onRestoreInstanceState()----onResume()

可以看出,每次都是先銷燬再創建,如何讓其不是每一次都是創建一個新的呢,接下來就來看看configchanges屬性。該屬性可以設置多個值,用"|"隔開,例如:“locale|navigation|orientation。設置了android:configChanges屬性後,當指定的屬性發生變化時,不會去重新啓動Activity,而是通知程序去調用Activity的onConfigurationChanged()方法。

二、configchanges的屬性的介紹

再來看看configchanges都有哪些屬性值:

mcc:The IMSI mobile country code (MCC) has changed — a SIM has been detected and updated the MCC.
IMSI(國際移動用戶識別碼)發生改變,檢測到SIM卡,或者更新MCC
mnc:The IMSI mobile network code (MNC) has changed — a SIM has been detected and updated the MNC.
IMSI網絡發生改變,檢測到SIM卡,或者更新MCC
其中mcc和mnc理論上不可能發生變化
locale:The locale has changed — the user has selected a new language that text should be displayed in.
語言發生改變,用戶選擇了一個新的語言,文字應該重新顯示
touchscreen:The touchscreen has changed. (This should never normally happen.)
觸摸屏發生改變,這通常是不應該發生的
keyboard:The keyboard type has changed — for example, the user has plugged in an external keyboard.
鍵盤類型發生改變,例如,用戶使用了外部鍵盤
keyboardHidden:The keyboard accessibility has changed — for example, the user has revealed the hardware keyboard.
鍵盤發生改變,例如,用戶使用了硬件鍵盤
navigation:The navigation type (trackball/dpad) has changed. (This should never normally happen.)
導航發生改變,(這通常不應該發生) 舉例:連接藍牙鍵盤,連接後確實導致了navigation的類型發生變化。因爲連接藍牙鍵盤後,我可以使用方向鍵來navigate了
screenLayout:The screen layout has changed — this might be caused by a different display being activated.
屏幕的佈局發生改變,這可能導致激活不同的顯示
fontScale:The font scaling factor has changed — the user has selected a new global font size.
全局字體大小縮放發生改變
orientation:The screen orientation has changed — that is, the user has rotated the device.設備旋轉,橫向顯示和豎向顯示模式切換。
screenSize: 屏幕大小改變了
smallestScreenSize: 屏幕的物理大小改變了,如:連接到一個外部的屏幕上

三、關於configchanges舉例說明

簡言之,在Activity中添加了android:configChanges屬性,目的是當android:configChanges所設置的屬性值對應的配置屬性發生改變時,通知程序調用 onConfigurationChanged()函數,而不是重啓Activity。

比如上邊說的橫豎屏切換,當在mainfest中配置了

android:configChanges="orientation|screenSize|keyboardHidden"

之後,橫豎屏切換時只會執行onConfigurationChanged()方法而不會重啓activity

四、onSaveInstanceState()和onRestoreInstanceState()的觸發執行

官網上的介紹是:Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)

也就是說當某個activity變得容易被系統銷燬時,該activity的onSaveInstanceState就會被執行,除非該activity是被用戶主動銷燬的,例如當用戶按BACK鍵的時候。什麼是容易被系統銷燬,那就是還沒有銷燬,而是一種可能性,那麼這種可能性有哪些呢?當一個activity在棧頂顯示時,哪些操作能夠觸發onSaveInstanceState()的執行呢?

1、上邊已經提到的橫豎屏的切換

2、Home鍵返回桌面的時候執行時:onPause()----onSaveInstanceState()----onStop()

3、直接後臺切換到其他應用

4、直接鎖屏的時候

所以,從上邊的可能性可以看出,onSaveInstanceState()的調用遵循一個重要原則,即當系統“未經你許可銷燬了你的activity,而不是你自己手動銷燬的,這時候onSaveInstanceState會被系統調用,這是系統的責任,因爲它必須要提供一個機會讓你保存你的數據。

而onRestoreInstanceState被調用的前提是,activity A“確實”被系統銷燬了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用,例如,當正在顯示activityA時,這時候直接按下電源鍵鎖屏,那麼會執行onSaveInstanceState(),緊接着再打開屏幕,這時候activityA不會被系統銷燬,所以不會執行onRestoreInstanceState()。

所以這裏就需要注意了:onSaveInstanceState()和onRestoreInstanceState()並不一定會成對調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章