Android Activity状态保存方法

在 Android 中,保存 Activity 的状态主要通过以下方式实现:

1. 使用 onSaveInstanceState() 保存临时状态

java 复制代码
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // 保存简单数据类型
    outState.putString("KEY_TEXT", editText.getText().toString());
    outState.putInt("KEY_SCORE", currentScore);
}

2. onCreate()onRestoreInstanceState() 中恢复状态

java 复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        // 恢复数据
        String savedText = savedInstanceState.getString("KEY_TEXT");
        int savedScore = savedInstanceState.getInt("KEY_SCORE", 0);
        editText.setText(savedText);
        currentScore = savedScore;
    }
}

// 或专门使用恢复方法
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String savedText = savedInstanceState.getString("KEY_TEXT");
    // ... 恢复操作
}

3. 永久性数据存储(推荐方案)

对于需要持久化的数据(如用户设置),使用其他存储方式:

  • SharedPreferences(轻量级键值对)
java 复制代码
// 保存
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
prefs.edit().putInt("HIGH_SCORE", 100).apply();

// 读取
int highScore = prefs.getInt("HIGH_SCORE", 0);
  • 本地数据库(Room 等)
  • 文件存储

4. 处理 ViewModel + onSaveInstanceState

结合架构组件处理配置变更:

java 复制代码
// ViewModel 保存非界面数据
public class MyViewModel extends ViewModel {
    public LiveData<List<User>> users;
    // ...
}

// Activity 中
viewModel = ViewModelProviders.of(this).get(MyViewModel.class);

⚠️ 重要注意事项:

  1. onSaveInstanceState() 适用场景

    • 仅保存瞬态界面状态(如输入框文本、滚动位置)
    • 不适合保存大量数据(如 Bitmap)或持久化数据
    • 在 Activity 被系统销毁重建时触发(如屏幕旋转、内存不足)
  2. 数据生命周期

    graph LR A[Activity启动] --> B[onCreate] B --> C[onRestoreInstanceState] --> D[正常使用] D --> E[onSaveInstanceState] --> F[被销毁] F --> B
  3. 最佳实践

    • 简单数据:用 Bundle
    • 复杂/持久数据:用 ViewModel + 持久化存储(Room/SharedPreferences)
    • 避免在 Bundle 中保存超过 50KB 数据

完整示例代码

java 复制代码
public class MainActivity extends AppCompatActivity {
    private EditText editText;
    private int score;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        editText = findViewById(R.id.editText);
        
        // 恢复保存的状态
        if (savedInstanceState != null) {
            editText.setText(savedInstanceState.getString("SAVED_TEXT"));
            score = savedInstanceState.getInt("SCORE", 0);
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("SAVED_TEXT", editText.getText().toString());
        outState.putInt("SCORE", score);
    }

    // 可选:专门恢复方法
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        // 系统会自动恢复View状态(如EditText文本)
    }
}

其他技巧:

  • 自动保存 View 状态 :Android 默认会保存所有具有 ID 的 View 状态(如 EditText 内容)
  • 禁用状态保存 :在 View 上设置 android:saveEnabled="false"
  • 处理 Fragment 状态 :在 Fragment 中同样使用 onSaveInstanceState()

💡 提示:对于配置变更(如屏幕旋转),建议使用 ViewModel + LiveData 方案,它能更优雅地保留数据,避免频繁保存/恢复操作。

相关推荐
我命由我1234529 分钟前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
怪兽20142 小时前
请例举 Android 中常用布局类型,并简述其用法以及排版效率
android·面试
应用市场2 小时前
Android Bootloader启动逻辑深度解析
android
江太翁2 小时前
Kotlin 与 Java 互操作中常用注解
java·python·kotlin
爱吃水蜜桃的奥特曼2 小时前
玩Android Harmony next版,通过项目了解harmony项目快速搭建开发
android·harmonyos
shaominjin1232 小时前
Android 中 RecyclerView 与 ListView 的深度对比:从设计到实践
android
vocal3 小时前
【我的AOSP第一课】AOSP 下载、编译与运行
android
Lei活在当下3 小时前
【业务场景架构实战】8. 订单状态流转在 UI 端的呈现设计
android·设计模式·架构
小趴菜82273 小时前
Android中加载unity aar包实现方案
android·unity·游戏引擎
qq_252924193 小时前
PHP 8.0+ 现代Web开发实战指南 引
android·前端·php