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");
}
相关推荐
H_HX1266 分钟前
IDEA的下载和安装
java·intellij-idea·idea
AIGS0018 分钟前
向量空间JBoltAI:本体语义如何跨越企业AI的语义鸿沟
java·大数据·人工智能·人工智能ai大模型应用
r_oo_ki_e_12 分钟前
Java 线程池
java·开发语言
日月云棠14 分钟前
Spring 源码深度剖析:DispatcherServlet 的自动化注册机制
java·后端
CyL_Cly28 分钟前
解决官网下载慢!Android Studio 最新版网盘下载
android·ide·android studio
智塑未来39 分钟前
鸿蒙系统对比安卓、iOS,核心优势是什么?
android·ios·harmonyos
AI刀刀44 分钟前
豆包智能体对话导出后,如何构建长期归档与高效检索体系?
android·人工智能·word·excel·ai导出鸭
Jazz_z1 小时前
通过 Java 实现 Word 转 TXT
java·c#·word
SamDeepThinking1 小时前
为什么我会主动给一个年轻程序员加薪、晋升?
java·后端·程序员
ikun_文2 小时前
Java面向对象编程OOP核心知识
java