Erstens, ich glaube, das ist keine doppelte Frage, obwohl die Lösung für den Fehler wurde oft gefragt. Ich habe mindestens 5 verschiedene Lösungen versucht, aber sie ändern nichts oder verschlimmern die Situation. Ich möchte die Aktivität pausieren, wenn der Bildschirm gesperrt/der Fokus geändert wurde und der Benutzer die Aktivität wieder aktivieren kann, wenn die App erneut geöffnet wird.IllegalStateException beim Hinzufügen von Fragment in Reaktion auf eine Bildschirmsperre
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!hasFocus && pauseFragment == null) {
exercisePlayPause(isPaused, workoutExerciseNum);
isPaused = !isPaused;
}
}
exercisePlayPause ruft das folgende Verfahren
public void PassExerciseNum(int exerciseNum, Boolean isPaused) {
if (!isPaused) {
pauseFragment = new PauseFragment();
pauseFragment.getExNum(exerciseNum);
getFragmentManager().beginTransaction().add(R.id.aworkout_layout, pauseFragment, "pause").commit();
} else {
getFragmentManager().beginTransaction().remove(pauseFragment).commit();
pauseFragment = null;
exercisePlayPause(true, exerciseNum);
}
}
Dies funktioniert gut, wenn die Home-Taste gedrückt wird oder eine andere App aktiviert ist oder die Benachrichtigungsleiste geklickt wird. Aber wenn der Bildschirm gesperrt ist, dann bekomme ich folgende Fehler
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1411)
at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1429)
at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687)
at android.app.BackStackRecord.commit(BackStackRecord.java:663)
Die Codezeile getFragmentManager().beginTransaction().add(R.id.aworkout_layout
ist. Ich pausiere einige Prozesse, wenn ein Ereignis den Benutzer von der App wegbewegt. Und wenn der Benutzer zur App zurückkehrt, kann er von dort aus weitermachen. Daher zerstöre ich die Aktivität nicht. Ich habe versucht, commitAllowingStateLoss()
zu verwenden, aber das macht mich Daten für die pausierten Prozesse verlieren und wird ein bisschen chaotisch.
Kurz gesagt ist die Frage, wie man eine Fragmenttransaktion passieren lässt, bevor onSaveInstanceState ausgelöst wird, wenn die Bildschirmsperrtaste gedrückt wird?