He leído varias publicaciones sobre el uso de esto, pero debe faltar algo ya que no me funciona. Mi actividad A tiene launchmode = "singleTop" en el manifiesto. Inicia la actividad B, con launchmode = "singleInstance". La actividad B abre un navegador y recibe una intención de regreso, por lo que es singleInstance. Estoy tratando de anular el botón Atrás para que el usuario vuelva a la actividad A y luego pueda presionar Atrás para dejar la actividad, en lugar de volver a la actividad B nuevamente.
// activity B
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) onBackPressed();
return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
startActivity(new Intent(this, UI.class)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
return;
}
Después de regresar del navegador, la pila es ... A, B, Browser, B
Espero que este código cambie la pila a ... A ... para que al presionar atrás una vez más, el usuario regrese a la pantalla de inicio.
En cambio, parece cambiar la pila a ... A, B, Navegador, B, A ... como si esas banderas no estuvieran allí.
Intenté llamar a finish () en la actividad B después de startActivity, ¡pero luego el botón de retroceso me lleva de nuevo al navegador!
¿Qué me estoy perdiendo? ¡Gracias!
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
haré precisamente eso.Comencé la Actividad A-> B-> C-> D. Cuando se presiona el botón Atrás en la Actividad DI, quiero ir a la Actividad A. Dado que A es mi punto de partida y, por lo tanto, ya están en la pila, todas las actividades en la parte superior de A se borran y no puede volver a ninguna otra Actividad de A .
Esto realmente funciona en mi código:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Intent a = new Intent(this,A.class); a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(a); return true; } return super.onKeyDown(keyCode, event); }
fuente
Para esto, uso la
FLAG_ACTIVITY_CLEAR_TOP
bandera para comenzarIntent
(sin
FLAG_ACTIVITY_NEW_TASK
)y
launchMode = "singleTask"
en manifiesto para la actividad iniciada.Parece que funciona como necesito: la actividad no se reinicia y todas las demás actividades están cerradas.
fuente
Aunque esta pregunta ya tiene suficientes respuestas, pensé que alguien querría saber por qué esta bandera funciona de esta manera peculiar. Esto es lo que encontré en la documentación de Android.
Entonces, O bien,
1 . Cambie el
launchMode
de la Actividad A por algo diferente del estándar (es decir,singleTask
o algo). Entonces su banderaFLAG_ACTIVITY_CLEAR_TOP
no reiniciará su Actividad A.o,
2 . Úselo
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP
como su bandera. Entonces funcionará de la manera que desee.fuente
Utilizo tres banderas para resolver el problema:
fuente
Agregue android: noHistory = "true" en el archivo de manifiesto.
<manifest > <activity android:name="UI" android:noHistory="true"/> </manifest>
fuente
Llamé
activity_name.this.finish()
después de comenzar una nueva intención y funcionó para mí.I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"
Pero no funcionará para mí ... No estoy sugiriendo esta solución para su uso, pero si la configuración de la bandera no funciona para usted, puede probar esto ... pero aún así recomiendo no usarlo
fuente
Sé que ya hay una respuesta aceptada, pero no veo cómo funciona para el OP porque no creo que FLAG_ACTIVITY_CLEAR_TOP sea significativo en su caso particular. Esa bandera es relevante solo con actividades en la misma tarea . Según su descripción, cada actividad tiene su propia tarea. : A, B y el navegador.
Algo que quizás lo desconcierta es que A es singleTop, cuando debería ser singleTask. Si A es singleTop, y B inicia A, entonces se creará una nueva A porque A no está en la tarea de B. De la documentación de singleTop:
"Si ya existe una instancia de la actividad en la parte superior de la tarea actual , el sistema enruta la intención a esa instancia ..."
Dado que B inicia A, la tarea actual es la tarea de B, que es para una sola instancia y, por lo tanto, no puede incluir A. Use singleTask para lograr el resultado deseado allí porque entonces el sistema encontrará la tarea que tiene A y traerá esa tarea al primer plano.
Por último, después de que B haya iniciado A, y el usuario presione hacia atrás desde A, el OP no quiere ver ni B ni el navegador. Para lograr esto, llamar a finish () en B es correcto; nuevamente, FLAG_ACTIVITY_CLEAR_TOP no eliminará las otras actividades en la tarea de A porque sus otras actividades están todas en tareas diferentes. Sin embargo, la pieza que le faltaba es que B también debería usar FLAG_ACTIVITY_NO_HISTORY al disparar la intención para el navegador. Nota: si el navegador ya se está ejecutando incluso antes de iniciar la aplicación del OP, entonces, por supuesto, verá el navegador al presionar hacia atrás desde A. Entonces, para probar esto realmente, asegúrese de salir del navegador antes de iniciar la aplicación.
fuente
FLAG_ACTIVITY_NEW_TASK es el problema aquí que inicia una nueva tarea. Simplemente elimínelo y listo.
Bueno, te recomiendo que leas lo que hacen todas las banderas antes de trabajar con ellas.
Lea esto y las banderas de intención aquí
fuente
Intent.FLAG_ACTIVITY_SINGLE_TOP
para evitar la recreaciónInicialmente, también tuve problemas para que FLAG_ACTIVITY_CLEAR_TOP funcionara. Eventualmente lo hice funcionar usando su valor (0x04000000). Parece que hay un problema de Eclipse / compilador. Pero, lamentablemente, se reinicia la actividad superviviente, que no es lo que quiero. Parece que no hay una solución fácil.
fuente