2016年6月27日 星期一

[轉][Android]禁止旋轉螢幕時重新載入畫面(Don't reload, when rotate device)

Activity在執行時,可以直向或橫向顯示,當旋轉螢幕時,系統會自動做翻轉的動作。這在沒有載入資料的Activity中是沒問題的,但若有些資料是從網路下載下來,當旋轉螢幕時,會全部重新執行一次,因為Android對旋轉的做法是,把原先的Activity給Destroy掉,然後再Create一個新的不同方向的Activity。


如果不想讓Activity在旋轉螢幕時被自動轉向,可以在AndroidManifest.xml中設定Activity的屬性:
  • android:screenOrientation="portrait" (指定為直向)
  • android:configChanges="keyboard|keyboardHidden|orientation" (告訴系統,我要自己處理轉向問題)
android:configChanges="keyboard|keyboardHidden|orientation" 
android:screenOrientation="portrait">
原本我以為只要指定configChanges="orientation"來處理轉向就好,但不能單只有這個,還必須加上keyboard及keyboardHidden這兩個當螢幕鍵盤出現的時候也要處理,才能正常執行。

如此你可以在Activity的onConfigurationChanged方法中自己處理螢幕旋時要如何處理。

以下會做兩個測試,一個是有鎖定螢幕方向,一個沒有。

測試的程式碼:
public class RotationDeviceDemoActivity extends Activity {

    private final String TAG = "==DEMO==";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState");
    }
}

測試1:當Activity沒有設定configChanges及screenOrientation時(無鎖定螢幕方向)

執行結果:

523: D/==DEMO==(227): onCreate <===第一次開啟Activity
823: D/==DEMO==(227): onSaveInstanceState <===旋轉螢幕時可讓你儲存狀態
823: D/==DEMO==(227): onDestroy <===接著銷毀Activity
883: D/==DEMO==(227): onCreate <===然後從新建立一個新的已轉向的Activity
883: D/==DEMO==(227): onRestoreInstanceState <===並且可讓你取回剛才存下來的狀態

測試2:有設定configChanges及screenOrientation(鎖定螢幕方向)

執行結果:

184: D/==DEMO==(324): onCreate <===第一次開啟Activity
074: D/==DEMO==(324): onConfigurationChanged <===旋轉螢幕
554: D/==DEMO==(324): onConfigurationChanged <===再轉一次

你會發現,Activity這時不會儲存狀態及銷毀,它只會執行onConfigurationChanged,不管你轉幾次方向,都只會觸發這方法。你可以自行在這裡指定不同的layout佈局,或什麼都不做。
本文網址:http://blog.tonycube.com/2011/10/dont-reload-when-rotate-device.html

沒有留言: