2010-05-10 10 views
16

Ho sentito dire che premere il pulsante Indietro causerà essenzialmente l'attività corrente a finish(). È sempre così? Sembra che sarebbe nel modo in cui apre l'attività in pila.La pressione di Indietro fa sempre terminare l'attività()?

L'unica situazione di cui non sono così sicuro è quando l'attività root in un'attività è stata premuta. Attualmente sto riscontrando un effetto molto strano, descritto come segue:

Durante il caricamento della mia applicazione, la prima attività è per l'inizializzazione e una volta terminata chiama la mia attività principale (una TabActivity). Questa prima attività di init ha Android: noHistory = "true" impostato nel manifest, quindi premere Indietro dalla mia attività principale non tornerà a quello. Va al Launcher. Quando faccio clic sulla mia app nel Launcher una seconda volta, l'attività di inizializzazione viene caricata di nuovo e carica l'attività principale al termine. Quasi subito dopo, carica una seconda istanza della mia attività principale. Ma SOLO dopo che l'Applicazione è già stata eseguita una volta, ed è stata chiusa premendo BACK dall'attività principale. Lo fa ogni volta successiva finché non esco dall'app o carica una nuova versione dall'IDE.

Sulla base di questo, sono sospettoso che qualche tipo di istanza di attività sia in giro e venga riutilizzata, poiché si verifica solo nel secondo momento in cui eseguo l'applicazione (ed esci con BACK - utilizzando HOME ritorna all'ultimo stato dell'app, nessun grosso problema). Qualcuno ha qualche pensiero ??

risposta

10

Ho sentito dire che premendo il pulsante Indietro essenzialmente l'attività corrente termina(). È sempre così?

No, non lo è. La maggior parte delle attività ha questo comportamento ma non tutto. Ad esempio, è possibile creare una finestra di dialogo e impostarla su setCancelable(false) e non si chiuderà se si fa clic sul pulsante INDIETRO.

Inoltre si potrebbe personalizzare il comportamento attività sul tasto BACK premuto sovrascrivendo onBackPressed

Chiamato quando l'attività ha rilevato stampa dell'utente del tasto indietro. L'implementazione predefinita termina semplicemente l'attività corrente, ma puoi ignorarla per fare ciò che vuoi.

Informazioni sul comportamento dell'applicazione .. Avete verificato se il programma di avvio attività è terminato dopo aver caricato l'attività principale? Voglio dire se viene chiamato il metodo onDestroy(). Forse dopo corre l'attività principale rimane lì e quando si fa clic di nuovo basta tornare al vecchio Launcher ...

speranza che questo aiuti ..

5

Leggere il Activity and Task design guidelines sul sito degli sviluppatori Android; spiegano come funzionano i pulsanti Home e Back. Ovviamente, se si sostituisce il comportamento predefinito (come menzionato da hara sopra), il pulsante Indietro non terminerà l'attività.

Per il problema specifico, controllare il logcat. Dovresti essere in grado di vedere se sta riportando in vita un vecchio processo o avviando uno nuovo. Se questo non è chiaro, inserisci un paio di istruzioni di registro su onCreate, onPause, onDestroyed, ecc., In modo che tu possa vedere esattamente cosa sta succedendo nel tuo processo.

+0

Grazie per il collegamento a tali linee guida. Sembra una buona lettura, non avevo ancora dato alcuna attenzione alla sezione "Best Practices". – stormin986

+0

Quindi, qualsiasi attività creata da zero per impostazione predefinita verrà terminata quando si preme il pulsante Indietro, a meno che non lo si sovrascriva? –

+0

In sostanza, sì. Sebbene dalla versione 4.0 di Android, ci sono così tanti modi in cui è possibile influenzare il comportamento del pulsante back che è diventato immensamente più complicato. Vedi http://developer.android.com/training/implementing-navigation/temporal.html –

1

Stai gestendo le tue attività con flag speciali, come singleInstance o singleTop? Quelli potrebbero causare le stranezze che stai vedendo. Il modo più semplice per rintracciare che cosa sta causando il tuo problema è riempirlo assolutamente con i messaggi di debug.Ad esempio:

  1. Nell'attività di inizializzazione, aggiungere un registro all'inizio di onCreate per ottenere il nome dell'attività come this.toString(). Maggiori informazioni sul perché vuoi questa linea in seguito.
  2. Quando viene avviata l'attività a schede principale, ottenere il nome dell'attività di avvio e un messaggio che indica che è stata avviata la scheda.
  3. Sovrascrivere i callback onPause(), onStop() e onDestroy() e aggiungere linee di debug con this.toString() e anche un messaggio che indica quale callback lo è.

Ciò che farà è dirvi se vi sono più istanze dell'attività di inizializzazione in giro. Per fare ciò confrontando il nome delle attività che chiamano la tua attività principale con quelle che sono state appena create e quelle che sono passate a onDestroy.

Se non si conosce il debug, utilizzare Log.d(LOG_TAG, "Your message here");. E quindi definire una stringa LOG_TAG costante da qualche parte. Successivamente, mostra la prospettiva LogCat in Eclispe andando su Window, mostra la prospettiva (o visualizza, non ricordo esattamente), altro, Android, LogCat. Lo scopo di avere una costante LOG_TAG è che puoi impostare LogCat per filtrare su quella stringa e mostrarti solo quei messaggi. Renderà più facile vederli tra la massa dei messaggi di log di sistema.

0

La risposta breve alla domanda originale è "no". Ciò è dovuto in gran parte al fatto che, sfortunatamente, non tutti gli sviluppatori seguono le linee guida citate nelle risposte precedenti.

Tuttavia le guide stesse menzionano eccezioni, quando il tasto Indietro non deve chiamare finish(). l'eccezione più importante è il browser Web, che ha il suo "back stack" per ogni finestra, quindi deve avere la sua gestione personalizzata del tasto Indietro.

+0

Mi piacciono le app in cui la pressione sul retro mostra un brindisi che dice "premi indietro ancora una volta per uscire". Allora so se sono davvero eccitante o no. – MatrixFrog

3

È possibile controllare BACK-BUTTON scrivendo il seguente codice.

public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //preventing default implementation previous to 
     //android.os.Build.VERSION_CODES.ECLAIR 
     return false; 
    }  
    return super.onKeyDown(keyCode, event);  
} 
0

Se non ci sono i frammenti sulla pila avanti e uno sviluppatore non ha ignorato onBackPressed, l'attività terminerà quando si preme il pulsante indietro.

Ecco il codice sorgente di Android 4.4.2 Activity.onBackPressed():

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 
0

solo Override onbackpressed() .. su stampa indietro questo metodo otterrà eseguirà rimuovere super e fare ciò che u want fare.

Problemi correlati