前言:
今天看到一个题目:简述横竖屏切换时,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模拟器:
Android4.4.4手机:
从上面的结果我们可以看出:手机屏幕从横屏切换到竖屏,再从竖屏切换到横屏时,Activity 都执行了一次完整的生命周期。
(2)在 AndroidManifest.xml 中设置 Activity 的 android:configChanges="orientation":
Android 4.0模拟器:
Android 4.4.4手机:
对比分析发现:在 AndroidManifest.xml 中设置手机 Activity 的 android:configChanges="orientation" 属性的效果与未设置属性的效果一样,横竖屏切换时 Activity 都执行了一次完整的生命周期。
(3)设置 Activity 的 android:configChanges="orientation|keyboardHidden":
Android4.0 模拟器:
Android 4.4.4模拟器:
对比分析发现:这种情况和前两种情况结果一致,从横屏切换到竖屏,再从竖屏切换到横屏时 Activity 都执行了一次完整的生命周期。
(4)设置 Activity 的 android:configChanges="orientation|keyboardHidden|screenSize":
Android4.0 模拟器:
Android 4.4.4手机:
对比分析发现:无论是从横屏切换到竖屏还是从竖屏切换到横屏都只执行 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() 方法。