Android中Fragment数据保存和恢复
原文地址:请扫文后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数据保存和恢复相关推荐
- android中fragment如何保存edittext文本,如何在Android中使用DialogFragment进行文本输入?...
我想获得一个值,用户输入到一个对话框,使用建议的DialogFragment类为它,对话框构造和运行良好,但我不能返回EditText参数的值父类,没有得到一个空值指针异常.如何在Android中使用 ...
- android libbfaac.so,Android中Json数据读取与创建
一: Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...
- 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...
各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...
- EP21 Activity在非正常行为下的数据保存和恢复
Activity在非正常行为下的数据保存和恢复 onSaveInstanceState 今天同举在移植CPActivity到印尼钱包的时候遇到了一个数据保存的问题,这里简单了解了一下. 比如我们要做一 ...
- Android中的数据存储
Android中的数据存储 1.SharedPreference存储(共享参数) 1.1.使用SharedPreferences存储和读取数据的步骤 存储数据 保存数据一般分为四个步骤: 使用Acti ...
- android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解
Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...
- Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件、zip压缩文件
Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件.zip压缩文件 目录 Python将Pandas中Dataframe数据保存为gzip/zip文件:gz ...
- android listview 数据同步,android中ListView数据刷新时的同步方法
本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...
- Android中XML数据解析
转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML ...
最新文章
- 如何防止无线网络被破解
- Android Apk增量更新
- zookeeper无故挂掉,启动不起来的问题
- Asp.Net Core 快速邮件队列设计与实现
- 如何在指定的内容中找出指定字符串的个数
- 电工产品的电磁兼容要求
- Halcon深度学习自定义网络模型-VGG16
- Java程序调用高德开放API——IP定位
- 分享个永久免费的虚拟主机|PHP空间商
- 在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
- 5 款常用的 C++ 在线编译器推荐
- c语言如何判断条件,C语言 条件判断详细介绍
- 嵌入式linux界面开发,基于嵌入式Linux平台实现GUI系统的设计方案
- 【虚幻引擎UE】UE5 UMG布局和视觉设计(自适应篇)
- 电脑屏幕旋转工具 躺着看才舒服。
- SSL数字证书是什么?
- IOS OC 多态(白话)
- field set java_Java Field setInt()用法及代码示例
- 解决主机前面板耳机孔无声问题以华硕主板为例
- 公众号文章里使用svg进行交互