Android強制橫屏或豎屏注意事項
經過Android5.1測試:
一個Activity如果在onReusume裡沒有特別宣告,或沒在AndroidManifest.xml配置成橫屏或豎屏,在旋轉時其宣告週期為:onCreate——onStart—onResume—螢幕旋轉—-onPause(失去焦點)—-onStop(徹底看不見)—onDestory,然後重新onCreate—onStart—-onResume,即又走了一遍。
02-17 15:47:17.933 E/MainActivity( 7461): start onSaveInstanceState~~~
02-17 15:47:17.933 E/MainActivity( 7461): start onPause~~~
02-17 15:47:17.933 E/MainActivity( 7461): start onStop~~~
02-17 15:47:17.933 E/MainActivity( 7461): start onDestroy~~~
02-17 15:47:17.974 E/MainActivity( 7461): start onCreate~~~
02-17 15:47:17.994 E/MainActivity( 7461): start onStart~~~
02-17 15:47:17.994 E/MainActivity( 7461): start onRestoreInstanceState~~~
02-17 15:47:17.994 E/MainActivity( 7461): start onResume~~~
為此需要強制設為橫屏或豎屏,方法大概三種:
1、AndroidManifest.xml 裡面設定
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation ="landscape">
</activity>
2、在onResume裡
@Override
protected void onResume() {
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
super.onResume();
}
這種方法強烈不建議,誰用誰知道,在大的app不同方向啟動時會慢的要死!如果在AndroidManifest.xml中設定了android:configChanges=”orientation”,豎屏狀態開啟也會呼叫onConfigurationChanged介面
02-17 15:51:05.696 E/MainActivity( 7666): start onCreate~~~
02-17 15:51:05.756 E/MainActivity( 7666): start onStart~~~
02-17 15:51:05.856 E/MainActivity( 7666): start onResume~~~
02-17 15:51:05.896 E/MainActivity( 7666): start onConfigurationChanged~~~
3、在onConfigurationChanged裡判斷,為了onConfigurationChanged在監聽螢幕方向變化有效需要以下條件:
a、AndroidManifest.xml增加許可權(經過測試5.1不需要,其它自己測試看吧)
b、AndroidManifest.xml裡設定的MiniSdkVersion和TargetSdkVersion屬性大於等於13(經過測試5.1已經是22,自然不需要)
c、在AndroidManifest.xml的Activity裡增加(經過測試5.1只需要orientation,其它自己測試,可能還需要screenSize和layoutDirection):
android:configChanges=”orientation”
經過上面就可以在onConfigurationChanged()檢測螢幕方向變化事件,如果一旦在AndroidManifest.xml裡設死了方向,這塊就失效了。newConfig.orientation = 1 時表示豎屏,為2則橫屏。通過判斷這,然後setRequestedOrientation()來設定橫屏或豎屏。
這個onConfigurationChanged()相關的配置,最大的好處讓Activity方向變化時不進行onPause/onStop/onDestory等操作,但如果想通過setRequestOrientation的方式設定橫屏或豎屏,帶來的負面效果跟第2種方式一樣,慢的要死。
總之,方向還是在配置裡寫死吧!