onSaveInstanceState()与onRestoreInstanceState()

目录

1.二者作用

2.onSaveInstanceState调用时机

[2.1 五种情况](#2.1 五种情况)

前4种情况Activity生命周期:

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

两个例子

3.onRestoreInstanceState调用时机

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

[3.2 极端情况](#3.2 极端情况)

[3.3 两个方法间关系](#3.3 两个方法间关系)

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

[4.1 Bundle?](#4.1 Bundle?)

[4.2 择优](#4.2 择优)

[4.3 两种方式代码实例](#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 两种方式代码实例

java 复制代码
//保存和恢复数据
@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");
}
相关推荐
开发之奋斗人生36 分钟前
android关于pthread的使用过程
android·pthread
保持学习ing1 小时前
SpringBoot前后台交互 -- 登录功能实现(拦截器+异常捕获器)
java·spring boot·后端·ssm·交互·拦截器·异常捕获器
gadiaola1 小时前
【JVM面试篇】高频八股汇总——类加载和类加载器
java·jvm·面试
七七&5561 小时前
【Java开发日记】基于 Spring Cloud 的微服务架构分析
java·spring cloud·架构
小猫咪怎么会有坏心思呢1 小时前
华为OD机考-数字游戏-逻辑分析(JAVA 2025B卷)
java·游戏·华为od
Aesopcmc1 小时前
idea 启动jar程序并调试
java·intellij-idea·jar
南极Ou2 小时前
Mybatis逆向工程详解(附源码文件)动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
xml·java·mybatis
Moshow郑锴2 小时前
IDEA为何一直无法使用超过4g内存
java·ide·intellij-idea
木头左2 小时前
Docker容器化镜像分层原理及优化策略
java·eureka
李少兄2 小时前
IntelliJ IDEA代码提示忽略大小写设置详解
java·ide·intellij-idea