手机旋转时,正在执行的Activity会因屏幕朝向变化重新创建吗?
Hey there! 这个问题是Android开发里的经典场景了,我来给你掰扯清楚:
默认行为:会重建
默认情况下,当你旋转手机改变屏幕朝向时,系统会销毁当前的Activity实例,然后重新创建一个适配新屏幕配置的实例。
这是因为屏幕朝向变化属于「配置变更(Configuration Change)」的一种——系统认为屏幕尺寸、方向变了,需要重新加载适配新配置的布局和资源,所以会走完整的销毁重建流程:
- 销毁阶段:
onPause()→onStop()→onDestroy() - 重建阶段:
onCreate()→onStart()→onResume()
不过系统会帮你临时保存Activity的状态:在销毁前会调用onSaveInstanceState(Bundle outState),你可以在这里存一些轻量的状态数据(比如输入框内容、列表滚动位置);重建时,这些数据会通过onCreate(Bundle savedInstanceState)或者onRestoreInstanceState(Bundle savedInstanceState)传递回来,方便你恢复状态。
如何避免Activity重建?
如果你不想让旋转触发重建,有两种常用方案:
1. 声明处理配置变更
在AndroidManifest.xml里给目标Activity添加configChanges属性,告诉系统「这个配置变更我自己处理,别重建Activity」:
<activity android:name=".YourActivity" android:configChanges="orientation|screenSize|smallestScreenSize"> </activity>
添加后,旋转时系统不会重建Activity,而是调用onConfigurationChanged(Configuration newConfig)方法,你可以在这个方法里手动调整布局、资源适配新方向。
注意:这个方法适合简单的适配场景,如果你的布局和资源依赖复杂,手动处理容易出问题,慎用。
2. 使用ViewModel保存数据
如果你只是担心重建后数据丢失,推荐用Android Architecture Components里的ViewModel——它的生命周期独立于Activity的重建,Activity销毁重建后,ViewModel会保留原来的实例,你可以直接从中获取之前保存的数据:
class MyViewModel : ViewModel() { val userData = MutableLiveData<User>() } // 在Activity中获取ViewModel val viewModel = ViewModelProvider(this)[MyViewModel::class.java]
这样即使Activity重建,viewModel里的userData也不会丢失,完美解决数据保存的问题,这也是Google推荐的最佳实践。
内容的提问来源于stack exchange,提问作者Grounded Snippets

