android轉屏,切換螢幕,橫豎屏(onConfigurationChanged)會重新 OnCreate 的解決方案

鴨脖發表於2012-09-02

android:configChanges="keyboardHidden|orientation"屬性,轉屏的時候就會不再重新呼叫OnCreate()函式,而是呼叫onConfigurationChanged()。


 


但是在自從android3.2以後,再這樣設定的話,會發現轉屏後仍然會呼叫OnCreate(),而不是onConfigurationChanged();跟蹤framework層程式碼,就會發現問題所在,是由於google在android3.2中新增了screensize改變的通知,在轉屏的時候,不僅是orientation發生了改變,screensize同樣也發生了改變,而在判斷是呼叫onConfigurationChanged還是OnCreate時,採用的是如下判斷:


 


int diff = activity.mCurrentConfig.diff(config);


if (diff != 0) {


// If this activity doesn't handle any of the config changes then don't bother calling onConfigurationChanged as we'regoing to destroy it.


if ((~activity.mActivityInfo.getRealConfigChanged() & diff) == 0) {


shouldChangeConfig = true;


}


}


 


public int getRealConfigChanged() {


return applicationInfo.targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB_MR2 ? (configChanges | ActivityInfo.CONFIG_SCREEN_SIZE


| ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) : configChanges;


}


 


 


通過上面的分析,可發現有兩種方法解決該問題:(只需要修改AndroidManifest.xml)


1.指定android:configChanges="keyboardHidden|orientation|screenSize",其他的程式碼和以前的程式碼一樣處理;


2.在AndroidManifest.xml中指定targetSdkVersion為3.2以前的版本(3.2的版本號為13),系統會自動加上screenSize屬性值。


比如:<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="12" />


 


建議使用第一種方法。

相關文章