Prima di API 11, mostravamo ogni nuova pagina sullo schermo. Ora con Fragments e gli strumenti di navigazione in API 28, è totalmente possibile fare un’app molto complessa con una sola attività. Tuttavia, le attività sono ancora ottime per sezionare la vostra app in fasi e processi. Forse vuoi dividere tutto il marketing in un’attività, e avere l’app vera e propria nella sua attività. Forse vuoi una sezione riservata a una caratteristica, come un servizio di chat. Conoscere le modalità di lancio delle attività ti aiuta a dividere meglio questi processi in modi che hanno senso per i tuoi utenti. Seduto al lavoro, non potrei mai ricordare le modalità di lancio così su due piedi, così ho pensato di scrivere un blog su questo, animare alcune gif per illustrare i concetti, e poi condividerlo con tutti. Enjoy!
Prima di parlare delle modalità di lancio, cerchiamo di capire il ruolo di un compito. Un task contiene un insieme di attività che sono disposte in uno stack chiamato backstack. La prima attività ad essere lanciata in un task è l’attività root. Premendo il pulsante indietro su un’attività root non solo si uccide l’attività, ma si uccide anche il task e forse l’app.
Ora immergiamoci in alcune modalità di lancio!
Diciamo che avete un task con un’attività root chiamata Attività A, e poi lanciate una nuova attività chiamata B, B viene spinta in cima allo stack. Ora diciamo che si lancia un’altra attività B dalla B appena creata, ora si avranno due istanze dell’attività B impilate l’una sull’altra. Se un utente preme il pulsante indietro, tornerà ad un’altra istanza dell’attività B. Questo potrebbe confondere molto l’utente. L’impilamento e la creazione di attività una sopra l’altra, non importa cosa, è chiamata modalità di lancio Standard. Se non c’è una modalità di lancio definita nell’XML dell’attività nel manifest, l’attività userà la modalità di lancio standard.
Ora che abbiamo visto come la modalità Standard può essere stridente per l’utente, possiamo ora capire la modalità di lancio Single Top. Questa modalità di lancio impedisce che diverse istanze delle stesse attività siano impilate l’una sull’altra. Diciamo che l’attività B è un Single Top. Possiamo definire le modalità di lancio nel manifesto in questo modo:
///AndroidManifest.xml
<application
...>
<activity android:name=".Activity_A">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <activity android:name=".Activity_B" android:launchMode="singleTop"/> <activity android:name=".Activity_C"/>
<activity android:name=".Activity_D"/>
</application>
Quindi ora se si lancia l’attività B dall’attività B, invece di creare una nuova istanza di B e impilarla sopra la vecchia B, l’intento viene passato nell’istanza corrente di B. L’unico modo per avere due istanze della stessa attività in un’attività è lanciare un’attività diversa da B, e poi creare B da quell’attività. Il concetto principale della modalità di lancio single top è che non puoi avere due istanze della stessa attività impilate l’una sull’altra.
Se non vuoi 2 istanze della stessa attività single top in un’attività mentre usi la modalità di lancio single top, puoi passare la costante FLAG_ACTIVITY_CLEAR_TOP nel tuo intento. Per illustrare cosa fa questo, diciamo che il vostro stack di attività è ABC (B è ancora single top). Se lanci B da C con FLAG_ACTIVITY_CLEAR_TOP, il tuo stack scenderà fino a B e l’intento verrà passato proprio a quell’istanza di B.
// code example for passing the constant flag in your intentIntent intent = new Intent(this, Activity_B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
La prossima modalità di lancio è chiamata Single Task. In questa modalità di lancio, dichiariamo che un’attività può appartenere a un solo compito in tutti i compiti dell’applicazione. Quindi, in modo simile al comportamento FLAG_ACTIVITY_CLEAR_TOP, se il tuo stack è ABC, e lanci B (un singolo task) da C, facciamo il pop fino a B, e passiamo l’intento a quell’istanza.
<activity android:name=".Activity_B" android:launchMode="singleTask"/>