Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La navegación ActionBar up recrea la actividad principal en lugar de onResume

Estoy usando el enfoque recomendado para Up Navigation y mi código se ve así:

@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent h = new Intent(ShowDetailsActivity.this, MainActivity.class); h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(h); return true; default: return super.onOptionsItemSelected(item); } } 

Aquí está el caso de uso:

  1. Lance mi aplicación que es "MainActivity"
  2. Hago clic en un botón para ir a "ShowDetailsActivity"
  3. Hago clic en la barra de navegación ActionBar

El problema es después de que haga clic en UP, MainActivity vuelve a golpear sus métodos onCreate () y pierde todo el estado en lugar de comenzar en el típico onResume () como lo haría si acabara de llamar "finish ()" de ShowDetailsActivity. ¿Por qué? ¿Es así como siempre funciona y este es el comportamiento esperado para Android para recrear todas las actividades que se navegan a utilizar el enfoque de navegación "Arriba"? Si golpeo el botón de la parte posterior consigo el ciclo de vida onResume esperado.

Esta es mi solución si un Android "adecuado" no existe:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = new Intent(this, MainActivity.class); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { NavUtils.navigateUpTo(this, upIntent); finish(); } else { finish(); } return true; default: return super.onOptionsItemSelected(item); } } 

  • Actividad del asistente de actividad de pantalla completa. ¿Cómo dejo de mostrar la barra de acción cuando interactúo con el dispositivo?
  • Android: el margen entre el icono de ActionBar y el menú desplegable de Navegación cambia al hacer clic en Buscar
  • Android personalizado Overflow-menu (Sin barra de acción y sin menubutton)
  • Navegación Android para una Actividad con varios padres
  • Cambiar la barra de acción en color
  • Barra de Acción de Android Botón Arriba versus Sistema Botón Atrás
  • Título de barra de acción con más de una línea?
  • Capacidad de ActionBar / desbordamiento que no cambia en cambio de orientación
  • 6 Solutions collect form web for “La navegación ActionBar up recrea la actividad principal en lugar de onResume”

    Agregue lo siguiente a su actividad principal en el archivo de manifiesto

     android:launchMode="singleTop" 

    Respecto a esta respuesta

    La razón , las actividades se recrean cuando se utiliza la navegación hacia arriba es, que android utiliza el modo de lanzamiento estándar para esto, si no se especifica otro modo. Eso significa

    "El sistema siempre crea una nueva instancia de la actividad en la tarea de destino"

    Y así se recrea la actividad (véase doc. Aquí ).

    Una solución sería declarar el modo de inicio de MainActivity como

     android:launchMode="singleTop" 

    En el AndroidManifest.xml
    (Debe trabajar siempre junto con Intent.FLAG_ACTIVITY_CLEAR_TOP )

    O puedes añadir FLAG_ACTIVITY_SINGLE_TOP a tus banderas de intención, para decirle a la actividad que no se debe recrear, si está en la pila trasera, por ejemplo

     Intent h = NavUtils.getParentActivityIntent(this); h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); NavUtils.navigateUpTo(this, h); 

    Este código funcionó para mí:

     Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { // This activity is NOT part of this app's task, so create a new task // when navigating up, with a synthesized back stack. TaskStackBuilder.create(this) // Add all of this activity's parents to the back stack .addNextIntentWithParentStack(upIntent) // Navigate up to the closest parent .startActivities(); } else { // This activity is part of this app's task, so simply // navigate up to the logical parent activity. upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true; 

    No se requiere invocación finish ().

    Sólo tienes que volver atrás, no para crear la actividad de nuevo.

     @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: super.onBackPressed(); return true; } return super.onOptionsItemSelected(item); } 

    Lo que funciona para mí (y también creo que el más limpio) es reordenar la actividad de frente. Si no existe en la pila, se creará a medida que avanza.

     Intent upIntent = NavUtils.getParentActivityIntent(this); upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(upIntent); finish(); return true; 

    A partir de Android 4.1 (API nivel 16), puede declarar el padre lógico de cada actividad especificando el atributo android: parentActivityName en el elemento. Si su aplicación es compatible con Android 4.0 o inferior, incluya la Biblioteca de asistencia con su aplicación y agregue un elemento dentro de la aplicación. A continuación, especifique la actividad principal como el valor de android.support.PARENT_ACTIVITY, que coincida con el atributo android: parentActivityName.

     <application ... > ... <!-- The main/home activity (it has no parent activity) --> <activity android:name="com.example.myfirstapp.MainActivity" ...> ... </activity> <!-- A child of the main activity --> <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> 

    Si la actividad principal tiene el modo de inicio, o la intención ascendente contiene FLAG_ACTIVITY_CLEAR_TOP, la actividad principal se lleva a la parte superior de la pila y recibe la intención a través de su método onNewIntent ().

     <activity android:launchMode="singleTop" android:name="com.example.myfirstapp.MainActivity"> </activity> 

    En el código anterior "SingleTop", también se puede crear una nueva instancia de una actividad "singleTop" para manejar una nueva intención. Sin embargo, si la tarea de destino ya tiene una instancia existente de la actividad en la parte superior de su pila, esa instancia recibirá la nueva intención (en una llamada onNewIntent ()); No se crea una instancia nueva.

    Para la documentación del detalle haga clic aquí

    Para navegar hacia arriba cuando el usuario presiona el icono de la aplicación, puede utilizar el método estático de la clase NavUtils, navigateUpFromSameTask (). Para que lea la documentación dada en el enlace de arriba.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.