Android面试题-横竖屏切换,activity生命周期的执行顺序,基于8.0,9.0

随便搜一篇关于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")
    }
}

首先切换横屏如下:

Android面试题-横竖屏切换,activity生命周期的执行顺序,基于8.0,9.0_第1张图片

再切换竖屏:

Android面试题-横竖屏切换,activity生命周期的执行顺序,基于8.0,9.0_第2张图片

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

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

manifest代码如下:

 切换横屏:

Android面试题-横竖屏切换,activity生命周期的执行顺序,基于8.0,9.0_第3张图片

切换竖屏:

Android面试题-横竖屏切换,activity生命周期的执行顺序,基于8.0,9.0_第4张图片

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

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

没想到吧_没想到表情

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

你可能感兴趣的:(Android面试,android,面试)