Finalizar actividad principal y actual en Android

Tengo 3 actividades. La actividad A que lleva a la actividad B, que a su vez puede volver a la actividad A o iniciar la actividad C. Sin embargo, si presiono nuevamente en la actividad C, la aplicación debería cerrarse.

Para resumir:

  • La actividad A inicia la actividad B
  • Presionando Atrás en la actividad B debería llevar a A
  • La actividad B inicia la actividad C
  • Presionando Volver a la actividad C debería cerrar la aplicación

¿Cómo debería pasar de la actividad B a C? Este código actualmente me da una NullPointerException en la última línea:

Intent intent=new Intent(ActivityB.this, ActivityC.class); startActivity(intent); ActivityB.this.finish(); ActivityB.this.getParent().finish(); 

Si cambio las últimas dos líneas también obtengo un puntero nulo.

No sé si esto funcionará, pero podrías intentarlo:

  • De la Actividad A, inicie la actividad B para obtener un resultado usando startActivityForResult()

  • En la Actividad B, cuando el usuario activa la Actividad C, comienza la actividad C.

startActivity() regresa inmediatamente, por lo que

  • establecer un resultado que le informe a A que termine también,

  • finish() llamada finish() en B.

  • Cuando A recibe ese resultado de B, A también llama a finish() sobre sí mismo.

De lo contrario, podría convertir la Actividad C en su propia aplicación y luego cerrar la primera aplicación (con A y B) después de que comience la segunda.

PD ¡Tome en consideración el comentario de Falmarri a medida que avanza!
Buena suerte.

Si desea finalizar una actividad principal de una actividad secundaria,

En la actividad principal, mientras desencadena la actividad secundaria, use el siguiente comando:

 startActivityForResult(intent_name,any_integer_variable); 

y anula el método onActivityResult de la siguiente manera:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode==2){ finish(); } } 

Ahora, en la actividad secundaria, anule OnStop y onDestroy de la siguiente manera:

 protected void onStop() { setResult(2); super.onStop(); } @Override protected void onDestroy() { setResult(2); super.onDestroy(); } 

Observe que establecí el valor en 2 en la actividad secundaria y lo estoy verificando en la actividad principal. Si el valor es el mismo que he establecido, la actividad principal también finalizará. Entonces puede usar enfoques recursivos para otras actividades.

Debes usar el método de prueba de actividad en tu actividad principal

Supongamos que la actividad A es la actividad principal B. Si desea hacer clic en el botón Atrás en la actividad B para salir de la aplicación (también salir de la actividad A)

En su Actividad B, en onStop() o onDestroy()

llama

 setResult(0); //any int number is fine 

esto pasará un código de resultado a su actividad principal.

Tu padre Actvity A, escucha el código de resultado que necesitarás usar en el método de onActivityResult dentro del método al que puedes llamar

 if(resultCode == 0) //matches the result code passed from B { ActivityA.this.finish() } 

Esto funciona para mi 🙂

Para iniciar la actividad ‘B’ de la actividad ‘A’ use el método startActivityForResult de la siguiente manera:

  Intent intent2 = new Intent(A.this,B.class); startActivityForResult(intent2,2); 

En lugar de 2 puedes usar cualquier número.

Implementar el siguiente método para capturar el resultado de la actividad del niño:

  protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == 2) { finish(); } } 

Recuerda usar el mismo número que usaste al comenzar la actividad.

Ahora en la actividad ‘B’ haga lo siguiente: Para iniciar la actividad ‘C’

  Intent intent3 = new Intent(B.this,C.class); startActivityForResult(intent3,3); 

Implementar método

  protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == 3) { setResult(2); finish(); } } 

Aquí está terminando la actividad ‘A’ al establecer el resultado como 2. Así que terminar la actividad ‘B’ también finaliza la actividad ‘A’.

Y poner la siguiente línea en la actividad ‘C’:

  setResult(3); 

Tan pronto como comience su actividad ‘C’, sus actividades previas finalizarán.

Así que el respaldo de la actividad ‘C’ en realidad cierra la aplicación.

No hice nada de esto. Así es como revisaría tu código.

el código que usa para ingresar otro bash:

 Intent whatEverIntentName = new Intent("Path.to.next.Intent"); startActivity(whatEverIntentName); finish(); 

De esta manera, siempre sales cuando presionas hacia atrás. ¡Pero espera! Puede cambiar la forma en que desea que presione la tecla atrás para reactjsr cuando se presione.

Hacer esto:

 @Override public void onBackPressed() { super.onBackPressed(); Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it"); startActivity(whatEverIntentName); // Don't add finish here. //This is necessary because you finished your last activity with finish(); } 

Nada de eso funcionó para mí. Entonces descubrí una solución. La ayuda muestra claramente que Intent.FLAG_ACTIVITY_CLEAR_TASK se debe usar con Intent.FLAG_ACTIVITY_NEW_TASK. Así que aquí hay un código que funcionó para mí.

 Intent intent=new Intent(ActivityB.this, ActivityC.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

prueba esto

  Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

si está en la Actividad A y comenzó otra actividad llamada Actividad B. Actividad A -> Actividad B

Y ahora quiero cerrar ambas actividades.

luego usa el siguiente código en la Actividad B.

 B.this.finish(); 

Y usa este código en la Actividad A:

 startActivity(new Intent(A.this, B.class)); finish(); 

Tan pronto como termine la actividad B, la Actividad A también finalizará.

Hay una desventaja, no sé si puede querer esto o no.

El inconveniente es que si el usuario está en la Actividad B y él / ella presiona el botón Atrás para avanzar en la Actividad A. Luego, la Actividad A también finalizará en este caso.

Esto está funcionando perfectamente:

 btn_back.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Player.this.finish(); } }); 
 Intent intent=new Intent(ActivityB.this, ActivityC.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

su actividad C será la actividad raíz y al presionar volver finalizará las aplicaciones.

Desde la pantalla (B) que desea iniciar la pantalla (C) sin pantalla, simplemente inicie esta pantalla (C) con:

 screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(screenC); finish(); 

La parte posterior en screenC saldrá de la aplicación.

De la Actividad A, inicie la actividad B para obtener un resultado usando startActivityForResult (bash, 19)

En la Actividad B, cuando el usuario activa la Actividad C, comienza la actividad C.

startActivity () regresa inmediatamente, por lo que

establecer un resultado que le informe a A que termine también,

Llame a finish () en B. y llame al método setResult () antes del método finish () en su actividad secundaria en la actividad primaria sobre el método de prueba de actividad (….). Cuando A recibe ese resultado de B, A también llama a finish () sobre sí mismo.

 enter code here @Override protected void onActivityResult(int arg0, int arg1, Intent arg2) { //Added by Ashish to close parent activity if(arg1==19){ finish(); } super.onActivityResult(arg0, arg1, arg2); } 

Puede usar finishAffinity() , cerrará Current & all Parent Activities de Current Activity.

Nota: Pero no se manejarán los resultados de Actividad infantil a Actividad principal.

Espero eso ayude !!

Haga que cada actividad escuche el resultado de la siguiente actividad y termínese si eso ocurre.

Puede usar un código de resultado especial para indicar que desea que la actividad termine.

Puede anular el comportamiento de la tecla de retroceso :

La actividad A inicia la actividad B
Presionando Atrás en la actividad B debería llevar a A
La actividad B inicia la actividad C
Presionando Volver a la actividad C debería cerrar la aplicación

Tenga en cuenta que no llamo super desde onBackPressed. Esto también le permite anular el mecanismo de exploración de stack para Android, que me parece una gran ventaja, ya que actualmente no parece haber una manera de borrar el elemento más antiguo de la stack de exploración de una manera sencilla.

 public class B extends Activity { ... @Override public void onBackPressed() { // Start activity A Intent aIntent = new Intent(this, A); startActivity(bIntent); } ... } public class C extends Activity { ... @Override public void onBackPressed() { // Close finish(); } ... } 

También puede finalizar específicamente la actividad principal si es necesario, pero al usar este método, no tiene que preocuparse por ello.

El siguiente código debería hacerlo por ti. Casi en todos los otros enfoques su aplicación permanecerá en aplicaciones recientes. Javadoc se puede encontrar en https://developer.android.com/reference/android/app/ActivityManager.AppTask.html#finishAndRemoveTask ()

  ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); if(am != null) { List tasks = am.getAppTasks(); if (tasks != null) { tasks.get(0).finishAndRemoveTask(); } }