Cómo restaurar la pila trasera de fragmentos en una actividad (después de que se cancela la aplicación en backgroud)

Mi pregunta es muy simple, supongo …

Pero no puedo encontrar una respuesta en cualquier lugar!

En una aplicación de Android,

Digamos que estoy en un activiy- MyActivity que contiene un fragmento a la vez.

Primero cargué el Fragmento A (Sin etiquetas lo agregué a la pila trasera del gestor de fragmentos)

Luego, en algún momento i cargado Fragmento B (Sin etiquetas que lo agregó a la pila de atrás del gestor de fragmentos)

Entonces en algún momento i cargado Fragmento C (Sin etiquetas que lo añadió a la pila de atrás de administrador de fragmentos)

Estoy usando popbackstack para habilitar el comportamiento de botón de nuevo Así que cuando alguna vez presiono de regreso de Fragmento C el flujo es como

Fragmento C-> Fragmento B-> Fragmento A -> Cerrar MyActivity ..

Todo perfecto 🙂

Pero si estoy en el fragmento C y la aplicación se muere en segundo plano (i no utiliza la bandera de actividad de los ajustes)

Y volver a estar en línea Fragmento C se carga en MyActivity

Pero los gestores de fragmentos detrás pila contiene sólo Fragmento C ..

El botón Atrás está estropeándolo

Fragmento C -> Cerrar MyActivity ..

¿Por que es esto entonces?

¿Cómo restaurar correctamente los gestores de fragmentos con una actividad en la pila?

Intente usar alwaysRetainTaskState en su actividad raíz. Android borra automáticamente la actividad Backstack porque asume que ha pasado mucho tiempo desde que usaste la aplicación y que el usuario quiere empezar de nuevo desde el principio.

<activity android:alwaysRetainTaskState="true"/> 

Esta configuración evitará que el comportamiento y puede seguir que el comportamiento es heredado por el Administrador de fragmentos.

Durante el desarrollo de su aplicación, le recomiendo que pruebe los estados de restauración / guardado de las actividades, fragmentos con ADB:

  1. Abre la app
  2. Navegar entre las actividades
  3. Inicio de prensa
  4. ADB -> Aplicación Kill (stop)
  5. Presione la pila de aplicaciones (botón de menú del dispositivo) y reanude la aplicación

De esta manera, puede depurar los estados guardados / restaurados.

Si no tiene una aplicación compleja, le sugiero que maneje el estado guardado / restaurado en la actividad:

 private Fragment1 mFragment; @Override protected void onCreate(Bundle savedState) { super.onCreate(savedState); // ... if (savedState == null) { mFragment = new Fragment1(); getFragmentManger().beginTransacation().add(mFragment, TAG).addToBackStack(TAG).commit(); } else { mFragment = getFragmentMananager().findFragmentByTag(TAG); } } 

Si tienes varios Fragments o un ViewPager o fragmentos anidados, entonces las cosas pueden ser muy complicadas. Le sugiero que reinicie toda la aplicación:

 @Override protected void onCreate(Bundle savedState) { super.onCreate(savedState); if (savedState != null) { Intent intent = new Intent(ActivityMain.this, ActivityMain.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); return; } } 

Si desea manejar cada estado guardado / restaurado, lea esta publicación: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

Prueba este método

 public void setRetainInstance (boolean retain) 

Controlar si una instancia de fragmento se conserva a lo largo de la recreación de actividad (por ejemplo, a partir de un cambio de configuración). Esto sólo puede usarse con fragmentos que no estén en la pila trasera. Si se establece, el ciclo de vida de los fragmentos será ligeramente diferente cuando se recrea una actividad:

Desde el sitio web del desarrollador http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29

El fragmento C nunca debe cargarse después de que su aplicación muera. ¿Tienes un fragmento Init en tu aplicación? Idealmente, cuando se está implementando un pop de fragmentos debe haber una pantalla Init. Si la aplicación muere o se destruye por razones de memoria, la aplicación debe comenzar desde el fragmento A (Fragmento de inicio). No del fragmento C.

Si su problema exige esta solución, entonces usted debe tener que guardar cada fragmento de forma persistente cuando un nuevo fragmento en la parte superior. Que idealmente significa que está persistiendo su backstack en una preferencia o una base de datos para lograr esto.

  • Llamada de findViewById en Fragment para encontrar un botón devuelve null
  • No se pueden retener fragmentos anidados
  • Fragmentos que desaparecen después de la aplicación no se ha utilizado durante pocas horas
  • IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState con ViewPager
  • AddToBackStack () no funcionó. Volver al inicio no fragmento anterior
  • No se puede realizar esta acción dentro de onLoadFinished
  • Creación de pestañas de barra de acción de un fragmento
  • Mide la vista en el fragmento
  • ¿Cómo escuchar los cambios de preferencia dentro de un archivo PreferenceFragment?
  • Android: Actividad de llamada del fragmento
  • Actividades o Fragmentos en NavigationView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.