AVD旋转时Android onCreate()方法未被调用的原因排查
AVD旋转时Activity的onCreate()未被调用的排查方案
未做特殊配置的Activity在屏幕方向变化时,默认会走销毁重建流程、重新调用onCreate(),不触发该回调的原因基本分为两类:系统未实际下发配置变更事件,或配置变更被Manifest属性拦截,按以下顺序排查即可:
核心原因列表
- AVD自动旋转处于锁定状态:模拟器侧边栏的旋转按钮仅修改设备物理显示方向,如果AVD系统设置里的「自动旋转屏幕」开关关闭,应用不会收到方向变更通知,不会触发重建。
- Manifest配置排查遗漏:
- 不要仅检查
<activity>标签上的android:configChanges属性,<application>根标签设置的全局configChanges属性会被所有子Activity继承,全局配置同样会拦截重建流程。 - 从Android 3.2(API 13)开始,屏幕旋转触发的配置变更会同时携带
screenSize标识,只要configChanges中声明了screenSize、screenLayout、smallestScreenSize中的相关项,哪怕没有显式添加orientation配置,高版本系统下也不会重建Activity,而是直接回调onConfigurationChanged()方法。 - 如果
<activity>标签配置了固定方向属性,比如android:screenOrientation="portrait"、landscape、locked,Activity方向会被强制锁定,旋转操作不会触发任何配置变更。
- 不要仅检查
- 项目模板默认配置影响:Android Studio Chipmunk 2021.2.1版本的部分Activity模板(如Game Activity)创建时会默认添加配置变更拦截属性,若创建项目时未手动清理,即使没有主动写
android:configChanges="orientation",也会出现旋转不重建的现象。
定位验证方式
在MainActivity中添加以下生命周期回调日志,旋转AVD时观察Logcat输出即可快速定位问题:
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) Log.d(TAG, "onConfigurationChanged 触发,当前方向值:${newConfig.orientation}") } override fun onDestroy() { super.onDestroy() Log.d(TAG, "onDestroy 触发") } override fun onResume() { super.onResume() Log.d(TAG, "onResume 触发") }
- 旋转时如果只打印
onConfigurationChanged日志,没有onDestroy、onCreate相关日志,说明配置变更被configChanges属性拦截,回到Manifest文件删除对应拦截配置即可恢复默认重建行为。 - 旋转时如果没有打印任何上述新增日志,说明系统没有向应用下发配置变更事件,优先检查AVD自动旋转开关、Activity是否配置了固定方向。
内容的提问来源于stack exchange,提问作者mstucki7
相关产品推荐
相关产品推荐

