android-----橫豎屏切換對Activity生命週期的影響
前面我們分析過Activity的生命週期(見:android-----Activity生命週期),但是在現實應用中我們可能會對手機進行橫豎屏切換,那麼這樣的切換對Activity的生命週期有什麼影響呢?
先來看看例項:
public class Activity1 extends Activity{ public Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lifecycle); System.out.println("Activity1----->onCreate"); } @Override protected void onDestroy() { super.onDestroy(); System.out.println("Activity1----->onDestroy"); } @Override protected void onPause() { super.onPause(); System.out.println("Activity1----->onPause"); } @Override protected void onRestart() { super.onRestart(); System.out.println("Activity1----->onRestart"); } @Override protected void onResume() { super.onResume(); System.out.println("Activity1----->onResume"); } @Override protected void onStart() { super.onStart(); System.out.println("Activity1----->onStart"); } @Override protected void onStop() { super.onStop(); System.out.println("Activity1----->onStop"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); System.out.println("Activity1----->onRestoreInstanceState"); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); System.out.println("Activity1----->onSaveInstanceState"); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { System.out.println("現在是橫屏轉豎屏"); }else if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { System.out.println("現在是豎屏轉橫屏"); } } }
橫豎屏切換涉及到的是Activity的android:configChanges屬性,而與其android:launchMode屬性沒有關係;
android:configChanges可以設定的屬性值有:
(1)orientation:消除橫豎屏的影響
(2)keyboardHidden:消除鍵盤的影響
(3)screenSize:消除螢幕大小的影響
當我們設定Activity的android:configChanges屬性為orientation或者orientation|keyboardHidden或者不設定這個屬性的時候,Logcat輸出如下:
剛剛啟動Activity的時候:
Activity1----->onCreate
Activity1----->onStart
Activity1----->onResume
模擬器中按下Ctrl+F11或者Ctrl+F12由豎屏切換到橫屏:
Activity1----->onPause
Activity1----->onSaveInstanceState
Activity1----->onStop
Activity1----->onDestroy
Activity1----->onCreate
Activity1----->onStart
Activity1----->onRestoreInstanceState
Activity1----->onResume
模擬器中按下Ctrl+F11或者Ctrl+F12由橫屏切換到豎屏:
Activity1----->onPause
Activity1----->onSaveInstanceState
Activity1----->onStop
Activity1----->onDestroy
Activity1----->onCreate
Activity1----->onStart
Activity1----->onRestoreInstanceState
Activity1----->onResume
當我們設定Activity的android:configChanges屬性為orientation|screenSize或者orientation|screenSize|keyboardHidden,Logcat輸出如下:
剛剛啟動Activity的時候:
Activity1----->onCreate
Activity1----->onStart
Activity1----->onResume
模擬器中按下Ctrl+F11或者Ctrl+F12由豎屏切換到橫屏:
現在是豎屏轉橫屏
模擬器中按下Ctrl+F11或者Ctrl+F12由橫屏切換到豎屏:
現在是橫屏轉豎屏
可以發現在設定了orientation|screenSize屬性之後,在進行橫豎屏切換的時候呼叫的方法是onConfigurationChanged,而不會重新載入Activity的各個生命週期;
還有一點需要注意的是在進行橫豎屏切換的時候在呼叫onStop之前會呼叫onSaveInstanceState來進行Activity的狀態儲存,隨後在重新顯示該Activity的onResume方法之前會呼叫onRestoreInstanceState來恢復之前由onSaveInstanceState儲存的Activity資訊;
當然在顯示中我們可以遮蔽掉橫豎屏的切換操作,這樣就不會出現切換的過程中Activity生命週期重新載入的情況了,具體做法是,在Activity中加入如下語句:
android:screenOrientation="portrait" 始終以豎屏顯示
android:screenOrientation="landscape" 始終以橫屏顯示
如果不想設定整個軟體遮蔽橫豎屏切換,只想設定遮蔽某個Activity的橫豎屏切換功能的話,只需要下面操作:
Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);以豎屏顯示
Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);以橫屏顯示