1. 程式人生 > >android-----橫豎屏切換對Activity生命週期的影響

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);以橫屏顯示