2011-09-27 7 views
21

Vorrei avvisare l'utente se la stampa posteriore sta per finire l'ultima attività in pila, uscendo così dall'app. Vorrei alzare un po 'di pane tostato e rilevare una seconda stampa posteriore entro pochi secondi e solo dopo chiamare lo finish().Android: come posso rilevare se il pulsante Indietro uscirà dall'app (cioè questa è l'ultima attività rimasta nello stack)?

Ho già codificato il rilevamento della retroilluminazione utilizzando onBackPressed(), ma non riesco a trovare un modo ovvio per vedere quante attività sono rimaste nello stack posteriore.

Grazie.

risposta

20

Il reddit è divertente app fa questo 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() sembra il metodo più pulito senza richiedere autorizzazioni aggiuntive. Penso che questo sia il vincitore. –

+0

Che cosa sono mSettings qui? – berserk

+0

@berserk mSettings è solo un riferimento alle impostazioni dell'applicazione che determina se vogliamo visualizzare o meno la finestra di conferma. non è fondamentale in questo esempio. –

3

La libreria droid-fu esegue questa operazione controllando lo stack delle attività in esecuzione e verificando se l'attività successiva è la schermata iniziale di Android. Vedi handleApplicationClosing allo https://github.com/kaeppler/droid-fu/blob/master/src/main/java/com/github/droidfu/activities/BetterActivityHelper.java.

Tuttavia, utilizzerei questo approccio solo come ultima risorsa poiché è piuttosto hacky, non funzionerà in tutte le situazioni e richiede autorizzazioni aggiuntive per ottenere l'elenco delle attività in esecuzione.

+0

Nessuna idea perché hanno scelto di verificare la presenza di un launcher Android esplicita, piuttosto che per il proprio pacchetto, ma questo mi ha messo sulla strada giusta. –

Problemi correlati