2010-08-04 23 views
42

Ho 3 attività. Attività A che conduce all'attività B, che a sua volta può tornare all'attività A o avviare l'attività C. Tuttavia, se torno indietro nell'attività C l'app dovrebbe chiudersi.Termina attività principale e corrente in Android

Per riassumere:

  • Attività A inizia l'attività B
  • Premendo Torna sull'attività B dovrebbe portare ad un
  • Attività B inizia l'attività C
  • Premendo Torna sull'attività C dovrebbe chiudere l'app

Come dovrei passare dall'attività B alla C? Questo codice attualmente mi dà una NullPointerException sull'ultima riga:

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

Se posso passare le ultime due righe ho anche ottenere un puntatore nullo.

+13

Vorrei solo precisare che chiudere l'app dopo aver premuto il pulsante Indietro quando non si è nella prima pagina dell'app è davvero fastidioso. Non sono sicuro di quello che stai facendo, ma fai attenzione che gli utenti non si aspettino che il pulsante Indietro passi all'attività precedente – Falmarri

risposta

51

Non so se questo funzionerà, ma si potrebbe provare:

  • dall'attività A, avviare attività di B per un risultato utilizzando startActivityForResult()

  • In Attività B, quando la utente attiva attività C, avviare

startActivity() ritorna immediatamente l'attività C., così

  • impostare un risultato che informerà A per finire così,

  • chiamata finish() in B.

  • Quando A riceve quel risultato da B, A chiama finish() su se stessa come bene.

In mancanza di questo, si potrebbe fare attività C nella propria app e quindi chiudere la prima applicazione (con A & B) dopo l'avvio della seconda.

P.S. Prendi in considerazione il commento di Falmarri mentre vai avanti!
Buona fortuna.

+0

Ho fatto lo stesso e nessun effetto – Kostadin

0

Fare in modo che ogni attività ascolti un risultato dall'attività successiva e si concluda da sola se ciò si verifica.

È possibile utilizzare un codice di risultato speciale per indicare che si desidera terminare l'attività.

10

Si shou utilizzare onActivityResult metodo nella attività genitore

Supponiamo attività A è genitore di attività B. Se si vuole fare clic su Indietro pulsante Attività B per uscire Application (uscita anche l'attività A)

Nella tua attività B, in onStop() o onDestroy()

si chiama

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

questo passerà un codice risultato per la sua attività principale.

tuo genitore actvity A, in ascolto per il codice di risultato è necessario utilizzare il metodo onActivityResult all'interno del metodo è possibile chiamare

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

Funziona per me :)

1

Questo è perfettamente funzionante :

btn_back.setOnClickListener(new View.OnClickListener() 
{ 
public void onClick(View v) { 

Player.this.finish(); 
    } 
}); 
31

Se si desidera terminare un'attività genitore da un'attività bambino,

Nell'attività genitore, mentre innescando l'attività del bambino, utilizzare il seguente comando: -

startActivityForResult(intent_name,any_integer_variable); 

e l'override del metodo onActivityResult nel modo seguente: -

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

Ora, nel bambino attività, ignorare onStop e OnDestroy nel modo seguente: -

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

Si noti che ho impostato la valore a 2 nell'attività figlio e lo sto verificando nell'attività padre. Se il valore è lo stesso impostato, verrà completata anche l'attività principale. Quindi è possibile utilizzare approcci ricorsivi per ulteriori attività.

+2

Ho fatto esattamente lo stesso, ma non importa quale valore ho impostato nell'attività figlio usando 'setResult()', l'attività genitore riceve sempre '0'. – Kushal

+1

Ho scoperto che 'onActivityResult' viene chiamato prima di' onStop' e 'onDestroy', è necessario' setResult' prima. – BluGeni

+0

Come si può usare any_integer_variable? –

0

Si può solo ignorare il back key behavior:

Attività A inizia l'attività B
Premendo Ritornare attività B dovrebbe portare ad un
Attività B inizia l'attività C
Premendo Ritornare attività C dovrebbe chiudere il app

Nota che non chiamo super da onBackPressato. Ciò consente anche di sovrascrivere il meccanismo dello stack di ricerca per Android, che ritengo sia un grande vantaggio, poiché attualmente non sembra essere un modo per cancellare il singolo elemento più vecchio dallo stack Sfoglia in un modo semplice.

È possibile terminare in modo specifico l'attività padre anche se necessario, ma con questo metodo non ci si deve preoccupare.

3

Per avviare l'attività 'B' da attivita 'A' metodo startSubActivity utilizzare come segue:

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

Invece di 2 È possibile utilizzare qualsiasi cifra.

Implementare seguente metodo ai risultati dall'attività bambino cattura:

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

, ricordati di usare lo stesso numero il quale ti sei durante l'avvio dell'attività.

Ora nell'attività 'B' effettuare le seguenti operazioni: Per iniziare l'attività 'C'

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

implementare il metodo

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

Qui si stanno completando l'attività 'A' impostando risultato di 2 Quindi l'attività di finitura 'B' termina anche l'attività 'A'.

E mettere riga seguente nell'attività 'C':

   setResult(3); 

Non appena la vostra attività inizia 'C', le attività precedenti sono finiti.

Quindi il backup dall'attività 'C' chiude effettivamente l'applicazione.

3

Non ho fatto nulla di tutto questo. Questo è come vorrei rivedere il tuo codice.

il codice che si utilizza per entrare in un altro intento:

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

In questo modo, si esce sempre quando si preme di nuovo. Ma aspetta! È possibile modificare il modo in cui si desidera premere il tasto indietro per reagire quando viene premuto.

fare questo:

@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(); 
} 
2

provare questo

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

C'è qualche inconveniente nell'usare lo stesso ..? Per favore mi faccia sapere. – AndroidHacker

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

vostra attività C sarà l'attività principale e premere il tasto indietro finiranno le applicazioni.

1

Dalla schermata (B) che si desidera avviare lo screen (C) senza schermo posteriore, appena iniziare questa schermata (C) con:

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

L'indietro nel screenC sarà uscire dall'applicazione.

3

Nessuno di quelli ha funzionato per me. Quindi ho trovato una soluzione. L'aiuto indica chiaramente che Intent.FLAG_ACTIVITY_CLEAR_TASK deve essere utilizzato con Intent.FLAG_ACTIVITY_NEW_TASK. Quindi ecco un codice che ha funzionato per me.

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

dall'attività A, avviare attività di B per un risultato utilizzando startSubActivity (intento, 19)

In Attività B, quando l'utente attiva attività C, avviare l'attività C.

startActivity() restituisce immediatamente, in modo

impostare un risultato che informerà A per finire così,

finitura Call() in B. e Call setResult() metodo prima di finitura() metodo nell'attività figlio In Parent Activity, metodo overActivtyResult (....). Quando A riceve quel risultato da B, A chiama anche finish() su se stesso.

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); 
} 
2

se siete su attività A e ha iniziato un'altra attività denominata Attività B. Attività A -> Attività B

E ora vuole chiudere entrambe le attività.

quindi utilizzare il codice qui sotto in attività B.

B.this.finish(); 

e utilizzando questo codice in attività A:

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

Non appena l'attività B si concluderà, Attività A sarà anche finire.

C'è uno svantaggio, non so potrebbe essere si desidera questo o no.

L'inconveniente è che se l'utente è su Attività B e si preme il pulsante indietro per passare all'Attività A. Quindi, l'attività A termina anche in questo caso.

0

Il seguente codice dovrebbe farlo per voi. Quasi in tutti gli altri approcci, la tua app rimarrà nelle app recenti. Javadoc sono disponibili all'indirizzo, https://developer.android.com/reference/android/app/ActivityManager.AppTask.html#finishAndRemoveTask()

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

Si può usare finishAffinity(), si chiuderà attuali & tutti Attività Capogruppo delle attività in corso.

Nota: non verranno gestiti i risultati dall'attività figlio all'attività padre.

Sperare, aiuta !!

Problemi correlati