侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Activity生命周期与屏幕旋转处理

2025-12-8 / 0 评论 / 4 阅读

题目

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" />
视频播放器等特殊场景
  • 需重写onConfigurationChanged()
  • 可能引发内存泄漏
  • 官方不推荐常规使用

五、常见错误与解决方案

  • 错误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开发推荐架构:
ViewModel生命周期