防止Android中的片段恢复

时间:2013-03-20 09:05:30

标签: android memory-management garbage-collection fragment recreate

我们正在使用Fragments,我们不需要在重新创建Activity时自动恢复它们。 但是,每当Activity::onCreate(Bundle savedInstanceState) - >调用super.onCreate(savedInstanceState),即使我们对这些片段使用setRetainInstance(false),也会恢复片段。

此外,在Fragments Fragment.performCreateView()中直接调用Fragment::onAttach(),而不是通过Fragment等等。另外,在恢复的ndroid:configChanges="orientation|screenSize|screenLayout ...

中,某些字段为空

有人知道如何阻止Android恢复片段吗?

P.S。我们知道,如果要为配置更改重新创建活动,可以通过向清单添加{{1}}来完成。但是在自动内存清理的情况下重新创建活动呢?

7 个答案:

答案 0 :(得分:41)

我们完成了添加到活动:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
}

它禁止在Activity的创建/重新创建周期中保存任何数据,并避免片段自动重新创建。

答案 1 :(得分:14)

@goRGon的答案对我来说非常有用,但是如果在重新创建后需要更多信息转发到您的活动,这样的使用会导致严重的问题。

这是改进版本,只删除"片段",但保留其他所有参数。

从捆绑包中删除的ID是android.support.v4.app.FragmentActivity类的FRAGMENTS_TAG字段的一部分。它当然可能会随着时间的推移而改变,但不是预期的。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(createBundleNoFragmentRestore(savedInstanceState));
}

/**
 * Improve bundle to prevent restoring of fragments.
 * @param bundle bundle container
 * @return improved bundle with removed "fragments parcelable"
 */
private static Bundle createBundleNoFragmentRestore(Bundle bundle) {
    if (bundle != null) {
        bundle.remove("android:support:fragments");
    }
    return bundle;
}

答案 2 :(得分:2)

当使用接受的答案中描述的方法时,使用ViewPager获得NPE的人请覆盖

ViewPager.onRestoreInstanceState(Parcelable state)

方法和调用

super.onRestoreInstanceState(null);

代替。

答案 3 :(得分:1)

我删除了Activity的onCreate中的片段。

答案 4 :(得分:0)

我还有一个ViewPager所以我检查了fragmentMananger是否有片段并在onCreate()中将其删除。

使用例如这个帖子:Remove all fragments from container

FragmentManager fm = getSupportFragmentManager();
for (Fragment fragment: fm.getFragments()) {
  fm.beginTransaction().remove(fragment).commitNow();
}

commitNow()同步删除片段。

答案 5 :(得分:0)

我遇到TransactionTooLargeException的问题。因此,值得庆幸的是,在使用tolargetool之后,我发现片段(android:support:fragments)处于内存中,并且事务变得太大。所以最后我做到了,效果很好。

@Override
public void onSaveInstanceState(final Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("android:support:fragments", null);
}

答案 6 :(得分:-1)

查看未自动恢复的层次结构。因此,在Fragment.onCreateView()Activity.onCreate()中,您必须恢复所有视图(从xml或以编程方式)。每个包含片段的ViewGroup必须具有与第一次创建时相同的ID。创建视图层次结构后,Android会恢复所有片段并将其视图放在右侧ViewGroup中,这要归功于ID。假设Android记住片段所在的ViewGroup的ID。这发生在onCreateView()onStart()之间。