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");
}
相关推荐
许彰午29 分钟前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
liang_jy1 小时前
Android SparseArray
android·源码
liang_jy1 小时前
Activity 启动流程扩展篇(一)—— startActivityInner 任务决策全解析
android·源码
Bat U1 小时前
JavaEE|多线程初阶(七)
java·开发语言
NPE~2 小时前
[App逆向]脱壳实战
android·教程·逆向·android逆向·逆向分析
木易 士心3 小时前
别再只会用 drawCircle 了!一文搞懂 Android Canvas 底层机制
android
掌心向暖RPA自动化4 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
AtOR CUES4 小时前
MySQL——表操作及查询
android·mysql·adb
日取其半万世不竭4 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
TeamDev5 小时前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入