从后台打开应用程序后如何检索上一个片段? (未杀死的应用)

时间:2019-06-24 19:31:40

标签: android sharedpreferences android-lifecycle android-background android-savedstate

我有一个非常独特的问题,我试图通过当前片段(最后一个可见片段)检索进入主屏幕之前的先前片段

不要再混淆了,这是解决我的问题的步骤

1)通过单击按钮(例如按钮A)从此处打开片段A,启动mainactivity

2)从片段A中,按下另一个按钮,例如B,这将打开片段B。

3)片段B具有关闭并保存按钮,按下该按钮可将我带回到上一个后退片段A(activity.backpressed())

4)现在,我有一个场景,我要通过按按钮B来调用片段B。单击保存并关闭后,如果我立即按home按钮并转到后台并返回到应用程序,它将重新启动该应用程序将全面启动mainactivity,而不是打开片段A(这是所需的片段)。

到目前为止,这是我的代码:      这是我打开片段的通用代码:

 public void openFragment(@NonNull Fragment fragment, String tag) {
        Fragment f = getSupportFragmentManager().findFragmentByTag(tag);
        if (f != null) return;
        getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.anim.slide_up, R.anim.slide_bottom, R.anim.slide_up, R.anim.slide_bottom)
                .add(R.id.cl_root_view, fragment, tag)
                .addToBackStack(tag)
                .commit();
    }

在单击按钮B时,我将其称为:

openFragment( FragmentB.newinstance(), fragmentB.TAG);

片段B打开后,我将更新数据,然后单击“保存并关闭”:

@OnClick(R.id.saveAndClose)
    void onSaveClick() {
        // update the contents 
          closeFragment();

    }

    protected void closeFragment() {
        Activity activity = getActivity();
        hideKeyboard();
        if (activity != null) {
            activity.onBackPressed();
        }
    }

您可以看到问题是,数据按预期保存,但是如果我单击“主页”按钮,则在重新打开屏幕/或恢复时,就在保存过程完成并且片段(通过反压)弹出之前,该应用程序重新启动,而不是看到fragmentA(这是基础调用片段)。 (我知道问题正在发生,因为所有这些片段的活动都是相同的,并调用activity.onBackPressed();似乎堆栈中的所有内容都被破坏,并且在恢复应用程序后,似乎它再次调用了活动,而不是后栈中的最后一个片段)。知道如何解决这个问题吗?

我在线上针对类似问题尝试了不同的解决方案,但是没有任何效果,我找不到与我类似的任何问题。另外,在saveedinstancestate和保留实例状态上似乎并没有解决问题。任何想法或建议都会非常有帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

我知道了。 这是适合我的解决方案:

 fragmentManager = getFragmentManager();
        //check if on orientation change.. do not re-add fragments!
        if(mSavedInstanceState == null) {
            //instantiate the fragment manager
            fragmentTransaction = fragmentManager.beginTransaction();
            Fragment prevFragment = fragmentManager.findFragmentByTag(FragmentB.TAG);
            if (prevFragment != null) {
                fragmentTransaction.remove(prevFragment);
            }
            try {
                fragmentManager.popBackStack();
            }catch (IllegalStateException e){
                e.printStackTrace();
            }
            fragmentTransaction.commitAllowingStateLoss();

当我的应用程序在后台运行时,我能够成功弹出fragmentB,并因此到达fragmentA,因此当我返回到我的应用程序时,我能够看到具有从fragmentB返回的更新值的fragmentA。