随便搜一篇关于activity在横竖屏切换后生命周期的执行过程你可能会看到如下答案:

1、不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次2、设置 Activity 的 android:configChanges="orientation" 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次3、设置 Activity 的 android:configChanges="orientation|keyboardHidden" 时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法4、注意:还有一点,非常重要,一个 Android 的变更细节!当 API >12 时,需要加入 screenSize 属性,否则屏幕切换时即使你设置了 orientation 系统也会重建 Activity !

记得在学校学习android的时候,老师就这么说过,我也就这么记住了。然儿最近在整理面试资料的时候,看到这题,想到为什么切竖屏会执行两次呢??于是我又写了代码来测试...发现这个答案不一定对...

一、不设置  android:configChanges="orientation" 情况下

Activity代码如下:

/** * Created by fySpring * Date: 2020/4/12 * To do: */class ActivityA : AppCompatActivity() {    private val TAG: String = javaClass.simpleName + "    "    private var stateStr: String? = null    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_a)        Log.d("LiveTest", TAG + "onCreate")        stateStr = savedInstanceState?.getString("stateStr", "切换为横屏")        screen_switch_btn.text = if (stateStr.isNullOrEmpty()) "切换为横屏" else stateStr        screen_switch_btn.setOnClickListener {            /**             *ORIENTATION_PORTRAIT = 1;  竖屏             *ORIENTATION_LANDSCAPE = 2; 横屏             */            val screenNum = resources.configuration.orientation            if (screenNum == 1) {                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE                stateStr = "切换为竖屏"            } else {                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT                stateStr = "切换为横屏"            }        }    }    override fun onSaveInstanceState(outState: Bundle) {        outState.putString("stateStr", stateStr)        super.onSaveInstanceState(outState)        Log.d("LiveTest", TAG + "onSaveInstanceState")    }    override fun onRestoreInstanceState(savedInstanceState: Bundle) {        super.onRestoreInstanceState(savedInstanceState)        Log.d("LiveTest", TAG + "onRestoreInstanceState")    }    override fun onStart() {        super.onStart()        Log.d("LiveTest", TAG + "onStart")    }    override fun onResume() {        super.onResume()        Log.d("LiveTest", TAG + "onResume")    }    override fun onPause() {        super.onPause()        Log.d("LiveTest", TAG + "onPause")    }    override fun onStop() {        super.onStop()        Log.d("LiveTest", TAG + "onStop")    }    override fun onRestart() {        super.onRestart()        Log.d("LiveTest", TAG + "onRestart")    }    override fun onDestroy() {        super.onDestroy()        Log.d("LiveTest", TAG + "onDestroy")    }    override fun onConfigurationChanged(newConfig: Configuration) {        super.onConfigurationChanged(newConfig)        Log.d("LiveTest", TAG + "onConfigurationChanged")    }}

首先切换横屏如下:

再切换竖屏:

由此可见,在8.0系统,如果不设置  android:configChanges="orientation"  属性时,横竖屏切换都只会执行一次生命周期。并且状态数据等保存可以在  onSaveInstanceState 中保存,在onCreate 或者  onRestoreInstanceState 可以拿到保存的数据。

二、只设置 android:configChanges="orientation" 属性

manifest代码如下:

 切换横屏:

切换竖屏:

由此可见,当设置了 android:configChanges="orientation" 时,横竖屏切换都只会回调  onConfigurationChanged 方法,不会重走activity生命周期。同时是否设置  keyboardHidden|screenSize 均不影响该结果。

同时用我的9.0的小米手机测试,同样的结果。等我找到4.4的手机再来进行测试。

果然实践出真理,作为程序员更要多动手尝试,好了继续学习~

更多相关文章

  1. 使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、
  2. 给大家介绍几个常见的Android代码片段
  3. Android中Action Bar的使用
  4. Android(安卓)mediaPlayer播放报PVMFErrNotSupported Prepare fa
  5. android之handler更新UI
  6. Android——4.2 - 3G移植之路之 reference-ril .pppd 拨号上网 (
  7. Android(安卓)自定义PopupWindow指定位置或给定View坐标弹出
  8. 第3章 创建应用程序和活动
  9. 旋转中 android 的视图按钮

随机推荐

  1. Android强制在主线程进行网络请求
  2. Android中如何获取应用版本号
  3. Android全局变量
  4. Android电池电量状态源码
  5. Android双击返回键退出程序
  6. Android之NetworkOnMainThreadException
  7. Android(安卓)Layout Tricks #3: Optimiz
  8. 设置android全屏的两种方式
  9. Android中Activity的Intent大全
  10. android 获取图片绝对地址