题目
Activity生命周期与屏幕旋转处理
信息
- 类型:问答
- 难度:⭐⭐
考点
Activity生命周期, 配置变更处理, 状态保存与恢复
快速回答
当屏幕旋转时:
- Activity会经历销毁重建过程:onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume()
- 必须重写
onSaveInstanceState()保存临时数据 - 在
onCreate()或onRestoreInstanceState()中恢复数据 - 可通过
android:configChanges声明自行处理配置变更(需谨慎)
一、Activity生命周期基础
Android Activity的标准生命周期回调顺序:
- onCreate():初始化布局和数据绑定
- onStart():Activity可见但未获得焦点
- onResume():Activity进入前台并可与用户交互
- onPause():失去焦点(如弹出对话框),应保存关键数据
- onStop():Activity完全不可见
- onDestroy():Activity被销毁前调用
二、屏幕旋转时的完整生命周期变化
当设备旋转(配置变更)时:
典型调用顺序:
onPause() → onStop() → onSaveInstanceState() → onDestroy() →
onCreate() → onStart() → onRestoreInstanceState() → onResume()三、数据保存与恢复最佳实践
1. 保存临时数据(在onSaveInstanceState中)
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("KEY_USER_INPUT", mEditText.getText().toString());
}2. 恢复数据(推荐在onCreate中)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String userInput = savedInstanceState.getString("KEY_USER_INPUT");
mEditText.setText(userInput);
}
}3. 替代方案(onRestoreInstanceState)
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 此处savedInstanceState永不为null
}四、配置变更的两种处理方式
| 方式 | 实现 | 适用场景 | 注意事项 |
|---|---|---|---|
| 默认重建 | 系统自动重建Activity | 大多数情况 | 需正确处理状态保存 |
| 自行处理 | AndroidManifest声明:<activity android:configChanges="orientation|screenSize" /> | 视频播放器等特殊场景 |
|
五、常见错误与解决方案
- 错误1:未保存EditText等UI状态
解决:系统会自动保存有id的View状态,但自定义数据需手动保存 - 错误2:在onSaveInstanceState中保存大型对象
解决:Bundle有大小限制(通常50KB),应使用ViewModel持久化大数据 - 错误3:滥用android:configChanges
解决:仅在必要时使用,并正确处理资源重载
六、扩展知识
- ViewModel:配合LiveData在配置变更时保留数据(推荐替代方案)
- Fragment状态保存:Fragment有自己的onSaveInstanceState机制
- 进程死亡恢复:当系统杀死进程时,需结合SavedStateHandle恢复数据
- Jetpack Compose:使用rememberSaveable实现可组合项的状态保存
七、配置变更处理演进
传统方式 → onRetainNonConfigurationInstance()(已废弃) → ViewModel + SavedState现代Android开发推荐架构: