In realtà, ci sono diversi problemi che sono disciplinati da questa domanda e alcune delle risposte ad esso:
Per rispondere alla tua domanda iniziale: "Sì, questo è il comportamento previsto".
Android considera ogni attività come un'entità autonoma separata. Android ricorda lo stato delle attività nello stack delle attività e non ha alcun problema ad uccidere il tuo processo (che contiene tutte le tue attività) ogni volta che lo desidera, perché "sa" che può sempre ricostruire le tue attività ogni volta che è necessario. Questo concetto, ovviamente, si interrompe quando si dispone di un'applicazione complessa in cui si hanno dipendenze tra le attività e/o si dispone di dati globali memorizzati in una classe Application
(o un posto statico/singleton simile).
Quando Android uccide il processo si ricorda l'attività più in alto nel compito e quando l'utente ritorna al compito che ricrea il processo e poi ricrea solo l'attività più in alto nel compito. Nel tuo caso, MainActivity
.
Per fare un esempio, se il vostro stack compito è simile al seguente:
StartActivity -> ActivityB -> ActivityC -> ActivityD
e il vostro compito va al fondo e Android uccide il processo, quando verranno ricreati l'utente torna l'attività soltanto ActivityD
. Una volta terminato lo ActivityD
, Android ricreerà quindi ActivityC
. Una volta terminato lo ActivityC
, Android ricreerà ActivityB
, ecc.In breve, lo stack completo è non ricreato quando l'utente riprende l'attività.
Non esiste una combinazione di impostazioni manifest o di Intent flags che ti consentano di ottenere il comportamento desiderato. Sarebbe bello se Android offrisse qualcosa del genere, ma al momento no.
È possibile determinare se il processo è stato riavviato utilizzando uno statico (classe) variabile booleana nella classe Application-derivato (o in qualsiasi altra classe). Questa variabile avrà sempre il valore false
quando il processo viene riavviato e sarà quindi possibile controllare lo stato della variabile da qualsiasi posizione e reinizializzare (ricaricare i dati) se necessario. Quindi imposta la variabile su true
. Rimarrà true
fino a quando il processo non viene ucciso e ricreato, anche se tutte le attività sono terminate. In questo modo è possibile inizializzare solo quando necessario.
È inoltre possibile utilizzare questo come indicatore per riavviare l'applicazione da SplashScreen
. Quindi, in tutte le vostre attività, in onCreate()
, è possibile verificare lo stato di questa variabile booleana e se l'applicazione è stata riavviata si può semplicemente reindirizzare al SplashScreen
in questo modo:
Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Questo si concluderà tutte le attività del attività e riavviare il SplashScreen
nella radice dell'attività.
successivo, se si vuole evitare di dover scaricare i dati ogni volta che l'utente torna l'applicazione (quando era in background e successivamente ucciso dai AndroidOS), è necessario memorizzare i dati che si scarica in l'area della cache privata e utilizzarla al riavvio dell'applicazione. Ciò impedisce di dover scaricare ripetutamente i dati se il processo viene ucciso e riavviato.
Un altro modo per risolvere questo problema è caricare i dati in un servizio. Se hai un Service
in esecuzione nel tuo processo, Android ha meno probabilità di uccidere il tuo processo. Devi solo assicurarti di spegnere il tuo Service
quando l'utente ha finito con la tua applicazione.
Mi rendo conto che questa risposta è prolissa. Spero che tu possa ottenere qualcosa da esso.
puoi impostare android: noHistory = "true" nel tag attività nel file manifest – rajpara
AFAIK, la tua domanda è errata, l'app forzata verrà sempre avviata dall'attività di avvio principale. – MKJParekh