¿Cómo puedo volver a una actividad de padres correctamente?

Tengo 2 actividades (A y B) en mi aplicación android y uso una intención de pasar de la actividad A a la actividad B. El uso de parent_activity está habilitado:

<activity android:name=".B" android:label="B" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> </activity> 

También utilizo un tema que proporciona un botón UP.

Así que después de llamar a la actividad BI puede usar el botón UP para volver a la actividad A. El problema es que la aplicación parece llamar a la función onCreate () de la actividad A de nuevo y este no es el comportamiento que necesito. Necesito que la actividad A se vea de la misma manera que antes de llamar a la actividad B.

¿Hay una manera de lograr esto?

Gracias por adelantado

EDITAR:

No escribí ningún código para iniciar la actividad B de la actividad A. Creo que es autogenerado por eclipse.

La clase B se parece a:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_b, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 

Declaró la actividad A con el launchMode estándar en el manifiesto de Android. Según la documentación , significa lo siguiente:

El sistema siempre crea una nueva instancia de la actividad en la tarea de destino y enruta la intención hacia ella.

Por lo tanto, el sistema se ve obligado a recrear la actividad A (es decir, llamando a onCreate ) incluso si la pila de tareas se gestiona correctamente.

Para solucionar este problema, debe cambiar el manifiesto, agregando el siguiente atributo a la declaración de actividad A:

 android:launchMode="singleTop" 

Nota: llamar a finish() (como se sugirió como solución antes) sólo funciona cuando esté completamente seguro de que la instancia de actividad B que está terminando vive encima de una instancia de actividad A. En flujos de trabajo más complejos (por ejemplo, Una notificación), tal vez no sea el caso y debe iniciar correctamente la actividad A desde B.

Respuesta actualizada: Diseño de navegación hacia arriba

Tienes que declarar qué actividad es el padre apropiado para cada actividad. Si lo hace, el sistema puede facilitar los patrones de navegación como Up porque el sistema puede determinar la actividad lógica de los padres desde el archivo de manifiesto.

Así que para eso tienes que declarar tu padre Actividad en la etiqueta Actividad con atributo

android:parentActivityName

Me gusta,

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

Con la actividad padre declarada de esta manera, puede navegar hasta el padre apropiado como a continuación,

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 

Por lo tanto, cuando se llama NavUtils.navigateUpFromSameTask(this); Este método, finaliza la actividad actual y comienza (o reanuda) la actividad de los padres apropiada. Si la actividad principal de destino está en la pila trasera de la tarea, se avanza según se define en FLAG_ACTIVITY_CLEAR_TOP .

Y para mostrar el botón setDisplayHomeAsUpEnabled(): tienes que declarar setDisplayHomeAsUpEnabled():

 @Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); } 

Respuesta Antigua: (Sin Navegación, Navegación por Defecto predeterminada)

Sucede solamente si usted está comenzando la actividad A otra vez de la actividad B.

Utilizar startActivity() .

En lugar de esto desde la Actividad A comienza la Actividad B usando startActivityForResult() y sobreescribe onActivtyResult() en la Actividad A.

Ahora en la Actividad B acaba de llamar al finish() en el botón Arriba. Así que ahora onActivityResult() a Actividad A onActivityResult() sin crear de Actividad A de nuevo ..

Tuve casi la misma configuración que conduce al mismo comportamiento no deseado. Para mí trabajó para agregar el siguiente atributo a la actividad A en el Manifest.xml de mi aplicación:

Android: launchMode = "singleTask"

Consulte http://www.peachpit.com/articles/article.aspx?p=1874864 para obtener explicaciones.

A pesar de una vieja pregunta, aquí está otra (imho la solución más limpia y mejor) como todas las respuestas anteriores no funcionó para mí, ya que deeplinked la actividad B de un Widget .

 public void navigateUp() { final Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) { Log.v(logTag, "Recreate back stack"); TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities(); } else { NavUtils.navigateUpTo(this, upIntent); } } 

[ https://stackoverflow.com/a/31350642/570168 ]

Pero también vea: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android

Una mejor manera de lograr esto es usando dos cosas: llamada:

 NavUtils.navigateUpFromSameTask(this); 

Ahora, para que esto funcione, necesitas que el archivo de manifiesto indique que la actividad A tiene una actividad padre B. La actividad padre no necesita nada. En la versión 4 o superior obtendrás una buena flecha hacia atrás sin ningún esfuerzo adicional (esto se puede hacer en las versiones inferiores, así con un pequeño código, lo pondré debajo) Puedes configurar estos datos en la ficha manifesto-> aplicación En la GUI (desplácese hasta el nombre de actividad principal y póngalo a mano)

Nodo de soporte:

Si desea dar soporte a la versión anterior a la versión 4, también debe incluir metadatos. Haga clic con el botón derecho en la actividad, añada-> metadatos, nombre = android.support.PARENT_ACTIVITY y valor = your.full.activity.name

Para obtener la flecha agradable en versiones inferiores también:

 getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

Tenga en cuenta que necesitará la versión 7 de la biblioteca de soporte para que todo funcione, pero vale la pena!

Tuve un problema similar al usar android 5.0 con un nombre de actividad padre mal

 <activity android:name=".DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName=".MainActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> 

Quité el com.example.myfirstapp del nombre de actividad principal y funcionó correctamente

Intenté android:launchMode="singleTask" , pero no ayudó. Trabajó para mí usando android:launchMode="singleInstance"

Añadiendo a la respuesta de @ LorenCK, cambie

 NavUtils.navigateUpFromSameTask(this); 

Al código siguiente si su actividad se puede iniciar desde otra actividad y esto puede convertirse en parte de la tarea iniciada por alguna otra aplicación

 Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); } else { NavUtils.navigateUpTo(this, upIntent); } 

Esto iniciará una nueva tarea e iniciará la Actividad principal de su Actividad que puede definir en Manifiesto como a continuación de la versión Min SDK <= 15

 <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> 

O usar parentActivityName si su> 15

Agregue a su información de manifiesto de actividad con el atributo

 android:launchMode="singleTask" 

Esta funcionando bien para mi

Lo que funcionó para mí fue agregar:

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

A TheRelevantActivity.java y ahora está funcionando como se esperaba

Y sí, no te olvides de añadir:

getSupportActionbar.setDisplayHomeAsUpEnabled(true); En el método onCreate()

prueba esto:

 Intent intent; @Override public void onCreate(Bundle savedInstanceState) { intent = getIntent(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_b, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpTo(this,intent); return true; } return super.onOptionsItemSelected(item); } 
  @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); 

Como una prensa trasera

Utilice finish() en actividad para volver cuando en su evento de clic.

Entrar en mi manifiesto y añadir android:launchMode="singleTop" a la actividad hizo el truco para mí.

Esto solucionó específicamente mi problema porque no quería que Android creara una nueva instancia de la actividad anterior después de pulsar el botón Up de la barra de herramientas. En cambio, quería usar la instancia existente de la actividad anterior cuando subí la jerarquía de navegación.

Referencia: android: launchMode

En clase Java: –

  toolbar = (Toolbar) findViewById(R.id.apptool_bar); setSupportActionBar(toolbar); getSupportActionBar().setTitle("Snapdeal"); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

En Manifiesto: –

 <activity android:name=".SubActivity" android:label="@string/title_activity_sub" android:theme="@style/AppTheme" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data> </activity> 

Esto te ayudará

  • Pasando el archivo con intención, ¿cómo lo recupero?
  • ¿Cómo llevar una actividad al primer plano (parte superior de la pila)?
  • Android devuelve el objeto como resultado de la actividad
  • Cualquier forma de saber si el dispositivo se ha iniciado desde un inicio rápido?
  • No se puede encontrar todos los dispositivos bluetooth android
  • Android: BroadcastReceiver intención de detectar la foto de la cámara tomada?
  • ¿Cómo obtengo la URL y el texto de selección desde el navegador de Android con la intención de compartir
  • Lista de filtros de intenciones para paquetes instalados
  • versión kitkat para reproducir un video en pantalla completa
  • Android ACTION_DATE_CHANGED difusión
  • Creación de paquete y envío a nueva actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.