Android中保存Activity状态的多种实现方式
目录
- 1. 使用 onSaveInstanceState() 保存临时状态
- 2. 在 onCreate() 或 onRestoreInstanceState() 中恢复状态
- 3. 永编程客栈久性数据存储(推荐方案)
- 4. 处理 ViewModel + onSaveInstanceState
- 重要注意事项:
- 完整示例代码
- 其他技巧:
在 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_SCOpythonRE", 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.clas编程s);
重要注意事项:
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); } // 可选:专门恢复方法Zporut @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { php super.onRestoreInstanceState(savedInstanceState); // 系统会自动恢复View状态(如EditText文本) } }
其他技巧:
- 自动保存 View 状态:Android 默认会保存所有具有 ID 的 View 状态(如
EditText
内容) - 禁用状态保存:在 View 上设置
android:saveEnabled="false"
- 处理 Fragment 状态:在 Fragment 中同样使用
onSaveInstanceState()
提示:对于配置变更(如屏幕旋转),建议使用 ViewModel + LiveData 方案,它能更优雅地保留数据,避免频繁保存/恢复操作。
以上就是Android中保存Activity状态的多种实现方式的详细内容,更多关于Android保存Activity状态的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论