onConfigurationChanged 不生效問題解決方案:android
1).首先,須要重寫onConfigurationChanged函數app
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//do something
}ide
2). 須要在AndroidManifest.xml的Activity中配置android:configChanges參數。函數
<activity android:name=".StationListActivity"
android:configChanges="locale|layoutDirection" //4.2以後的版本中必現添加layoutDirection屬性,不然onConfigurationChanged不生效。
android:windowSoftInputMode="adjustNothing"
android:screenOrientation="portrait">
</activity>字體
3)詳解以下:this
API原文說明:
android:configChanges
Lists configuration changes that the activity will handle itself. When a configuration change occurs at runtime, the activity is shut down and restarted by default, but declaring a configuration with this attribute will prevent the activity from being restarted. Instead, the activity remains running and its onConfigurationChanged() method is called.spa
Any or all of the following strings are valid values for this attribute. Multiple values are separated by '|' — for example, "locale|navigation|orientation".rest
All of these configuration changes can impact the resource values seen by the application. Therefore, when onConfigurationChanged() is called, it will generally be necessary to again retrieve all resources (including view layouts, drawables, and so on) to correctly handle the change.xml
以上文檔在較早版本中摘錄,確少android 4.2以後的版本中的配置,須要參考最新的開發文檔。必須屬性layoutDirection。blog
在一些特殊的狀況中,你可能但願當一種或者多種配置改變時避免從新啓動你的activity。你能夠經過在manifest中設置android:configChanges屬性來實現這點。
你能夠在這裏聲明activity能夠處理的任何配置改變,當這些配置改變時不會從新啓動activity,而會調用activity的onConfigurationChanged(Resources.Configuration)方法。
若是改變的配置中包含了你所沒法處理的配置(在android:configChanges並未聲明),你的activity仍然要被從新啓動,而onConfigurationChanged(Resources.Configuration)將不會被調用。
其次:android:configChanges=""中能夠用的值:keyboard|mcc|mnc|locale|touchscreen|keyboardHidden|navigation|orientation……
Configuration 類中包含了不少種信息,例如系統字體大小,orientation,輸入設備類型等等.(如上圖)
好比:android:configChanges="orientation|keyboard|keyboardHidden"
當Configuration改變後,ActivityManagerService將會發送"配置改變"的廣播,會要求ActivityThread 從新啓動當前focus的Activity.
這是默認狀況,咱們不作任何處理,若是咱們android:configChanges來配置Activity信息,那麼就能夠避免對Activity銷燬再從新建立,而是調用onConfigurationChanged方法。
經過查閱Android API能夠得知android:onConfigurationChanged實際對應的是Activity裏的onConfigurationChanged()方法。
在AndroidManifest.xml中添加上訴代碼的含義是表示在改變屏幕方向、彈出軟件盤和隱藏軟鍵盤時,再也不去執行onCreate()方法,而是直接執行onConfigurationChanged()。
若是不申明此段代碼,按照Activity的生命週期,都會去執行一次 onCreate()方法,而onCreate()方法一般會在顯示以前作一些初始化工做。
因此若是改變屏幕方向這樣的操做都去執行onCreate() 方法,就有可能形成重複的初始化,下降程序效率是必然的了,並且更有可能由於重複的初始化而致使數據的丟失。這是須要千萬避免的。