最近我正在阅读FragmentActivity
的源代码(很抱歉,在github中找不到源代码,我使用的是本机源jar文件)。FragmentManager
包含以下两个成员:
ArrayList<Fragment> mAdded; //
ArrayList<Fragment> mActive; //
两者有什么区别?在什么情况下a
Fragment
会在mAdded
中而不是在mActive
中? 最佳答案
填充的:
包含已添加但未从活动中移除或分离的片段。
这些片段具有特权,因为它们可以:
对以下事件做出响应:
低内存事件
配置更改
显示自定义菜单并响应菜单项选择。
活动的:mAdded
的超集,包括backbackback中任何对象引用的所有片段。
不在FragmentTransaction
中的片段将无法响应事件或显示自定义菜单。
什么事件修改了这两个片段列表?
填充的
如果将片段添加到活动中,则会将片段添加到此列表中。
如果出现以下情况,将从此列表中删除片段:
片段将从活动中移除。
碎片与活动分离。
活跃的
如果将片段添加到活动中,则会将片段添加到此列表中。
只有在以下两种情况下才会从此列表中删除片段:
它已从活动中移除,不在backback中。
从backbackback中弹出一个事务,并对现在不再被backbackback引用的片段反转add或replace操作。
结论mAdded
是一个片段列表,在某种意义上是活动的,而mAdded
列表是一个完整的所有片段列表,这些片段仍然与活动相关。mActive
包含所有活的碎片(mActive
)和冻干的碎片(坐在后面等待通过mAdded
复苏)。
继续类比活生生的和低温保存的实体:当活动执行类似于backStackRecord.popFromBackStack()
或onConfigurationChanged()
的回调时,真正关心被传递给响应这些事件机会的片段只有活生生的片段。
所以您将在onLowMemory()
中看到,回调只查看FragmentManagerImpl
或活动片段。mAdded
由fragmentManager.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();
}
}
}
}