?不積跬步,無以至千里;不積小流,無以成江海。騏驥一躍,不能十步,駑馬十駕,功在不舍。---------[荀子](http://baike.baidu.com/view/2776.htm)《[勸學篇](http://baike.baidu.com/view/247920.htm)》
今天遇到了一個關于orientation的問題查了點資料記錄一下,只有點點滴滴的積累,才能讓我們更加強壯,如有謬誤歡迎大家批評指正?
在Android默認情況,當“屏幕方向”或“鍵盤顯示隱藏”變化時都會銷毀當前Activity,創建新的Activity。如果不希望重新創建Activity實例,可以在AndroidManifest.xml中配置Activity:<activity android:name=".MainActivity" android:configChanges="keyboardHidden|orientation" >這樣就不會銷毀重建了在配置了這個屬性后,android:configChanges 屬性就會捕獲“屏幕方向”和“鍵盤顯示隱藏”變化,當捕獲到這些變化后會調用Activity的onConfigurationChanged()方法。
我在手機上調試發現橫豎屏切換時,并沒有執行onConfigurationChanged()方法,但是Activity卻執行了銷毀重建的過程這是為什么呢?這是因為版本的問題上面的配置只在android4.o之前的版本起作用,在android 4.0 以上不起作用,必須要加上screenSize,也就是說android 4.0以后的版本必須這樣配置android:configChanges="keyboardHidden|orientation|screenSize"
下面我們結合實例說orientation和onConfigurationChanaged方法
代碼:
~~~
package com.example.activitypractice;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
//Activity創建時調用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG,"執行了onCreate方法");
}
//Activity創建或者從后臺重新回到前臺時被調用
@Override
protected void onStart() {
super.onStart();
Log.i(TAG,"執行了onStart方法");
}
//Activity從后臺重新回到前臺時被調用
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG,"執行了onRestart方法");
}
//Activity創建或者從被覆蓋、后臺重新回到前臺時被調用
@Override
protected void onResume() {
super.onResume();
Log.i(TAG,"執行了onResume方法");
}
//Activity被覆蓋到下面或者鎖屏時被調用
@Override
protected void onPause() {
super.onPause();
Log.i(TAG,"執行了onPause方法");
}
//退出當前Activity或者跳轉到新Activity時被調用
@Override
protected void onStop() {
super.onStop();
Log.i(TAG,"執行了onStop方法");
}
//退出當前Activity時被調用,調用之后Activity就結束了
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG,"執行了onDestroy方法");
}
//當指定了android:configChanges="orientation"后,方向改變時onConfigurationChanged被調用,并且activity不再銷毀重建
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
switch (newConfig.orientation) {
case Configuration.ORIENTATION_PORTRAIT://豎屏
Log.i(TAG,"豎屏");
setContentView(R.layout.portrait);
break;
case Configuration.ORIENTATION_LANDSCAPE://橫屏
Log.i(TAG,"橫屏");
setContentView(R.layout.landscap);
default:
break;
}
}
}
~~~
當我們沒有配置android:configChanges時進行橫屏和豎屏的切換時(注意:要在設置中設置自動旋轉屏幕我用的三星的測試機是在設定-->我的設備-->顯示 ?在"顯示"里有"自動旋轉屏幕"選項)日志如下:

從上面的日志中可以看出activity執行了銷毀重建的過程,onConfigurationChanaged并沒有被調用
如果我們加上android:configChanges="keyboardHidden|orientation|screenSize"再進行旋轉日志如下:

從上面的日志中可以看出activity并沒有執行銷毀重建的過程,而調用了onConfigurationChanaged方法