Comprendere la modalità di lancio dell’attività in Android
Condividere è curare!
La modalità di lancio dell’attività gioca un ruolo importante per mantenere il compito e lo stack posteriore. Prima di spiegare la modalità di lancio abbiamo bisogno di capire cos’è il task e il back stack?
Task
Un task è uno “stack di attività” nella tua applicazione. Se un’attività viene mandata in background (premendo il tasto HOME mentre la visualizzi, per esempio) allora anche l’intero task (e tutte le attività al suo interno) verranno rimandate indietro. Se poi l’utente clicca sulla vostra applicazione, il task (e l’ordine delle sue attività) viene mandato avanti. In altre parole, un task è un insieme di attività con cui gli utenti interagiscono quando eseguono un certo lavoro. Le attività sono disposte in una pila – la pila posteriore – nell’ordine in cui ogni attività viene aperta.
Quindi fondamentalmente quando un utente lancia un’applicazione dall’icona home, naviga attraverso diverse schermate quindi diverse attività poste una sopra l’altra. Questa collezione di attività è conosciuta come task.
Back Stack
Le attività sono disposte nell’ordine in cui ogni attività viene aperta. Questo stack mantenuto è chiamato Back Stack. Quando iniziate una nuova attività usando startActivity(), “spinge” una nuova attività sul vostro compito, e mette l’attività precedente nel back stack.
Una volta che premete il pulsante back allora “spunta” l’attività più in alto e la rimuove dal back stack e vi riporta all’attività precedente.
Modo di lancio
Un “modo di lancio” è il modo in cui una nuova istanza di una attività deve essere associata al compito corrente. Le modalità di lancio possono essere definite usando uno dei due meccanismi:
- Dichiarando nel file AndroidManifest.xml
- Aggiungendo il flag con Intent.
Ci sono quattro tipi di modalità di lancio di attività. Questi sono:
- standard
- singleTop
- singleTask
- SingleInstance
File manifest: Quando si dichiara un’attività in un file manifest, è possibile specificare come l’attività dovrebbe associarsi ai compiti quando si avvia.
Exp:
<activity android:launchMode = ../>
Intent Flag: Android fornisce anche flag di attività con cui è possibile modificare il comportamento predefinito di associazione dell’attività con i compiti mentre si avvia tramite il metodo startActivity(). Questi valori di flag possono essere passati attraverso dati extra Intent.
FLAG_ACTIVITY_NEW_TASK -> similar to "launchMode = singleTask"FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_SINGLE_TOP -> similar to "launchMode = singleTop"FLAG_ACTIVITY_CLEAR_TOP
standard
(default) : Questa è la modalità comune per la maggior parte delle attività.Più istanze della classe activity possono essere istanziate e più istanze possono essere aggiunte alla stessa attività o a diverse attività.
Esempio:
Supponiamo che tu abbia attività A, B, C, e D e la tua attività B ha “launch mode = standard”. Ora lanci di nuovo l’attività B –
Stato della pila di attività prima del lancio B
A -> B -> C -> D
Stato della pila di attività dopo il lancio B
A -> B -> C -> D -> B
singleTop
: La differenza rispetto allo standard è che se un’istanza dell’attività esiste già all’inizio dell’attività corrente e il sistema indirizza l’intento a questa attività, non verrà creata una nuova istanza perché si attiverà un metodoonNewIntent()
invece di creare un nuovo oggetto.
Esempio:
Caso 1:
Supponiamo che tu abbia le attività A, B e C e che l’attività D abbia “launch mode = singleTop”. Ora lanci l’attività D –
Stato della pila di attività prima del lancio D
A -> B -> C
Stato della pila di attività dopo il lancio dell’attività D
A -> B -> C -> D (Qui D lancia come al solito)
Caso 2:
Supponiamo che tu abbia le attività A, B, C, e D e la tua attività D ha “modalità di lancio = singleTop”. Ora lanci di nuovo l’attività D –
Stato della pila di attività prima del lancio D
A -> B -> C -> D
Stato della pila di attività dopo il lancio dell’attività D
A -> B -> C -> D (Qui la vecchia istanza viene chiamata e l’intento dei dati passa attraverso onNewIntent()
callback)
singleTask
: Una nuova attività sarà sempre creata e una nuova istanza sarà spinta nell’attività come radice. Tuttavia, se un’istanza di attività esiste in qualsiasi compito, il sistema instrada l’intento a quell’istanza di attività attraverso la chiamata al metodoonNewIntent()
. In questa modalità, le istanze di attività possono essere spinte allo stesso task. Questa modalità è utile per le attività che agiscono come punti di ingresso.
Esempio:
Caso 1:
Supponiamo che tu abbia attività A, B e C e che la tua attività D abbia “launch mode = singleTask”. Ora lanci l’attività D –
Stato della pila di attività prima del lancio D
A -> B -> C
Stato della pila di attività dopo il lancio dell’attività D
A -> B -> C -> D (Qui D si lancia come al solito)
Caso 2:
Supponiamo che tu abbia le attività A, B, C, e D e la tua attività B ha “launch mode = singleTask”. Ora lanci di nuovo l’attività B-
Stato della pila di attività prima del lancio D
A -> B -> C -> D
Stato della pila di attività dopo il lancio dell’attività B
A -> B (Qui la vecchia istanza viene chiamata e i dati dell’intento vengono indirizzati attraverso il callback onNewIntent())
Anche qui si nota che le attività C e D vengono distrutte.
singleInstance
: Uguale a,singleTask
tranne che l’istanza di nessuna attività può essere spinta nello stesso compito della singleInstance
. Di conseguenza, l’attività con modalità di lancio è sempre in un singolo compito di istanza di attività. Questa è una modalità molto specializzata e dovrebbe essere usata solo in applicazioni che sono implementate interamente come una sola attività.
Esempio:
Caso 1:
Supponiamo che tu abbia le attività A, B e C e la tua attività D ha “launch mode = singleInstance”. Ora si lancia l’attività D –
Stato della pila di attività prima del lancio D
A -> B -> C
Stato della pila di attività dopo il lancio D attività
Task1-A -> B -> C
Task2-D (qui D sarà in un’altra attività)
Ora se si continua così e si avviano E e D allora la pila sarà come-
Task1-A -> B -> C -> E
Task2-D
Caso 2:
Supponiamo che tu abbia le attività A, B, C in un compito e che l’attività D sia in un altro compito con “launch mode = singleInstance”. Ora lanci di nuovo l’attività D-
Stato della pila di attività prima del lancio D
Task1-A -> B -> C
Task2-D
Stato della pila di attività dopo il lancio dell’attività B
Task1-A -> B -> C
Task2-D (Qui la vecchia istanza viene chiamata e i dati sull’intento vengono trasmessi attraverso il callback onNewIntent())
FLAG_ACTIVITY_NEW_TASK
: Uguale al valoresingleTask
nel file Manifest (vedi sopra).
FLAG_ACTIVITY_SINGLE_TOP
: Uguale al valoresingleTop
nel file Manifest (vedi sopra).
FLAG_ACTIVITY_CLEAR_TOP
: Se l’attività che viene avviata è già in esecuzione nel task corrente, allora invece di lanciare una nuova istanza di quell’attività, tutte le altre attività sopra di essa vengono distrutte e questo intento viene consegnato all’istanza ripresa dell’attività (ora in cima), però.onNewIntent()
Non c’è un valore corrispondente nel file Manifest che produce questo comportamento. I riferimenti che ho usato per questo articolo sono qui e qui.
Si prega di sottoscrivere l’e-mail per ottenere tutte le newsletter di questo blog e se ritieni che questo post ti aiuterà a capire meglio allora non dimenticare di sottoscrivere, condividere e commentare qui sotto. Ok, allora ci vediamo nel mio prossimo tutorial fino ad allora goditi la tua vita e felice codifica 🙂
Sono uno sviluppatore Android molto entusiasta di costruire solide applicazioni Android. Ho un vivo interesse nello sviluppo per Android e ho pubblicato applicazioni sul Google Play Store. Sono sempre aperto a imparare nuove tecnologie. Per qualsiasi aiuto lascia una linea in qualsiasi momento a [email protected]