2016-03-17 2 views
0

Это Followup вопрос на эти вопросы: popBackStack() after saveInstanceState() Application crashes in background, when popping a fragment from stackAndroid исключения, когда выскакивает backstack

Я создаю приложение, которое использует службу и реагируя на события, которые создаются с помощью службы. Одним из событий, вызывается внутри фрагмента и выскакивают из backstack так:

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

Когда приложение находится на переднем плане он работает отлично. Когда приложение работает в фоновом режиме, я получаю

IllegalStateException: Не удается выполнить это действие после того, как onSaveInstanceState

Я уже пытался перекрывая onSaveInstanceState с пустым методом.

Почему я получаю это исключение только тогда, когда приложение находится в фоновом режиме и как я могу его решить?

+1

Возможного дубликат [аварии приложений в фоновом режиме, когда выскакивает фрагмент из стека] (http://stackoverflow.com/questions/27962317/application-crashes-in-background-when-popping-a-fragment-from-stack) –

ответ

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 используйте только часть else в этой функции, тогда – Stallion

+0

но, выталкивая заднюю часть, как я и сделал, не вызывает onBackPressed(). Кроме того, приложение уже находится в фоновом режиме на этом этапе, поэтому мне не нужно ничего предупреждать пользователя. Мне просто нужно, чтобы событие работало, пока я нахожусь в фоновом режиме. –

Смежные вопросы