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");
}
相关推荐
等一场春雨20 分钟前
Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解
java·分布式·java-zookeeper
上海拔俗网络35 分钟前
“AI智能实训系统:让学习更高效、更轻松!
java·团队开发
胡耀超44 分钟前
解读若依框架中的`@Excel` 和 `@Excels` 注解
java·excel·若依
拾忆,想起1 小时前
Spring拦截链揭秘:如何在复杂应用中保持控制力
java·数据库·spring
HelloZheQ1 小时前
Spring 中的 @RestController 注解详解
java·后端·spring
观棋不语的我1 小时前
maven下载依赖报错:on-resolvable parent POM xxx
java·maven
程序员老冯头1 小时前
第三十六章 C++ 多线程
java·c++·信号处理
luochen330x1 小时前
C++类的引入
java·开发语言
doshy_1 小时前
aws协议实现文件管理
java·spring boot·aws
嶂蘅2 小时前
【调研】Android app动态更新launcher_icon
android·前端·程序员