activity的保存状态机制

本文详细介绍了如何在Android应用中通过重写Activity的onSaveInstanceState方法来保存用户当前操作状态,确保用户在离开并重新返回应用时能恢复之前的操作进度。

public class MainActivity extends BaseActivity {
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("savedata","this is form save.....");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState != null){
            String savedata = savedInstanceState.getString("savedata");
            Log.d("savedata",savedata);
        }
    }
当activityA跳转到activityB时,A当前view的状态(有定义id的)会自动保存。这时要是因内存不足(或者横竖屏切换)而将A销毁,B返回到A时会重新执行oncreate方法到A页面,这时候A当前View的状态会恢复。

在Activity中保存用户的当前操作状态,如输入框中的文本,一般情况下载按了home键后,重新进入文本框中的东西会丢下,所以我们要保存当前页面信息,如在写短信的时候接到一个电话,那么当你接电话的时候短信界面就会别隐藏,那么我们希望接完电话后可以继续编辑短信,就需要保存状态。使用办法:

重写Activity中的onSaveInstanceState(Bundle outState)方法,保存数据。其中Bundle是一个键值对的集合。

onCreate方法里也有这个参数,但是一开始这个数据是空的。判断saveInstanceState是否为空,不为空时取出数据。




Android 开发中,保存 Activity状态是一个常见的需求,尤其是在设备配置发生变化(如屏幕旋转)或系统资源不足导致 Activity 被销毁并重新创建时。Android 提供了多种机制来实现状态保存与恢复。 ### onSaveInstanceState() `onSaveInstanceState()` 是用于保存 Activity 瞬间状态的核心方法。当系统决定销毁 Activity 以释放资源时,会调用此方法。通过重写该方法,可以将需要保存的数据以键值对的形式存储在 `Bundle` 对象中。 ```java @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 保存一个字符串值 outState.putString("user_input", userInputEditText.getText().toString()); } ``` 需要注意的是,`onSaveInstanceState()` 的调用时机并不确定,因此不适合用于持久化数据的存储。持久化数据应使用 `onPause()` 或 `onStop()` 方法来处理[^2]。 ### onRestoreInstanceState() 当 Activity 被重新创建时,可以通过 `onRestoreInstanceState()` 方法恢复之前保存状态。这个方法会在 `onStart()` 之后被调用,并且只有在有状态需要恢复时才会被触发。 ```java @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // 恢复字符串值 String userInput = savedInstanceState.getString("user_input"); userInputEditText.setText(userInput); } ``` 如果未显式地重写 `onSaveInstanceState()` 方法,系统默认的实现将会自动保存一些基本的 UI 状态,例如 EditText 的文本内容或 CheckBox 的选中状态等。然而,这种自动保存仅适用于那些拥有唯一 ID 的控件。如果没有为控件指定 ID,则不会执行自动的数据保存和恢复操作[^3]。 ### 使用 ViewModel 除了传统的生命周期回调方法外,还可以利用 Android Architecture Components 中的 `ViewModel` 类来保存 UI 相关的数据。`ViewModel` 的设计目的是为了在配置变更时保持数据不被销毁,它可以在不依赖于 Activity 生命周期的情况下保留数据。 ```java public class MyViewModel extends ViewModel { private MutableLiveData<String> userInput = new MutableLiveData<>(); public LiveData<String> getUserInput() { return userInput; } public void setUserInput(String input) { userInput.setValue(input); } } ``` 在 Activity 中获取 `ViewModel` 实例,并绑定数据: ```java MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class); model.getUserInput().observe(this, input -> { userInputEditText.setText(input); }); ``` 这种方式不仅简化了状态管理,还提高了代码的可测试性和可维护性。 ### 小结 - 使用 `onSaveInstanceState()` 和 `onRestoreInstanceState()` 可以手动保存和恢复 Activity状态。 - 系统默认实现可以自动保存具有唯一 ID 的 UI 控件状态。 - 利用 `ViewModel` 可以更有效地管理 UI 数据,避免重复工作。 通过上述方法,开发者可以根据具体需求选择合适的方式来保存和恢复 Activity状态
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值