onSaveInstanceState()与onRestoreInstanceState()

本文详细探讨了Android中onSaveInstanceState和onRestoreInstanceState的作用、调用时机,以及它们在Activity生命周期中的运用,特别是何时保存和恢复Bundle中的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.二者作用

2.onSaveInstanceState调用时机

2.1 五种情况

前4种情况Activity生命周期:

2.2 注意事项:确定会被系统回收并销毁,不会调用此方法

两个例子

3.onRestoreInstanceState调用时机

3.1实例——屏幕切换生命周期

3.2 极端情况

3.3 两个方法间关系 

4.onCreate()与onRestoreInstanceState()中Bundle区别

4.1 Bundle?

4.2 择优

4.3 两种方式代码实例


1.二者作用

Android系统的回收机制会在未经用户主动操作的情况下销毁activity

为了避免系统回收activity导致数据丢失

Android为我们提供了onSaveInstanceState(Bundle outState)和 onRestoreInstanceState(Bundle savedInstanceState)用于“保存和恢复”数据

2.onSaveInstanceState调用时机

只有在activity有可能被异常终止的情况下会被调用

2.1 五种情况

前4种情况Activity生命周期:

2.2 注意事项:确定会被系统回收并销毁,不会调用此方法

两个例子

1、用户按下返回键

2、调用finish()方法手动销毁Activity

3.onRestoreInstanceState调用时机

activity被系统回收,重新创建activity的情况下才会被调用。

3.1实例——屏幕切换生命周期

当屏幕反转切换时,是ActivityA的销毁与B的新建

onPause后需要onSaveInstanceState()保存,再在onCreate后执行该方法恢复数据

onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume

3.2 极端情况

而按HOME键返回桌面,又马上点击应用图标回到原来页面时

生命周期

onPause  -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume

activity没有被系统回收,不会调用onRestoreInstanceState()

3.3 两个方法间关系 

调用onRestoreInstance()   一定   在上个Activity调用了onSaveInstance()

而调用了onSaveInstance()不一定,需要activity重建,才能调用onRestoreInstance()

4.onCreate()与onRestoreInstanceState()中Bundle区别

4.1 Bundle?

onCreate()里的Bundle参数可能为空

只有在上次activity被回收了才会调用onRestoreInstanceState(),所以Bundle一定非空

4.2 择优

有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据;

而onRestoreInstanceState是在onStart()之后被调用的;

所以用onRestoreInstanceState会比较方便。

4.3 两种方式代码实例

//保存和恢复数据
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//可以把要保存的静态全局变量先转成Json
        savedInstanceState.putBoolean("MyBoolean", true);
        savedInstanceState.putDouble("myDouble", 1.9);
        savedInstanceState.putInt("MyInt", 1);
        savedInstanceState.putString("MyString", "Welcome back to Android");
        // etc.
        super.onSaveInstanceState(savedInstanceState);
}
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
// 从savedInstanceState中恢复数据,如果没有需要恢复数据savedInstanceState为nul 
      if (savedInstanceState != null) {
        boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
        double myDouble = savedInstanceState.getDouble("myDouble");
        int myInt = savedInstanceState.getInt("MyInt");
        String myString = savedInstanceState.getString("MyString");
      }
     }
//或在onRestoreInstanceState恢复数据
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
 
        boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
        double myDouble = savedInstanceState.getDouble("myDouble");
        int myInt = savedInstanceState.getInt("MyInt");
        String myString = savedInstanceState.getString("MyString");
}

Android中,`EditText` 的内容需要在Activity销毁(如用户旋转设备、按Home键等)后保存,并在下次启动时恢复,这通常通过重写 ` onSaveInstanceState()` 和 ` onRestoreInstanceState()` 来实现。这两个方法分别用于保存和恢复组件的状态。 首先,在`onSaveInstanceState(Bundle outState)` 中,我们需要将 `EditText` 的文本添加到`Bundle`中: ```java @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 获取EditText实例并保存其文本 EditText editText = findViewById(R.id.edit_text_id); String text = editText.getText().toString(); // 将文本存入Bundle outState.putString("edit_text_data", text); } ``` 然后,在`onCreate(Bundle savedInstanceState)` 或者 `onRestoreInstanceState(Bundle savedInstanceState)` 中,我们在Activity复原时从`Bundle`中恢复文本: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) { // 如果存在先前的状态数据 String savedText = savedInstanceState.getString("edit_text_data"); if (savedText != null) { // 从 Bundle 中获取并设置回 EditText EditText editText = findViewById(R.id.edit_text_id); editText.setText(savedText); } } } // 当 Activity 被恢复时,也可以在这里调用 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); // 恢复 EditText 文本同上 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值