# Activity异常恢复机制

Android系统在内存不足、配置变更等异常情况下需要恢复Activity状态。本文深入分析Activity的异常恢复机制、状态保存策略和最佳实践。

## 异常恢复流程概览

```mermaid
graph TD
    A[异常发生] --> B[系统调用onSaveInstanceState]
    B --> C[保存状态到Bundle]
    C --> D[Activity被销毁]
    D --> E[重新创建Activity]
    E --> F[系统传递保存的Bundle]
    F --> G[调用onCreate或onRestoreInstanceState]
    G --> H[恢复界面状态]
```

## 1. 异常恢复场景

### 1.1 系统触发的恢复
- **内存不足**：系统需要回收内存
- **配置变更**：屏幕旋转、语言切换等
- **多窗口模式**：分屏、画中画模式切换
- **系统杀死进程**：后台进程被系统回收

### 1.2 应用触发的恢复
- **进程重启**：应用崩溃后重启
- **任务恢复**：从最近任务列表恢复
- **深度链接**：通过Intent深度链接恢复

## 2. 状态保存机制

### 2.1 onSaveInstanceState()
- **调用时机**：在onStop()之前调用
- **保存内容**：临时UI状态、用户输入等
- **限制**：不适合保存大量数据

### 2.2 状态保存示例
```java
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    
    // 保存文本输入
    outState.putString("input_text", mEditText.getText().toString());
    
    // 保存列表位置
    outState.putInt("list_position", mRecyclerView.getScrollPosition());
    
    // 保存复选框状态
    outState.putBoolean("checkbox_checked", mCheckBox.isChecked());
    
    // 保存自定义对象（需要实现Parcelable）
    outState.putParcelable("user_data", mUserData);
}
```

## 3. 状态恢复机制

### 3.1 状态恢复方式
- **onCreate()恢复**：通过savedInstanceState参数
- **onRestoreInstanceState()恢复**：专门的状态恢复方法
- **ViewModel恢复**：通过ViewModel保存和恢复

### 3.2 状态恢复示例
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 检查是否有保存的状态
    if (savedInstanceState != null) {
        // 从Bundle恢复状态
        String text = savedInstanceState.getString("input_text");
        int position = savedInstanceState.getInt("list_position");
        boolean checked = savedInstanceState.getBoolean("checkbox_checked");
        UserData userData = savedInstanceState.getParcelable("user_data");
        
        // 恢复UI状态
        mEditText.setText(text);
        mRecyclerView.scrollToPosition(position);
        mCheckBox.setChecked(checked);
        mUserData = userData;
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // 额外的状态恢复逻辑
}
```

## 4. ViewModel状态管理

### 4.1 ViewModel的优势
- **配置变更存活**：ViewModel在配置变更时存活
- **生命周期感知**：自动管理生命周期
- **数据持久化**：保存重要的UI数据

### 4.2 ViewModel使用示例
```java
public class MainViewModel extends ViewModel {
    private MutableLiveData<String> mInputText = new MutableLiveData<>();
    private MutableLiveData<Integer> mListPosition = new MutableLiveData<>();
    
    public LiveData<String> getInputText() {
        return mInputText;
    }
    
    public void setInputText(String text) {
        mInputText.setValue(text);
    }
    
    public LiveData<Integer> getListPosition() {
        return mListPosition;
    }
    
    public void setListPosition(int position) {
        mListPosition.setValue(position);
    }
    
    @Override
    protected void onCleared() {
        super.onCleared();
        // 清理资源
    }
}
```

## 5. 持久化数据恢复

### 5.1 本地存储
- **SharedPreferences**：轻量级键值对存储
- **文件存储**：内部存储或外部存储
- **数据库**：SQLite或Room数据库

### 5.2 数据恢复策略
```java
// 使用SharedPreferences保存数据
private void saveToSharedPreferences(String key, String value) {
    SharedPreferences prefs = getSharedPreferences("app_data", MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.apply();
}

// 从SharedPreferences恢复数据
private String restoreFromSharedPreferences(String key) {
    SharedPreferences prefs = getSharedPreferences("app_data", MODE_PRIVATE);
    return prefs.getString(key, "");
}
```

## 6. 调试与优化

### 6.1 调试工具
```bash
# 查看Activity状态保存日志
adb logcat -s ActivityManager:I *:S | grep "saveInstanceState"

# 分析Bundle内容
adb shell dumpsys activity activities | grep -A 20 "SavedState"

# 内存分析
adb shell dumpsys meminfo <package_name>
```

### 6.2 性能优化
- **减少Bundle大小**：避免保存大量数据
- **延迟恢复**：非关键数据延迟恢复
- **异步恢复**：后台线程恢复数据

### 6.3 常见问题排查
- **状态丢失**：检查onSaveInstanceState实现
- **内存泄漏**：检查静态引用和监听器
- **恢复失败**：检查数据类型和序列化

## 总结

Activity异常恢复机制是Android应用稳定性的关键：
- **用户体验**：无缝的状态恢复提升用户体验
- **数据完整性**：确保用户数据不丢失
- **应用稳定性**：异常情况下的稳定运行
- **开发效率**：减少手动状态管理的工作量

掌握Activity异常恢复机制，能够开发出更加稳定、可靠的Android应用。