2014-12-08 10 views
5

Vorrei chiudere la mia app e cancellarla dall'elenco delle attività recenti.finishAndRemoveTask() disponibile sull'API 21

finishAndRemoveTask() è disponibile solo su API 21.

Cosa devo usare su API inferiore a 21 ??

+0

Non penso che ci sia un modo così semplice per farlo a livelli API inferiori, ma ... perché qualcuno dovrebbe volerlo fare? – thelawnmowerman

+0

Voglio impedire all'utente di riaprire l'app dall'attività recente .. – user3253955

+0

Se hai appena finito tutte le attività, l'app è ancora visualizzata nell'elenco delle attività recenti? Hai provato a finire tutte le tue attività con un intento con le bandiere? – thelawnmowerman

risposta

3

Fai intento alla prima attività nella pila e finire l'attività corrente:

Intent intent = new Intent(this, FirstActivity.class); 
intent.putExtra(EXTRA_FINISH, true); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
startActivity(intent); 
finish(); 

E, nel metodo della FirstActivityonResume, qualcosa di simile per finire l'ultima attività nello stack (e spero di rimuovere l'app dall'elenco delle app recenti):

if (getExtras() != null && getIntentExtra(EXTRA_FINISH, false)) { 
    finish(); 
} 
+0

Funzionerebbe in un caso d'uso molto specifico in cui 'FirstActivity' è l'unica attività nello stack ed è l'unica istanza di tale attività in quella attività e non rimuoverà l'attività dalle attività recenti. In altre parole, non ha un effetto simile a 'finishAndRemoveTask' –

+0

Sono d'accordo, è un caso d'uso molto specifico, ma per fortuna è anche il più comune. Esistono molte più semplici app con una sola attività di avvio/menu rispetto a flussi più complessi. Correzione: questo ha un effetto * simile * come 'finishAndRemoveTask', non lo * stesso *, ovviamente (e, come puoi vedere, non sono stati fatti altri suggerimenti, quindi è il migliore che abbiamo per ora). Il resto della tua analisi è errato: molte attività possono essere in pila e anche molte loro istanze, grazie al flag FLAG_ACTIVITY_CLEAR_TOP. Comunque e la cosa più importante: questa è solo una soluzione alternativa per i dispositivi legacy. – thelawnmowerman

+0

non finisce semplicemente di chiudere l'attività corrente. in questo caso Prima attività. –

0

Ho avuto un caso di utilizzo simile in cui avevo bisogno di terminare tutte le attività. Ecco un modo per farlo senza finishAndRemoveTask().

Fai tutte le vostre attività si estendono una classe base con le seguenti cose in esso:

private Boolean mHasParent = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = getIntent(); 
    Bundle extras = intent.getExtras(); 
    if (extras != null) { 
     mHasParent = extras.getBoolean("hasParent", false); 
    } 
} 

// Always start next activity by calling this. 
protected void startNextActivity(Intent intent) { 
    intent.putExtra("hasParent", true); 
    startActivityForResult(intent, 199); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if (requestCode == 199 && resultCode == FINISH_ALL) { 
     finishAllActivities(); 
    } 
} 

protected void finishAllActivities() { 
    if (mHasParent) { 
     // Return to parent activity. 
     setResult(FINISH_ALL); 
    } else { 
     // This is the only activity remaining on the stack. 
     // If you need to actually return some result, do it here. 
     Intent resultValue = new Intent(); 
     resultValue.putExtra(...); 
     setResult(RESULT_OK, resultValue); 
    } 

    finish(); 
} 

Chiamate finishAllActivities() in qualsiasi attività, e tutte le attività saranno rilassarsi. Ovviamente se non ti interessa quale risultato ritorna l'ultima attività, il codice può essere reso molto più semplice.

Problemi correlati