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")
    }
}

首先切换横屏如下:

再切换竖屏:

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

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

manifest代码如下:

<activity
            android:name=".ui.activities.ActivityA"
            android:configChanges="orientation" />

 切换横屏:

切换竖屏:

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

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

没想到吧_没想到表情

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值