Android中Fragment数据保存和恢复

Android中Fragment数据保存和恢复

找到一个更好解释更清楚的方案:
https://segmentfault.com/a/1190000006691830

不要往下看了,过时了~

写在前面:

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

Android中Activity数据的保存和恢复

一句话总结:

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

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

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

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

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

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

Fragment生命周期方法详解

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

测试App截图

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

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

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

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

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

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

添加切换fragment

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

  1. 单个Fragment遭遇突发情况

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

    • 点击back键

    • 点击锁屏键

    • 点击home键

    • 其他APP进入前台

    • 启动了另一个Activity

    • 屏幕方向旋转

    • APP被Kill

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


    配置configChange

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

    测试结果:

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

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

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

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

fragment03切换fragment04

  可以看到,上述的这种情况,两个fragment从创建到销毁,经历了所有的生命周期方法。
  如果返回栈中fragment的数量为多个呢?首先在切换时,加上以下代码,保证将fragment放入返回栈中:

addToBackStack

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

返回栈有多个fragment切换

对比这两张生命周期方法的图,能得出两个结论。
  1.无论任务栈中fragment数量为多少,onSaveInstanceState方法都没有调用
  2.当fragment任务栈中有多个fragment时,进入下一个fragment时,并不会销毁fragment实例,而是仅仅销毁视图,最终调用的方法为onDestoryView。
  所以此时我们要去保存临时数据,并不能仅保存在onSaveInstanceState中(因为它可能不会调用),还应该在onDestoryView方法中进行保存临时数据的操作,源码如下:

代码截图

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

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

结束之前我们来一句话总结下本文:
Fragment对临时数据的保存,仅仅依靠onSaveInstanceState方法是不行的,还需要在onDestoryView中进行相应操作,具体参考上面的代码。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容