原文地址:请扫文后stormzhang大神的微信公众号——AndroidDeveloper

写在前面

上周我们总结了Activity中数据的保存和恢复,我们花两分钟来回顾一下:

Android中突发情况数据的保存和恢复

一句话总结

  • 临时数据
    对于临时数据,我们使用onSaveInstanceState方法进行保存,并且在onCreate方法中恢复。

  • 永久数据
    对于持久性数据,我们要在onPause方法中进行存储,但是要注意,onPause方法中不能进行大量操作,会影响其他Activity进入任务栈栈顶。

ps:在Activity中弹出一个当前Activity的Dialog并不会有任何生命周期方法调用(以前我曾以为会调用onPause方法)。因为Dialog作为一个View本身就是属于当前Activity的,Activity并没有失去焦点。

ok,完成了回顾,下面来开始本篇博客:

Fragment在我们的项目中真的太实用和常见了,它的使用频率和数量甚至超过了Activity,所以本文目的是探究Fragment的数据保存和恢复。

在开始讲解之前,你应该对Fragment的生命周期方法有一定了解,推荐给大家一篇博客,我认为不错:

「Fragment生命周期方法详解」

准备工作做了这么多,下面我们正式开始吧!

本文直接选用了「第一行代码」中Fragment模块的讲解例子,点击下面的按钮分别跳转这四个Fragment。为了方便观察,我重写了Fragment所有生命周期方法和onSaveInstanceState方法,并打印了Log。

我们目的是探究Fragment数据的保存和恢复,在这里我把它分为两大类的情况:

  • 1. 单个Fragment遭遇一些突发情况

  • 2. Fragment之间相互的切换或覆盖

在此之前,先引入一个返回栈的概念。

我想你应该知道返回栈是什么,并且你以前接触的应该是保存Activity的返回栈,类比Activity,Fragment返回栈其实是保存Fragment的栈结构。区别在于:Fragment的返回栈由Activity管理;而Activity的返回栈由系统管理。

在未修改之前,本文添加并切换Fragment的方式都是在返回栈中仅有一个 fragment:

不要心急,过一会再说怎么去在返回栈中压入多个fragment,我们先来处理只有一个的情况

1. 单个Fragment遭遇突发情况

仍然是用以下突发情况进行测试:

  • 点击back键

  • 点击锁屏键

  • 点击home键

  • 其他APP进入前台

  • 启动了另一个Activity

  • 屏幕方向旋转

  • APP被Kill

不过与上篇博客不同的是,我们在清单文件中,给Activity做了如下配置:

这么做的目的是当屏幕方向发生改变的时候,fragment所依附的Activity并不会重新销毁再创建,让情况相对简单一点。

测试结果

当一个fragment孤零零地呆在返回栈时,它所处的情况与Activity如出一辙。类比Activity对数据的保存和恢复,我们可以对此得出结论:

  • 临时数据 对于临时数据,我们使用onSaveInstanceState方法进行保存,并且在onCreateView方法中恢复(请注意是onCreateView)。

  • 永久数据 对于持久性数据,我们要在onPause方法中进行存储。

2. Fragment之间的相互切换或覆盖

当返回栈中保证只有一个Fragment,相互切换时,生命周期方法的调用是怎样的呢?例如本例中,从fragment03切换到fragment04:

可以看到,上述的这种情况,两个fragment从创建到销毁,经历了所有的生命周期方法。

如果返回栈中fragment的数量为多个呢?首先在切换时,加上以下代码,保证将fragment放入返回栈中:

使用addToBackStack方法,就能将fragment放入相应的返回栈中去了,从表象上来看区别在于进入其他fragment时,点击back键时,可以返回上一个fragment。这时候切换时,生命周期方法就是如何调用的呢?

对比这两张生命周期方法的图,能得出两个结论。

  • 1. 无论任务栈中fragment数量为多少,onSaveInstanceState方法都没有调用

  • 2. 当fragment任务栈中有多个fragment时,进入下一个fragment时,并不会销毁fragment实例,而是仅仅销毁视图,最终调用的方法为onDestoryView。
      

所以此时我们要去保存临时数据,并不能仅保存在onSaveInstanceState中(因为它可能不会调用),还应该在onDestoryView方法中进行保存临时数据的操作,源码如下:

因为没有了系统提供的bundle参数,我们选择把数据保存在Arguments中,代码就不带着大家一步一步的看了,因为逻辑并不复杂,挺好理解的。通过这种方式,我们就挺容易的将临时数据和fragment的一些状态保存进bundle中并在需要时恢复了。

不知不觉本篇文章就要结束了,感兴趣的可以尝试当调用ft.add()方式去添加fragment时,生命周期方法又是怎样调用的呢?

一句话总结本文

Fragment对临时数据的保存,仅仅依靠onSaveInstanceState方法是不行的,还需要在onDestoryView中进行相应操作,具体参考上面的代码。

Fragment中对于一些持久性的数据,仍应在onPause中保存。

投稿作者:MeloDev

原文:http://www.jianshu.com/p/015c79bedb41

微信不支持外链,可点击「阅读原文」查看,觉得有帮助不妨转发支持下,长按二维码订阅。

Android中Fragment数据保存和恢复相关推荐

  1. android中fragment如何保存edittext文本,如何在Android中使用DialogFragment进行文本输入?...

    我想获得一个值,用户输入到一个对话框,使用建议的DialogFragment类为它,对话框构造和运行良好,但我不能返回EditText参数的值父类,没有得到一个空值指针异常.如何在Android中使用 ...

  2. android libbfaac.so,Android中Json数据读取与创建

    一:  Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...

  3. 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...

    各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...

  4. EP21 Activity在非正常行为下的数据保存和恢复

    Activity在非正常行为下的数据保存和恢复 onSaveInstanceState 今天同举在移植CPActivity到印尼钱包的时候遇到了一个数据保存的问题,这里简单了解了一下. 比如我们要做一 ...

  5. Android中的数据存储

    Android中的数据存储 1.SharedPreference存储(共享参数) 1.1.使用SharedPreferences存储和读取数据的步骤 存储数据 保存数据一般分为四个步骤: 使用Acti ...

  6. android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解

    Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...

  7. Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件、zip压缩文件

    Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件.zip压缩文件 目录 Python将Pandas中Dataframe数据保存为gzip/zip文件:gz ...

  8. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  9. Android中XML数据解析

    转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML ...

最新文章

  1. 如何防止无线网络被破解
  2. Android Apk增量更新
  3. zookeeper无故挂掉,启动不起来的问题
  4. Asp.Net Core 快速邮件队列设计与实现
  5. 如何在指定的内容中找出指定字符串的个数
  6. 电工产品的电磁兼容要求
  7. Halcon深度学习自定义网络模型-VGG16
  8. Java程序调用高德开放API——IP定位
  9. 分享个永久免费的虚拟主机|PHP空间商
  10. 在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
  11. 5 款常用的 C++ 在线编译器推荐
  12. c语言如何判断条件,C语言 条件判断详细介绍
  13. 嵌入式linux界面开发,基于嵌入式Linux平台实现GUI系统的设计方案
  14. 【虚幻引擎UE】UE5 UMG布局和视觉设计(自适应篇)
  15. 电脑屏幕旋转工具 躺着看才舒服。
  16. SSL数字证书是什么?
  17. IOS OC 多态(白话)
  18. field set java_Java Field setInt()用法及代码示例
  19. 解决主机前面板耳机孔无声问题以华硕主板为例
  20. 公众号文章里使用svg进行交互

热门文章

  1. 【2014】深度技术GHOST Win7 SP1 X64马年快速装机版
  2. Django的边边角角(二):缓存、中间件、分页器、富文本
  3. 创下多项“首个”的开源玩家
  4. Android游戏音效控制
  5. 原来写刮刮卡这么简单,几行代码就搞定,你来你也行,谢谢惠顾!
  6. AVS之HPM3.2代码学习笔记1:TSCPM技术的原理和代码实现
  7. 【HarmonyOS硬件开发】hpm使用问题总结
  8. 企业中是如何运用二八定律?
  9. 如果公司有这5种人,建议马上开除!
  10. 气瓶充装证_一般考个气瓶充装证得多少钱上哪里可以办理