ENTATION_LANDSCAPE);?//横屏
为应用中的Activity设置特定的方向是经常用到的办法,可以为我们省去不少不必要的麻烦。不过,我们今天讲的是屏幕方向改变时的生命周期,所以我们并不采用固定屏幕方向这种办法。
下面我们就结合实例讲解一下屏幕转换的生命周期,我们新建一个Activity命名为OrientationActivity,如下:
package com.scott.lifecycle;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
public class OrientationActivity extends Activity {
?
?private static final String TAG = "OrientationActivity";
?private int param = 1;
?
?@Override
?protected void onCreate(Bundle savedInstanceState) {
? super.onCreate(savedInstanceState);
? setContentView(R.layout.orientation_portrait);
? Log.i(TAG, "onCreate called.");
?}
?
?@Override
?protected void onStart() {
? super.onStart();
? Log.i(TAG, "onStart called.");
?}
?
?@Override
?protected void onRestart() {
? super.onRestart();
? Log.i(TAG, "onRestart called.");
?}
?
?@Override
?protected void onResume() {
? super.onResume();
? Log.i(TAG, "onResume called.");
?}
?
?@Override
?protected void onPause() {
? super.onPause();
? Log.i(TAG, "onPause called.");
?}
?
?@Override
?protected void onStop() {
? super.onStop();
? Log.i(TAG, "onStop called.");
?}
?
?@Override
?protected void onDestroy() {
? super.onDestroy();
? Log.i(TAG, "onDestory called.");
?}
?@Override
?protected void onSaveInstanceState(Bundle outState) {
? outState.putInt("param", param);
? Log.i(TAG, "onSaveInstanceState called. put param: " + param);
? super.onSaveInstanceState(outState);
?}
?
?@Override
?protected void onRestoreInstanceState(Bundle savedInstanceState) {
? param = savedInstanceState.getInt("param");
? Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
? super.onRestoreInstanceState(savedInstanceState);
?}
?
?//当指定了android:configChanges="orientation"后,方向改变时onConfigurationChanged被调用
?@Override
?public void onConfigurationChanged(Configuration newConfig) {
? super.onConfigurationChanged(newConfig);
? Log.i(TAG, "onConfigurationChanged called.");
? switch (newConfig.orientation) {
? case Configuration.ORIENTATION_PORTRAIT:
? ?setContentView(R.layout.orientation_portrait);
? ?break;
? case Configuration.ORIENTATION_LANDSCAPE:
? ?setContentView(R.layout.orientation_landscape);
? ?break;
? }
?}
}
首先我们需要进入“Settings->Display”中,将“Auto-rotate Screen”一项选中,表明可以自动根据方向旋转屏幕,然后我们就可以测试流程了,当我们旋转屏幕时,我们发现系统会先将当前Activity销毁,然后重建一个新的:

系统先是调用onSaveInstanceState方法,我们保存了一个临时参数到Bundle对象里面,然后当Activity重建之后我们又成功的取出了这个参数。
为了避免这样销毁重建的过程,我们需要在AndroidMainfest.xml中对OrientationActivity对应的配置android:configChanges="orientation",然后我们再测试一下,我试着做了四次的旋转,打印如下:

可以看到,每次旋转方向时,只有onConfigurationChanged方法被调用,没有了销毁重建的过程。
以下是需要注意的几点:
1.如果配置了android:screenOrientation属性,则会使android:configChanges="orientation"失效。
2.模拟器与真机差别很大:模拟器中如果不配置android:configChanges属性或配置值为orientation,切到横屏执行一次销毁->重建,切到竖屏执行两次。真机均为一次。模拟器中如果配置android:configChanges="orientation|keyboardHidden"(如果是Android4.0,则是"orientation|keyboardHidden|screenSize"),切竖屏执行一次onConfigurationChanged,切横屏执行两次。真机均为一次。
Activity的生命周期与程序的健壮性有着密不可分的关系,希望朋友们能够认真体会、熟练应用。