随便搜一篇关于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的手机再来进行测试。
果然实践出真理,作为程序员更要多动手尝试,好了继续学习~