这是对这些问题的后续问题: popBackStack() after saveInstanceState() Application crashes in background, when popping a fragment from stack
我正在创建一个使用服务的应用程序,并对服务创建的事件做出反应。其中一个事件在片段内调用,并从后台弹出,如下所示:
getSupportFragmentManager().popBackStack(stringTag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
当应用程序位于前台时,它可以正常工作。当应用程序在后台时,我得到一个
IllegalStateException:无法在onSaveInstanceState
之后执行此操作
我已尝试使用空方法覆盖onSaveInstanceState
。
为什么我只在应用程序处于后台时才能获得此异常,我该如何解决?
答案 0 :(得分:0)
尝试这样的事情。
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);
}
}
当您在恢复应用程序时单独实现上述代码时,您会发现自己处于一个实际上想要弹出的片段中。您可以使用以下剪辑来解决此问题:
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();
}
}