The Android Launch Mode Animated CheatSheet

Dec 20, 2018 – 6 min read

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"/>

Ma se vogliamo che B sia in un suo task? È qui che entra in gioco l’affinità di compito. L’affinità dei compiti permette di definire a quale compito un’attività appartiene. Per impostazione predefinita, un’attività ha la stessa affinità di compito della sua attività principale. Con l’affinità di compito, possiamo ora separare le attività in compiti diversi.

<activity android:name=".Activity_A"
android:taskAffinity="com.affinity.of.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="singleTask"
android:taskAffinity="com.affinity.of.b"
/>

Qui l’attività A e l’attività B hanno affinità di compito diverse. Quando A viene creato nel Task 1, C viene lanciato da A. Per impostazione predefinita, ogni attività ha la stessa affinità della sua radice, quindi siamo ancora nel Task 1. Ora B viene lanciato da C. B ha una diversa affinità di compito, quindi ora è la radice del Task 2, che quindi si sposta in primo piano. Se lanciamo una nuova istanza dell’attività C da B, C appartiene al Task 2 perché questa è l’affinità di compito dell’attività radice (in questo caso, B). Ma cosa succede se ora proviamo a lanciare A da C nel Task 2? Poiché l’affinità di A è il Task 1, ci spostiamo dal Task 2 al Task 1, torniamo indietro all’attività A e infine passiamo l’intento ad A.

Conoscere il Single Task ci aiuterà a capire meglio la modalità di lancio finale; Single Instance. Come Single Task, un’attività con Single Instance può essere l’unica attività tra tutte le attività. La differenza tra i due è che un’attività con Single Instance può anche essere l’unica attività in un compito.

<activity android:name=".Activity_B"
android:launchMode="singleInstance"
android:taskAffinity="com.affinity.of.b"
/>

In questo esempio, l’attività B avrà una modalità di lancio di Single Instance. L’attività A nel compito 1 lancia l’attività B. Questo fa lanciare l’attività B in un nuovo compito, che viene poi messo in primo piano. L’attività B lancia quindi l’attività C. Poiché una Single Instance può essere l’unica attività in un’attività, C viene lanciata sopra l’attività A nell’attività 1, e quindi l’attività 1 viene messa in primo piano.

L’affinità tra attività gioca anche un ruolo nella Single Instance. Se l’attività B non ha affinità di compito, un utente non può navigare indietro al compito 1. Se B ha l’affinità di compito, un utente sarà in grado di andare avanti e indietro tra il compito 1 e 2.

Conoscere le modalità di lancio mi aiuta a fare esperienze UI/UX migliori per i miei utenti, e mi aiuta anche a risolvere alcuni bug da grattacapo, quindi spero che queste informazioni aiutino anche te!

Voglio dare un shoutout alla pagina youtube di CodeTutor di Anil Deshpande per avermi aiutato a capire meglio il concetto. Ecco il primo di sette video su questo argomento: https://www.youtube.com/watch?v=m8sf0UkJkxo

Lascia un commento