Android中保存Activity状态的多种实现方式
更新时间:2025年06月10日 08:28:29 作者:时小雨
Android系统在运行过程中可能会因为内存不足或其他原因导致Activity被销毁并重新创建,此时保存Activity的状态就显得尤为重要,本文将详细讲解Android中保存Activity状态的主要方法
在 Android 中,保存 Activity 的状态主要通过以下方式实现:
1. 使用 onSaveInstanceState() 保存临时状态
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 保存简单数据类型
outState.putString("KEY_TEXT", editText.getText().toString());
outState.putInt("KEY_SCORE", currentScore);
}
2. 在 onCreate() 或 onRestoreInstanceState() 中恢复状态
@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(轻量级键值对)
// 保存
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
prefs.edit().putInt("HIGH_SCORE", 100).apply();
// 读取
int highScore = prefs.getInt("HIGH_SCORE", 0);
- 本地数据库(Room 等)
- 文件存储
4. 处理 ViewModel + onSaveInstanceState
结合架构组件处理配置变更:
// ViewModel 保存非界面数据
public class MyViewModel extends ViewModel {
public LiveData<List<User>> users;
// ...
}
// Activity 中
viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
重要注意事项:
onSaveInstanceState()适用场景:- 仅保存瞬态界面状态(如输入框文本、滚动位置)
- 不适合保存大量数据(如 Bitmap)或持久化数据
- 在 Activity 被系统销毁重建时触发(如屏幕旋转、内存不足)
- 数据生命周期:

- 最佳实践:
- 简单数据:用
Bundle - 复杂/持久数据:用
ViewModel+ 持久化存储(Room/SharedPreferences) - 避免在 Bundle 中保存超过 50KB 数据
- 简单数据:用
完整示例代码
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 方案,它能更优雅地保留数据,避免频繁保存/恢复操作。
以上就是Android中保存Activity状态的多种实现方式的详细内容,更多关于Android保存Activity状态的资料请关注脚本之家其它相关文章!
相关文章
Android中AsyncTask与handler用法实例分析
这篇文章主要介绍了Android中AsyncTask与handler用法,以实例形式较为详细的分析了Android中AsyncTask与handler的功能、用法与相关注意事项,并附带完整实例源码供读者下载,需要的朋友可以参考下2015-10-10
Android判断touch事件点是否在view范围内的方法
这篇文章主要介绍了Android判断touch事件点是否在view范围内的方法,涉及Android事件响应与view属性操作的相关技巧,需要的朋友可以参考下2016-03-03
Android串口开发之使用JNI实现ANDROID和串口通信详解
这篇文章主要给大家介绍了关于Android串口开发之使用JNI实现ANDROID和串口通信的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-01-01


最新评论