2013-03-13 50 views
103

ho un'attività principale, che quando si fa clic su un pulsante, inizia una nuova attività, ho usato il seguente codice per farlo:Come chiudere l'attività e tornare alla precedente attività in Android

Intent intent = new Intent(this, SettingsActivity.class); 
startActivity(intent); 

Il codice precedente è stato eseguito dall'attività principale.

Ora nella mia nuova attività che viene chiamata dall'attività principale, ho un pulsante indietro. Quando faccio clic su questo pulsante, voglio che la mia nuova attività si chiuda e deve tornare all'attività principale originale.

Ho provato a chiamare super.finish() e solo finish() (dalla nuova attività), ma questo chiude la mia intera applicazione (compresa la mia attività principale).

Come è possibile chiudere l'attività attualmente messa a fuoco e quindi tornare all'attività principale?

CURA

Il fatto che il pulsante indietro del mio telefono cellulare si chiude anche tutta la mia app, mi porta a pensare che ho avviato la seconda attività in modo errato?


OK ho cercato,

ho creato un'attività Impostazioni che utilizza lo stesso codice manifesto e lo stesso codice per avviare l'attività.

Per le impostazioni Attività quando si preme il pulsante Indietro, si torna all'attività principale.

Con l'attività sopra menzionata nella domanda principale, esce semplicemente tutta la mia app.

Quindi il problema non sembra essere il codice per completare l'attività ma l'attività stessa.

+4

Non hai nemmeno bisogno di un pulsante indietro, basta che l'utente abbia utilizzato la chiave posteriore del telefono e non devi fare nulla. –

+0

Il pulsante indietro dei telefoni chiude l'applicazione di immissione, non solo la mia attività secondaria. Non voglio chiudere l'attività principale. – Zapnologica

+1

Il pulsante 'indietro' non dovrebbe farlo - puoi mostrare altro codice? – peejaybee

risposta

154

Penso che si sta chiamando finish() metodo in MainActivity prima di iniziare SettingsActivity.

Lo scenario che avete descritto si verificherà nei seguenti due modi:

SIA

È stato impostato android:noHistory = "true" per MainActivity all'interno AndroidManifest.xml che provoca automaticamente MainActivity a finish premendo il tasto indietro.

O

Prima di passare al 'SettingsActivity', che hai chiamato finish() nel vostro MainActivity, che uccide.Quando premi il pulsante Indietro, poiché nessun'altra attività è preimpostata nello stack per pop, torna alla schermata principale.

+0

Questo spiegherebbe il motivo per cui il pulsante "indietro" del telefono esclude anche l'attività principale. – peejaybee

+0

Durante il debug, ho notato che l'esecuzione continua dopo la fine(), quindi è consigliabile aggiungere un ritorno. – untill

+0

ho fatto un secolo, non c'è bisogno di ringraziare anche se @TGMCians –

1

Ma non chiamatela finish() sul MainActivity allora questo elimina la necessità di sovrascrivere il tuo onBackPressed() nel vostro SecondActivity meno che non si stanno facendo altre cose in quella funzione. Se si sente il "bisogno" di questo pulsante allora si può semplicemente chiamare finish() sulla SecondActivity e che vi porterà al vostro MainActivity finché non si è chiamato finish() su di esso

+0

Ho provato questo percorso, ma ho circa 10 schermi in sequenza che usano PNG ad alta risoluzione. Il problema è che, a proposito dello schermo 7, il dispositivo esce dai ricordi a causa di tutte le attività nel back-stack. Ho deciso di chiamare la fine di ogni attività, e questo ha risolto il problema consentendo la raccolta dei dati inutili, ma ora il comportamento sul retro ha bisogno di essere codificato manualmente perché il back-stack è ora vuoto. Hai incontrato questo problema o sei a conoscenza di meccanismi in Android per risolvere questo problema? –

+0

Cosa vuoi fare il pulsante Indietro? Torna a qualunque cosa fosse l'attività precedente o torna sempre al MainActivity? Inoltre, se stai esaurendo la memoria con 'Bitmaps', dovresti leggere [Questa parte di Documenti] (http://developer.android.com/training/displaying-bitmaps/load- bitmap.html). Mi ha aiutato a – codeMagic

+0

@ Lo-Tan se vuoi tornare all'attività precedente, quindi penso che devi capire la gestione della memoria per le tue immagini e non finire le attività (magari con il link che ho fornito).Altrimenti, dovrai ricreare una nuova istanza dell'attività e cercare di capire quale tornare a – codeMagic

4
Button edit = (Button) view.findViewById(R.id.yourButton); 
edit.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View view) { 
     Intent intent = new Intent(this, YourMainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 
}); 
4

Questo chiude l'intera applicazione:

this.finish(); 
+0

Questo chiude l'intera domanda come indicato nella domanda, non solo l'attività corrente, Come fa il pulsante indietro del telefono? – Zapnologica

+0

Come posso accedere all'attività precedente dall'attività della Fotocamera. – Chip

10

Quando si fa clic con il pulsante si può avere chiamare:

super.onBackPressed(); 
48

si può tornare all'attività precedente, semplicemente chiamando finitura() nell'attività ci si trova. Nota qualsiasi codice dopo l'esecuzione della chiamata finish() - puoi semplicemente eseguire un ritorno dopo aver chiamato finish() per risolvere il problema.

Se si desidera restituire i risultati all'attività uno poi quando si inizia l'attività due è necessario:

startActivityForResults(myIntent, MY_REQUEST_CODE); 

All'interno della vostra chiamata attività si può quindi ottenere l'Intent dal onCreate() parametro o utilizzati

getIntent(); 

per impostare restituire un risultato all'attività uno poi l'attività di due fare

setResult(Activity.RESULT_OK, MyIntentToReturn); 

Se non avete intenzione di tornare poi basta dire

setResult(Activity.RESULT_OK); 

Se l'attività ha cattivi risultati è possibile utilizzare Activity.RESULT_CANCELED (questo è usato per impostazione predefinita). Poi in attività di uno che fai

onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Handle the logic for the requestCode, resultCode and data returned... 
} 

Per terminare l'attività di due utilizzano gli stessi metodi con finitura() come descritto sopra con i risultati già impostati.

+1

"Nota qualsiasi codice dopo la chiamata finish() verrà eseguito - è possibile eseguire un ritorno dopo aver chiamato finish() per risolvere questo" Penso che "correzione" è una scelta sbagliata di parole qui. È più come se evitassi l'esecuzione delle seguenti righe (non risolvendo il problema). –

1

Non so se questo sia anche utile o meno, ma stavo lottando con lo stesso problema e ho trovato un modo abbastanza semplice, con solo una variabile booleana globale e un'azione onResume(). Nel mio caso, la mia attività C se si fa clic su un pulsante specifico dovrebbe attivare la fine() dell'attività B!

Activity_A -> Activity_B -> Activity_C

Activity_A (apre normalmente Activity_B)

Activity_B (su alcuni scatto del tasto apre Activity_C):

// Global: 
boolean its_detail = false; 
// ------- 
SharedPreferences prefs = getApplicationContext().getSharedPreferences("sharedpreferences", 0); 
boolean v = prefs.getBoolean("select_client", false); 

its_detail = v; 

startActivity(C); 

@Override 
public void onResume(){ 
    super.onResume(); 
    if(its_detail == true){ 
     finish(); 
    } 
} 

Così, ogni volta che si fa clic sul pulsante Attività C farebbe la funzione "onResume()" dell'attività B e tornerà all'Attività A.

4

provare questo codice, invece di finish:

onBackPressed();

+0

Funziona bene per tornare da ActivityB a ActivityA. Per frammenti e singole attività si potrebbe usare la risposta di @Osama Ibrahim. – Eftekhari

6

se si utilizza frammento u dovrebbe utilizzare

getActivity().onBackPressed(); 

se si utilizza l'attività singola u possibile utilizzare

finish(); 
0
{ getApplicationContext.finish(); } 

Prova questo metodo ..

+0

Anche se questo blocco di codice può rispondere alla domanda, sarebbe meglio se fosse possibile fornire una piccola spiegazione del motivo per cui lo fa. – David

0

potrebbe essere possibile che tu stia chiamando finish(); nell'evento del pulsante di selezione, quindi l'attività principale viene chiusa subito dopo aver fatto clic sul pulsante e quando si ritorna alla prossima attività, l'applicazione viene chiusa perché l'attività principale è già chiusa e non vi è attività attiva.

2

Credo che la tua seconda attività non sia probabilmente collegata alla tua attività principale come attività di un bambino. Controlla il tuo file AndroidManifest.xml e verifica se la voce <activity> per l'attività figlio include un attributo android:parentActivityName. Esso dovrebbe essere simile a questo:

<?xml ...?> 
... 
<activity 
    android:name=".MainActivity" 
    ...> 
</activity> 
<activity 
    android:name=".ChildActivity" 
    android:parentActivityName=".MainActivity" 
    ...> 
</activity> 
... 
1
@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == android.R.id.home) { 
      finish(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

Prova questo funziona sia su barra degli strumenti pulsante indietro come hardware tasto indietro.

+0

Questo ha funzionato per me. Avevo anche un ** MainActivity ** e un ** SettingsActivity ** con 'android: parentActivityName =". MainActivity "' per il secondo. Questo codice gestisce il pulsante ** Home/Indietro ** nella barra degli strumenti e termina l'attività corrente ritornando alla precedente nella pila. Grazie. – mortalis

0

Fine chiude l'intera applicazione, questa è una cosa che odio in fase di sviluppo Android non finire che è bene, ma che non tenere il passo arguzia sintassi ok hanno

startActivity(intent) 

Perché non

closeAttività (intent) ?

+1

Questo risponde alla domanda? O è solo un suggerimento da provare? In entrambi i casi, il rant non è necessario e probabilmente non è il benvenuto su SO –

Problemi correlati