简体   繁体   中英

Android exception when popping backstack

This is a followup question to these questions: popBackStack() after saveInstanceState() Application crashes in background, when popping a fragment from stack

I am creating an application which uses a service and is reacting to events which are created by the service. One of the events is called within a fragment and is popping from the backstack like this:

getSupportFragmentManager().popBackStack(stringTag, FragmentManager.POP_BACK_STACK_INCLUSIVE);

When the app is in the foreground it works fine. When the app is in the background, I get an

IllegalStateException: Can not perform this action after onSaveInstanceState

I have already tried overriding onSaveInstanceState with an empty method.

Why do I get this exception only when the app is in the background and how can I solve it?

Try something like this.

public abstract class PopActivity extends Activity {

        private boolean mVisible; 

       @Override
        public void onResume() {
            super.onResume();
            mVisible = true;
        }

        @Override
        protected void onPause() {
            super.onPause();
            mVisible = false;
        }

        private void popFragment() {
            if (!mVisible) {
                return;
            }

            FragmentManager fm = getSupportFragmentManager();
            fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }

when you implement the above code alone when you resume the app you will find yourself in a fragment that you actually want to be popped. You can use the following snipped to fix this issue:

public abstract class PopFragment extends Fragment {

    private static final String KEY_IS_POPPED = "KEY_IS_POPPED";
    private boolean mPopped;

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(KEY_IS_POPPED, mPopped);
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            mPopped = savedInstanceState.getBoolean(KEY_IS_POPPED);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (mPopped) {
            popFragment();
        }
    }

    protected void popFragment() {
        mPopped = true;
        // null check and interface check advised
        ((PopActivity) getActivity()).popFragment();
    }
}

Original Author

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM