Android手机切换横竖屏时Activity的生命周期

前言:

 今天看到一个题目:简述横竖屏切换时,Activity的生命周期

先在网上找了相关的文章阅读,然后自己测试了一遍,发现与其他人的测试结果不同,因此写下这篇简单的文章希望能和大家探讨一下,如有错误的地方希望大家帮忙指出,共同学习。


第一部分:测试代码

package com.njit.activity_screenorention_lifecycle;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;

public class MainActivity extends Activity {

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

	@Override
	protected void onStart() {
		super.onStart();
		System.out.println("onStart()");
	}

	@Override
	protected void onResume() {
		super.onResume();
		System.out.println("onResume()");
	}

	@Override
	protected void onPause() {
		super.onPause();
		System.out.println("onPause()");
	}

	@Override
	protected void onStop() {
		super.onStop();
		System.out.println("onStop()");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		System.out.println("onDestroy()");
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		System.out.println("onRestart()");
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		System.out.println("onConfigurationChanged()");
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		System.out.println("onSaveInstanceState()");
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		super.onRestoreInstanceState(savedInstanceState);
		System.out.println("onRestoreInstanceState()");
	}
}

第二部分:不同设置情况下的Activity的生命周期

以下所示的测试结果都是从Activity被创建,再从横屏切换到竖屏,然后再从竖屏切换到横屏,最后退出Activity过程中调用的方法:

(1)未在 AndroidManifest.xml 中设置 Activity 的 android:configChanges:

Android4.0模拟器:

Android手机切换横竖屏时Activity的生命周期_第1张图片

Android4.4.4手机:

Android手机切换横竖屏时Activity的生命周期_第2张图片
从上面的结果我们可以看出:手机屏幕从横屏切换到竖屏,再从竖屏切换到横屏时,Activity 都执行了一次完整的生命周期。

(2)在 AndroidManifest.xml 中设置 Activity 的 android:configChanges="orientation":

Android 4.0模拟器:

Android手机切换横竖屏时Activity的生命周期_第3张图片

Android 4.4.4手机:

Android手机切换横竖屏时Activity的生命周期_第4张图片

对比分析发现:在 AndroidManifest.xml 中设置手机 Activity 的 android:configChanges="orientation" 属性的效果与未设置属性的效果一样,横竖屏切换时 Activity 都执行了一次完整的生命周期。

(3)设置 Activity 的 android:configChanges="orientation|keyboardHidden":

Android4.0 模拟器:

Android手机切换横竖屏时Activity的生命周期_第5张图片

Android 4.4.4模拟器:

Android手机切换横竖屏时Activity的生命周期_第6张图片
对比分析发现:这种情况和前两种情况结果一致,从横屏切换到竖屏,再从竖屏切换到横屏时 Activity 都执行了一次完整的生命周期。

(4)设置 Activity 的 android:configChanges="orientation|keyboardHidden|screenSize":

Android4.0 模拟器:

Android手机切换横竖屏时Activity的生命周期_第7张图片
Android 4.4.4手机:

Android手机切换横竖屏时Activity的生命周期_第8张图片

对比分析发现:无论是从横屏切换到竖屏还是从竖屏切换到横屏都只执行 onConfigurationChanged() 方法。


第三部分:总结

根据测试结果可知只有在AndroidManifest.xml文件中设置Activity的 android:configChanges="orientation|keyboardHidden|screenSize"时,切换横竖屏时才只执行 onConfigurationChanged() 方法;其他三种情况切换横竖屏时,都会执行一次完整的Activity的生命周期。

以上为 Android 4.0 模拟器和 Android 4.4.4 的手机测试的结果,测试可能存在不完整性,有什么错误的地方欢迎大家指出来,共同学习。


=========================================================================================

更新:

自己测试结果和别人测试结果不同的原因:

因为在Android4.0以后支持多分辨率,所以需要在Activity中配置 android:configChanges="orientation|keyboardHidden|screenSize",其中screenSize是为了屏蔽屏幕大小的自适应。如果是低版本的手机,只需要设置android:configChanges="orientation|keyboardHidden"属性,切换横竖屏时也只执行 onConfigurationChanged() 方法。

你可能感兴趣的:(Android)