横竖屏切换时分Activity的生命周期变化

横竖屏切换时候Activity的生命周期变化

横竖屏切换时候Activity的生命周期变化

对于横竖屏幕的切换,Activity的不同生命周期的变化,自己亲自用真机调试测试了一下,总结如下:

Activity类:
package com.example.screenorientationchange;

import android.support.v7.app.ActionBarActivity;
import android.content.res.Configuration;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		System.out.println("-----------onCreate-----------------");
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		System.out.println("-----------onStart-----------------");
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		System.out.println("-----------onRestart-----------------");
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		System.out.println("-----------onResume-----------------");
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		System.out.println("-----------onPause-----------------");
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		System.out.println("-----------onStop-----------------");
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		System.out.println("-----------onDestroy-----------------");
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		super.onConfigurationChanged(newConfig);
		System.out
				.println("-----------onConfigurationChanged-----------------");
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		super.onSaveInstanceState(outState);
		System.out.println("-----------onSaveInstanceState-----------------");
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onRestoreInstanceState(savedInstanceState);
		System.out
				.println("-----------onRestoreInstanceState-----------------");
	}

}

当启动程序时,info信息里面打印出来的结果是(默认是竖屏)

横竖屏切换时分Activity的生命周期变化

当切换到横屏时打印信息如下,可以看到重新Create了一个Activity,

横竖屏切换时分Activity的生命周期变化
当再次切换回到竖屏时,打印信息如下(紫色横线下面),又再一次重新onCreate了一个Activity。

横竖屏切换时分Activity的生命周期变化


下面我们去AndroidMainifest.xml中配置一下android:configChanges=" "参数
 先说一下android:configChanges=" "参数类型的代表含义:
"mcc" 国际移动用户识别码所属国家代号是改变了-----  sim被侦测到了,去更新mcc    mcc是移动用户所属国家代号
"mnc" 国际移动用户识别码的移动网号码是改变了------ sim被侦测到了,去更新mnc    MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网
"locale" 地址改变了-----用户选择了一个新的语言会显示出来
"touchscreen" 触摸屏是改变了------通常是不会发生的
"keyboard" 键盘发生了改变----例如用户用了外部的键盘
"keyboardHidden" 键盘的可用性发生了改变
"navigation" 导航发生了变化-----通常也不会发生
"screenLayout" 屏幕的显示发生了变化------不同的显示被激活
"fontScale" 字体比例发生了变化----选择了不同的全局字体
"uiMode" 用户的模式发生了变化
"orientation" 屏幕方向改变了
"screenSize" 屏幕大小改变了
"smallestScreenSize" 屏幕的物理大小改变了,如:连接到一个外部的屏幕上

































修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation"
    <activity
            android:name=".MainActivity"
            <span style="background-color: rgb(255, 255, 153);">android:configChanges="orientation"</span>
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
     </activity>

然后运行程序,可以看到打印信息跟没有配置之前是一模一样的。
横竖屏切换时分Activity的生命周期变化

然后重新修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation|screenSize"
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|screenSize"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

打印结果如下:
横竖屏切换时分Activity的生命周期变化
此时没有重新create一个Activity,只是调用了onConfigurationChange方法,无论你怎么切换,只会调用这一个方法了。

横竖屏切换时分Activity的生命周期变化

总结:
1、不设置Activity的android:configChanges=""和设置为android:configChanges="orientation"时,两种情况结果是一样的。都重新oncreate
   了一个Activity。(我是真机调试的,系统是4.1的, 版本设置是android:minSdkVersion="8" android:targetSdkVersion="21")。
    在网上百度了一下,原因是这样的,自从Android3.2(API 13)系统之后,随着横竖屏的切换screen size也随着改变,所以,
    在AndroidManifest.xml里设置MiniSdkVersion和TargetSdkVersion属性大于13的情况下,除了设置”orientation“还要设置”screensize“.

2、当设置android:configChanges="orientation|screensize"之后,横竖屏的切换就不再会重新调用各个生命周期,之后执行onConfigurationChanged方法。