前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android:保存 & 恢复Activity 状态缓存 - onSaveInstanceState()、onRestoreInstanceState()

Android:保存 & 恢复Activity 状态缓存 - onSaveInstanceState()、onRestoreInstanceState()

作者头像
Carson.Ho
发布2020-07-14 11:36:33
2.7K0
发布2020-07-14 11:36:33
举报
文章被收录于专栏:Android知识分享Android知识分享

背景

阅读本文可了解

  1. Activity如何保存临时数据 & 状态
  2. Activity如何恢复临时数据 & 状态

Activity如何保存临时数据 & 状态

1. 核心方法

onSaveInstanceState()

2. 调用时机

当系统 未经你许可 时,可能 销毁了你的Activity,则会被系统调用 。

特别说明:

  • “可能“ 仅表达一种可能性,而不是确实销毁,下面会继续讲解
  • 若是 被用户主动销毁(如 用户按Back键),则不会调用
  • 肯定在 调用onStop()前被调用,但不保证在onPause()前 / 后

3. 具体调用场景

假定为Activity A显示在当前Activity栈的最上层时,以下情况会执行onSaveInstanceState()

注:系统不知道你切换到其他地方后要运行多少其他的程序,自然也不知Activity A是否会被销毁,故系统会调用onSaveInstanceState(),下面所说的所有情况该遵循这原则

4. 使用说明

代码语言:javascript
复制
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

// 通过Bundle参数以键值对的方式进行数据的存储
// 数据恢复:onRestoreInstanceState() & onCreate()
// 上述二者都有一个Bundle类型的参数用于恢复数据
        savedInstanceState.putBoolean("MyBoolean", true);
        savedInstanceState.putDouble("myDouble", 1.9);
        savedInstanceState.putInt("MyInt", 1);
        savedInstanceState.putString("MyString", "Welcome back to Android");
        // ...
        super.onSaveInstanceState(savedInstanceState);
}

补充说明:

  • 布局每1个View默认实现:onSaveInstanceState(),即UI的任何改变都会自动的存储和在activity重新创建的时候自动的恢复(只有在为该UI提供了唯一ID后才起作用)
  • 若需复写该方法从而存储额外的状态信息时,应先调用父类的onSaveInstanceState()(因为默认的onSaveInstanceState()帮助UI存储它的状态)
  • 只使用该方法记录Activity的瞬间状态(UI的状态),而不是去存储持久化数据,因为onSaveInstanceState()调用时机不确定性;可使用 onPause()存储 持久化数据

Activity如何恢复临时数据 & 状态

1. 核心方法

onRestoreInstanceState()

2. 调用时机

当系统“未经你许可”时,确实销毁了你的Activity,则重新启动时会被系统调用

特别说明:

  • 与onSaveInstanceState()区别:此处是 “确实销毁”后才调用
  • 若是 被用户主动销毁(如 用户按Back键),则不会调用
  • 肯定在调用 onStop()前被调用,但不保证在onPause()前 / 后

3. 具体调用场景

若 异常关闭了Activity,即调用了onSaveInstanceState() & 下次启动时会调用onRestoreInstanceState()

注:此时结合Activity的生命周期的调用顺序是:

  1. onCreate()
  2. onStart()
  3. onRestoreInstanceState()
  4. onResume()

4. 使用示例

代码语言:javascript
复制
@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");
}
  • onSaveInstanceState()、onRestoreInstanceState()不一定 成对被调用

如:当正在显示Activity A时,用户按下HOME键回到主界面,然后用户紧接着又返回到Activity A,此时Activity A一般不会因为内存的原因被系统销毁,故Activity A的onRestoreInstanceState()不会被执行

  • onSaveInstanceState的bundle参数会传递到onCreate方法中,可选择在onCreate()中做数据还原

至此,关于Activity的临时数据 & 状态 保存 & 恢复,讲解完毕。下一篇文章我将对讲解Android 的相关知识。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 阅读本文可了解
  • Activity如何保存临时数据 & 状态
    • 1. 核心方法
      • 2. 调用时机
        • 3. 具体调用场景
          • 4. 使用说明
          • Activity如何恢复临时数据 & 状态
            • 1. 核心方法
              • 2. 调用时机
                • 3. 具体调用场景
                  • 4. 使用示例
                  相关产品与服务
                  对象存储
                  对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档