zoukankan      html  css  js  c++  java
  • 测试横竖屏切换时activity 的生命周期

    对于这个面试题,相信大家都见过,网上给出的答案是:

    1、不设置Activityandroid:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

    2、设置Activityandroid:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

    3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

    然而,我在测试的时候,发现并不是这样,下面写了一个简单的测试类,代码如下:

    Activity:

    package com.home.activity;
    
    import android.os.Bundle;
    import android.util.Log;
    import android.app.Activity;
    import android.content.res.Configuration;
    
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		Log.i("onCreate", "执行onCreate方法");
    	}
    
    	@Override
    	protected void onStart() {
    		super.onStart();
    		Log.i("onStart", "执行onStart方法");
    	}
    
    	@Override
    	protected void onResume() {
    		super.onResume();
    		Log.i("onResume", "执行onResume方法");
    	}
    
    	@Override
    	protected void onPause() {
    		super.onPause();
    		Log.i("onPause", "执行onPause方法");
    	}
    
    	@Override
    	protected void onStop() {
    		super.onStop();
    		Log.i("onStop", "执行onStop方法");
    	}
    
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		Log.i("onDestroy", "执行onDestroy方法");
    	}
    
    	@Override
    	public void onConfigurationChanged(Configuration newConfig) {
    		super.onConfigurationChanged(newConfig);
    		Log.i("onConfigurationChanged", "执行onConfigurationChanged方法");
    	}
    
    	@Override
    	protected void onRestart() {
    		super.onRestart();
    		Log.i("onRestart", "执行onRestart方法");
    	}
    
    	@Override
    	protected void onSaveInstanceState(Bundle outState) {
    		super.onSaveInstanceState(outState);
    		Log.i("onSaveInstanceState", "执行onSaveInstanceState方法");
    	}
    
    	@Override
    	protected void onRestoreInstanceState(Bundle savedInstanceState) {
    		super.onRestoreInstanceState(savedInstanceState);
    		Log.i("onRestoreInstanceState", "执行onRestoreInstanceState方法");
    	}
    }
    

    下面来分析打印结果:

    我分别用手机和模拟器进行测试过,发现它们有点区别:

    1、不设置Activityandroid:configChanges时,手机和模拟器打印的结果都一样:横竖屏切换都执行一次生命周期

    2、设置Activityandroid:configChanges="orientation"时,模拟器打印的结果和上面一样,横竖屏切换都执行一次生命周期:

    以示区别,我将onCreate打印成红色

    可以看出和上面结果一样。但是在手机上测试就不同了,它只会打印一句话:

    3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,手机和模拟器的结果一样:

    那么,综上所述:

    结论应该是这样:

    1、不设置Activityandroid:configChanges横竖屏切换都执行一次生命周期。

    2、设置Activityandroid:configChanges="orientation"时,模拟器上横竖屏切换都执行一次生命周期。手机上只执行

    onConfigurationChanged方法。

    3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,无论在模拟器还是手机上,横竖屏切换都只执行onConfigurationChanged方法。

    上面测试模拟器用的2.3.3,手机用2.3和4.1.2都测试过。

    大家有兴趣可以用不同版本的手机进行测试下,也许有不同的结果,若留言告知我,在下不胜感激。

  • 相关阅读:
    SpringMVC+Spring+Mybatis框架集成
    Mybatis学习总结(三)——SqlMapConfig.xml全局配置文件解析
    Mybatis学习总结(二)——Mapper代理开发
    Mybatis学习总结(一)——入门基础
    Mybatis学习总结(九)——查询缓存
    Mybatis学习总结(八)——延迟加载
    1016 部分A+B (15分)
    1015 德才论 (25分)*
    1014 福尔摩斯的约会 (20分)
    1013 数素数 (20分)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3323072.html
Copyright © 2011-2022 走看看