在Activity中添加了 android:configChanges屬性,目的是當所指定屬性(Configuration Changes)發生改變時,通知程序調用 onConfigurationChanged()函數。java
經過一個例子來介紹:android
一、運行一個新建的Activity
函數
onCreate--> onStart--> onResume-->
二、按crtl+f12切換成橫屏時
spa
onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume-->
三、再按crtl+f12切換成豎屏時,發現打印了兩次相同的log
code
onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume--> onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume-->
四、修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",執行步驟2
xml
onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume-->
五、再執行步驟3,發現不會再打印相同信息,但多打印了一行onConfigChanged
生命週期
onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume--> onConfigurationChanged-->
六、把步驟4的android:configChanges="orientation" 改爲 android:configChanges="orientation|screenSize|keyboardHidden"(sdk>13時需加上screenSize),執行步驟2,就只打印onConfigChanged
get
onConfigurationChanged-->
七、執行步驟3
it
onConfigurationChanged--> onConfigurationChanged-->
總結:
一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
二、設置Activity的android:configChanges="orientation"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次。
三、設置Activity的android:configChanges="keyboardHidden"時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次。
四、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法,可是,自從Android 3.2(API 13),在設置Activity的android:configChanges="orientation|keyboardHidden"後,仍是同樣會從新調用各個生命週期的。由於screen size也開始跟着設備的橫豎切換而改變。因此,在AndroidManifest.xml裏設置的MiniSdkVersion和 TargetSdkVersion屬性大於等於13的狀況下,若是你想阻止程序在運行時從新加載Activity,除了設置"orientation", 你還必須設置"ScreenSize",才不會從新調用各個生命週期,只會執行onConfigurationChanged方法。例如:android:configChanges="orientation|screenSize|keyboardHidden"。io
五、屬性值,用「|」符號分隔開: