接上篇,儘管這個對旋轉沒有啥用但不代表麼用。一個Activity如果在onReusume裡沒有特別聲明,或沒在AndroidManifest.xml配置成橫屏或豎屏,在旋轉時其聲明周期為:onCreate------onStart---onResume---旋轉螢幕----onPause(是去焦點)----onStop(徹底看不見)---onDestory,然後重新onCreate---onStart----onResume,即又走了一遍。為此需要強制設為橫屏或豎屏,方法大概三種:
1、AndroidManifest.xml 裡面設定,
android:name="org.yanzi.testrotateimageview.MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
>
2、在onResume裡
if(getRequestedOrientation()!=ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
super.onResume();
這種方法強烈不建議,誰用誰知道,在大的app不同方向啟動時會慢的要死!
3、在onConfigurationChanged裡判斷,為了onConfigurationChanged在監聽螢幕方向變化有效需要以下條件:
a、AndroidManifest.xml增加許可權:
b、AndroidManifest.xml裡設定的MiniSdkVersion和 TargetSdkVersion屬性大於等於13
c、在AndroidManifest.xml的Activity裡增加:
android:configChanges="keyboard|screenSize|orientation|layoutDirection"
經過上面就可以在onConfigurationChanged()檢測螢幕方向變化事件,如果一旦在AndroidManifest.xml裡設死了方向,這塊就失效了。newConfig.orientation = 1 時表示豎屏,為2則橫屏。通過判斷這,然後setRequestedOrientation()來設定橫屏或豎屏。
這個onConfigurationChanged()相關的配置,最大的好處讓Activity方向變化時不進行onPause onStop。。。等操作,但如果想通過setRequestOrientation的方式設定橫屏或豎屏,帶來的負面效果跟第2種方式一樣,慢的要死。
總之,方向還是在配置裡寫死吧!!!如果需要旋轉可以用RotateImageView及後面會提到的旋轉布局,該布局能讓它裡面的子控制項進行旋轉,而不影響父布局及Activity的生命週期。
相關參考 延伸閱讀: 連結1 連結2 連結3