片段活动onSaveInstanceState未被调用

Sal*_*uts 19 android android-fragmentactivity

我已经看到了一些类似的问题,关于onSaveInstanceState没有被称为Fragments,但在我的情况下Fragment工作正常,这是主要FragmentActivity的麻烦.

相关代码看起来很简单:

public class MyFActivity extends FragmentActivity implements ActionBar.TabListener { 
    String[] allValues; // data to save

    @Override
    protected void onSaveInstanceState (Bundle outState) {
        Log.d("putting it!", allValues.toString());
        outState.putStringArray("allValues", allValues);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            allValues = savedInstanceState.getStringArray("allValues");
            Log.d("getting it!", allValues.toString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

暂停活动时(使用后退按钮),onSaveInstanceState永远不会调用,因此,在恢复应用程序时savedInstanceState始终nullonCreate方法内.我尝试添加这样的块:

@Override
public void onPause() {
    super.onPause();
    onSaveInstanceState(new Bundle());      
}
Run Code Online (Sandbox Code Playgroud)

这是在/sf/answers/993664171/中建议的,但是当onSaveInstanceState被调用时,savedInstanceState仍然nullonCreate方法中.我错过了什么?

Ste*_*yle 78

这里的问题是你误解了它是如何onSaveInstanceState工作的.它旨在保存Activity/ Fragment在操作系统因内存或配置更改而需要销毁它的情况下的状态.然后onCreateActivity/ Fragment返回/重新启动时传回此状态.

在a中Fragment,它们的所有生命周期回调都直接与其父级相关联Activity.因此,onSaveInstanceState被调用的Fragment时候其父ActivityonSaveInstanceState调用.

暂停活动时(使用后退按钮),永远不会调用onSaveInstanceState,因此,在恢复应用程序时,onCreate方法中的savedInstanceState始终为null.

当按下时,用户正在销毁Activity它的子Fragment节点,因此没有理由调用onSaveInstanceState,因为实例正在被销毁.当你重新打开它时Activity,它是一个全新的实例,没有保存的状态,所以Bundle传入的onCreatenull.这与设计完全一致.但是,尝试旋转设备或按下主页按钮,然后您将看到它Activity和它的孩子Fragment已经onSaveInstanceState呼叫,并在onCreate返回时返回.

你添加的黑客,直接调用onSaveInstanceState(new Bundle());内部onPause,是一个非常糟糕的做法,因为你永远不应该直接调用生命周期回调.这样做会使您的应用程序进入非法状态.

如果您真正想要的是让您的数据在应用程序实例之外持续存在,我建议您考虑使用SharedPreferences数据库来获取更高级的数据.然后,您可以在持久数据onPause()发生变化时保存.

希望这可以帮助.

  • 在一个Fragment中,所有生命周期回调都直接与其父Activity绑定。因此,当其父Activity调用了onSaveInstanceState时,onFragment就会在Fragment上调用。那么,由一个活动托管的片段又如何呢?从理论上讲,诸如onSavedInstanceState和...之类的方法在同一活动中传输时将永远不会被调用,对吗? (2认同)

Tan*_*ien 8

在接受的答案的更新中:

onSaveInstanceState如果你使用的是ViewPagera FragmentStatePagerAdapter(而不是FragmentPagerAdapter),则可以调用片段

FragmentStatePagerAdapter

当存在大量页面时,此版本的寻呼机更有用,更像列表视图.当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态.与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关联的更少的存储器,代价是在页面之间切换时可能具有更多的开销.

别忘了:

使用FragmentPagerAdapter时,主机ViewPager必须具有有效的ID集.