Voglio sapere se l'utente tornerà alla schermata iniziale se esce dall'attività corrente.
Voglio sapere se l'utente tornerà alla schermata iniziale se esce dall'attività corrente.
Risposte:
AGGIORNAMENTO (luglio 2015):
Dal momento che getRunningTasks () ottenere deprecato, da API 21 è meglio seguire raukodraug risposta o Ed Burnette uno (io preferirei secondo).
C'è la possibilità di controllare le attività correnti e il loro stack utilizzando ActivityManager .
Quindi, per determinare se un'attività è l'ultima:
Usa il codice seguente:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
Tieni presente che il codice sopra sarà valido solo se hai una singola attività. Se esiste la possibilità che esista un numero di attività per la tua applicazione, dovrai controllare altri elementi taskList . Ulteriori informazioni sulle attività Tasks e Back Stack
isTaskRoot()
metodo.
Pubblicherò il commento di @ H9kDroid come la migliore risposta qui per le persone che hanno una domanda simile.
È possibile utilizzare isTaskRoot () per sapere se l'attività è la radice di un'attività.
Spero che aiuti
if (isTaskRoot()) { // do something }
Spero che questo aiuterà i nuovi principianti, Sulla base delle risposte sopra che funzionano bene per me, sto anche condividendo lo snippet di codice in modo che sia facile da implementare.
soluzione: ho usato isTaskRoot()
che restituisce vero se l'attività corrente è solo attività nel tuo stack e oltre a gestire anche il caso in cui se ho qualche attività in pila vai all'ultima attività in pila invece di aprirne una nuova personalizzata.
Nella tua attività
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
c'è una soluzione più semplice a questo, puoi usare isTaskRoot () nella tua attività
Anche se potrebbe esserci un modo per raggiungere questo obiettivo (vedi altre risposte), suggerirei di non farlo. Le normali applicazioni Android non dovrebbero aver bisogno di sapere se la schermata Home sta per essere visualizzata o meno.
Se stai cercando di salvare i dati, inserisci il codice di salvataggio dei dati nel tuo metodo onPause (). Se stai cercando di dare all'utente un modo per cambiare idea sull'esistenza dell'applicazione, potresti intercettare il tasto su / giù per il tasto Indietro e il metodo onBackPressed () e presentargli un "Sei sicuro?" richiesta.
Un modo per tenerne traccia è includere un marker quando inizi una nuova attività e controllare se il marker esiste.
Ogni volta che inizi una nuova attività, inserisci il marker:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
E puoi quindi verificarlo in questo modo:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Il problema con la soluzione di sandrstar usando ActivityManager
è: hai bisogno di un'autorizzazione per ottenere le attività in questo modo. Ho trovato un modo migliore:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
La Activity
parte inferiore dello Stack dovrebbe sempre ottenere questa categoria per impostazione predefinita, mentre le altre attività non dovrebbero ottenerla.
Ma anche se questo non riesce su alcuni dispositivi, puoi impostarlo all'avvio di Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Ho creato una classe base per tutte le mie attività, estendendo l' AppCompatActivity e che ha un contatore statico:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
Finora ha funzionato abbastanza bene; e indipendentemente dalla versione dell'API. Ovviamente richiede che tutte le attività estendano questa classe base, cosa che fanno, nel mio caso.
Modifica: ho notato un'istanza in cui il contatore scende a zero prima che l'app esca completamente, ovvero quando l'orientamento viene modificato e solo un'attività è aperta. Quando l'orientamento cambia, l'attività viene chiusa e ne viene creata un'altra, quindi onDestroyed
viene chiamata per l'ultima attività, quindi onCreate
viene richiamata quando la stessa attività viene creata con l'orientamento modificato. Questo comportamento deve essere tenuto in considerazione; È possibile utilizzare OrientationEventListener .
Android implementa uno stack di attività, ti consiglio di leggerlo qui . Sembra che tutto quello che vogliamo fare è però recuperare l'attività di chiamata: getCallingActivity()
. Se l'attività corrente è la prima attività nell'applicazione e l'applicazione è stata avviata dalla schermata principale, dovrebbe (presumo) tornare null
.
L'unica cosa che mancava qui è il clic sul "tasto Home", quando attivato, non puoi rilevarlo dalla tua attività, quindi sarebbe meglio controllare lo stack delle attività a livello di programmazione con la gestione della pressione del "tasto Indietro" e passare all'attività richiesta o solo facendo i passaggi necessari.
Inoltre, non puoi essere sicuro che l'avvio della tua attività dall'elenco "Attività recenti" possa essere rilevato preimpostando alcuni dati aggiuntivi nell'intento di apertura dell'attività, poiché in tal caso vengono riutilizzati.