Android面试题-横竖屏切换,activity生命周期的执行顺序,基于8.0,9.0
16lz
2021-01-24
随便搜一篇关于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的手机再来进行测试。
果然实践出真理,作为程序员更要多动手尝试,好了继续学习~
更多相关文章
- 使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、
- 给大家介绍几个常见的Android代码片段
- Android中Action Bar的使用
- Android(安卓)mediaPlayer播放报PVMFErrNotSupported Prepare fa
- android之handler更新UI
- Android——4.2 - 3G移植之路之 reference-ril .pppd 拨号上网 (
- Android(安卓)自定义PopupWindow指定位置或给定View坐标弹出
- 第3章 创建应用程序和活动
- 旋转中 android 的视图按钮