Fragment那点事④mAdded&mActive

文章里所有分析都是根据Android Sdk 25.3.1 v4包

资料链接 StackOverFlowmAdded and mActive Fragment Lists

经过前面几篇对 FragmentManager 源码的分析,对 mAddedmActive 这两个属性有了一定的理解,下面是在 StackOverFlow 上的一个问题,详细的总结了这两个属性的具体差异。

mAdded:

  1. 包含了所有已经 added 并且没有被从 Activity 中 removed 和 detached 的 Fragments。
  2. 这些 Fragment 在视图交互上有如下特性:
    • 对下面事件作出反应:
      • 低内存事件
      • configuration changes (比如屏幕旋转)
    • 展示自定义 menu 并对 menu 的点击作出回应 onMenuItemSelected()
    • Fragment 的生命周期响应它宿主 Activity 的生命周期
  3. 不在 mAdded 中的 Fragments 不能对事件作出相应和展示自定义的 menu。

mActive:

mAdded 的一个超集,是绑定到一个 Activity 上的所有 Fragment。包括返回栈中所有的通过任何 FragmentTransaction 添加的 Fragments。这是非常重要的因为如下原因:

  • 当一个 Activity 要保存它的 State 时,它必须保存它所有 Fragment 的状态,因为 mActive 保存了所有 Fragment,所以系统只要存储这个列表里的 Fragment 的状态就好了。而mAdded 只是被序列化成一个整形数组,每个元素指向 Fragment 在 mActive 中的下标位置(这块在前面 Fragment 的存储与恢复中分析到了)。
  • 在恢复 Activity 的状态时,FragmentManager 的状态也会被恢复,mActive 列表就可以被用来恢复 mAdded 列表,因为保存状态的时候mAdded 被简单的保存为整形数组。
  • 当一个 Activity 经历它的各生命周期时,它必须引起所有绑定的 Fragment 经历各自的生命周期。
    • 该 Activity 的 FragmentManager 有义务去引导所有 Fragemnt 转换到正确的状态,这其中包括屏幕上可见的 Fragment 的 View 层级的初始化,并且调用正确的生命周期函数。
    • 为了确保完整,FragmentManager 将遍历mActive 中所有的 Fragment,而不仅仅是 mAdded
  • 它持有所有 BackStack 返回栈引用的对象。
    • 这确保了返回栈中对 Fragment 操作的回滚能够实现。

什么情况下这两个 Fragment 的列表会变动呢?

  • mAdded

    • 如果一个 Fragment 被添加到 Activity 中,那么这个 Fragment 会被 added 到该列表。
    • Fragment 被从该列表中移除:
      • Fragment 被从 Activity 中 removed。
      • Fragment 从 Activity 中 detached。
  • mActive:

    • 如果一个 Fragment 被添加到 Activity 中,那么这个 Fragment 会被 added 到该列表。
    • 只有在下面这两种情况 Fragment 才会被从该列表中移除:
      • Fragment 被从 Activity 中移除,并且没有在返回栈中。
      • 一个 transaction 从返回栈中被 pop 出来、 Fragment 的 add 或者 replace 操作被逆向,即返回栈不再持有该 Fragment。
  • 结论

    mAddedalive in a sense (在感官上存活的),而 mActive 是所有绑定在 Activity 上的 Framgent 列表。mActive 包括 alive Fragments (mAdded) 和 freeze dried (冷冻储存) Fragments (仍然在返回栈中等待被恢复)。

    继续对比活着的和冷冻储存的实体的区别:当 activities 触发回调函数比如 onConfigurationChanged() 活着 onLowMemory(),真正关系这些回调事件的只是活着的 Fragments。

    所以你会发现在 FragmentManagerImpl 回调只会遍历 mAdded 即活着的 Fragments。

    fragmentManager.dispatchLowMemory()activity.onLowMemory() 中被调用。

    public void dispatchLowMemory() {
        if (mAdded != null) {
            for (int i=0; i<mAdded.size(); i++) {
                Fragment f = mAdded.get(i);
                if (f != null) {
                    f.performLowMemory();
                }
            }
        }
    }
    

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

推荐阅读更多精彩内容