最近我正在阅读FragmentActivity的源代码(很抱歉,在github中找不到源代码,我使用的是本机源jar文件)。FragmentManager包含以下两个成员:

ArrayList<Fragment> mAdded; //
ArrayList<Fragment> mActive; //

两者有什么区别?在什么情况下aFragment会在mAdded中而不是在mActive中?

最佳答案

填充的:
包含已添加但未从活动中移除或分离的片段。
这些片段具有特权,因为它们可以:
对以下事件做出响应:
低内存事件
配置更改
显示自定义菜单并响应菜单项选择。
活动的:
mAdded的超集,包括backbackback中任何对象引用的所有片段。
不在FragmentTransaction中的片段将无法响应事件或显示自定义菜单。
什么事件修改了这两个片段列表?
填充的
如果将片段添加到活动中,则会将片段添加到此列表中。
如果出现以下情况,将从此列表中删除片段:
片段将从活动中移除。
碎片与活动分离。
活跃的
如果将片段添加到活动中,则会将片段添加到此列表中。
只有在以下两种情况下才会从此列表中删除片段:
它已从活动中移除,不在backback中。
从backbackback中弹出一个事务,并对现在不再被backbackback引用的片段反转add或replace操作。
结论
mAdded是一个片段列表,在某种意义上是活动的,而mAdded列表是一个完整的所有片段列表,这些片段仍然与活动相关。mActive包含所有活的碎片(mActive)和冻干的碎片(坐在后面等待通过mAdded复苏)。
继续类比活生生的和低温保存的实体:当活动执行类似于backStackRecord.popFromBackStack()onConfigurationChanged()的回调时,真正关心被传递给响应这些事件机会的片段只有活生生的片段。
所以您将在onLowMemory()中看到,回调只查看FragmentManagerImpl或活动片段。
mAddedfragmentManager.dispatchLowMemory()调用。

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

07-27 17:33