2011-09-27 11 views
21

Me gustaría advertir al usuario si la presión de retroceso va a terminar la última actividad en la pila, saliendo de la aplicación. Me gustaría hacer un pequeño brindis y detectar una segunda presión hacia atrás en los próximos segundos y solo entonces llamar al finish().Android: ¿Cómo puedo detectar si el botón Atrás saldrá de la aplicación (es decir, esta es la última actividad que queda en la pila)?

Ya codifiqué la detección de la contrapresión usando onBackPressed(), pero no puedo encontrar una manera obvia de ver cuántas actividades quedan en la pila posterior.

Gracias.

Respuesta

20

El reddit es divertido aplicación hace esto by overriding the onKeyDown method:

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    //Handle the back button 
    if(keyCode == KeyEvent.KEYCODE_BACK && isTaskRoot()) { 
     //Ask the user if they want to quit 
     new AlertDialog.Builder(this) 
     .setIcon(android.R.drawable.ic_dialog_alert) 
     .setTitle(R.string.quit) 
     .setMessage(R.string.really_quit) 
     .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       //Stop the activity 
       finish();  
      } 
     }) 
     .setNegativeButton(R.string.no, null) 
     .show(); 

     return true; 
    } 
    else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+1

isTaskRoot() parece ser el método más limpio sin requerir permisos adicionales. Creo que este es el ganador. –

+0

¿Qué es mSettings aquí? – berserk

+0

@berserk mSettings es solo una referencia a la configuración de la aplicación que determina si queremos mostrar el diálogo de confirmación o no. no es crítico en este ejemplo. –

3

La biblioteca droid-fu hace esto al verificar la pila de tareas en ejecución y ver si la siguiente tarea es la pantalla de inicio de Android. Consulte handleApplicationClosing en https://github.com/kaeppler/droid-fu/blob/master/src/main/java/com/github/droidfu/activities/BetterActivityHelper.java.

Sin embargo, solo utilizaría este enfoque como último recurso, ya que es bastante hacky, no funcionará en todas las situaciones y requiere permisos adicionales para obtener la lista de tareas en ejecución.

+0

Ni idea de por qué eligieron para comprobar si hay un lanzador de Android explícita en lugar de por su propio paquete, pero esto me puso en el camino correcto. –

Cuestiones relacionadas