2016-03-17 72 views
0

这是一个后续问题这些问题: popBackStack() after saveInstanceState() Application crashes in background, when popping a fragment from stack弹出时的Android异常堆栈中

我创建它使用一个服务,并反应,这是由服务创建的事件的应用程序。事件之一是片段中调用,并从堆栈中弹出这样的:

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

当应用程序在前台正常工作。当应用程序在后台,我得到一个

IllegalStateException异常:

的onSaveInstanceState

我已经尝试重写onSaveInstanceState一个空的方法后无法执行此操作。

为什么我只在应用程序处于后台时才能得到此异常,我该如何解决?

+1

的可能重复[后台应用程序崩溃,从弹出堆栈中的片段时(http://stackoverflow.com/questions/27962317 /应用程序崩溃在背景时,从弹出片段从堆栈) –

回答

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(); 
    } 
} 

Original Author

+0

但我不使用导航抽屉..我有一个SlidingTabLayout –

+0

@JJAb只使用该部分功能,然后 – Stallion

+0

但像我一样弹出后台堆栈不会调用onBackPressed()。此外,该应用程序已经处于该阶段的后台,因此我不需要警告任何用户。我只需要该事件在我处于后台时工作 –