Förstå startläget för aktivitet i Android
Dela är att bry sig om!
Aktivitetens startläge spelar en viktig roll för att upprätthålla uppgiften och backstacken. Innan vi förklarar lanseringsläget måste vi först förstå vad som är en uppgift och en backstack?
Task
En uppgift är en ”aktivitetsstack” i din applikation. Om en aktivitet skickas till bakgrunden (t.ex. genom att du trycker på HOME-tangenten medan du tittar på den) skickas hela uppgiften (och alla aktiviteter i den) också tillbaka. Om användaren sedan klickar på ditt program kommer uppgiften (och ordningen på dess aktiviteter) fram. Med andra ord är en uppgift en samling aktiviteter som användarna interagerar med när de utför ett visst arbete. Aktiviteterna är ordnade i en stapel – back stack)- i den ordning som varje aktivitet öppnas.
Så i princip När en användare startar en app från hemikonen, navigerar den genom olika skärmar så olika aktiviteter placeras ovanpå varandra. Denna samling av aktiviteter kallas uppgifter.
Backstack
Aktiviteterna är ordnade i den ordning i vilken varje aktivitet öppnas. Denna bibehållna stapel kallas Back Stack. När du startar en ny aktivitet med hjälp av startActivity() ”skjuts” en ny aktivitet till din uppgift och den föregående aktiviteten placeras i bakstapeln.
När du trycker på bakåtknappen ”poppar” den översta aktiviteten och tar bort den från bakstapeln och tar dig tillbaka till den föregående aktiviteten.
Lanseringsläge
Ett ”lanseringsläge” är det sätt på vilket en ny instans av en aktivitet ska associeras med den aktuella uppgiften. Startlägen kan definieras med hjälp av en av två mekanismer:
- Deklaration i filen AndroidManifest.xml
- För att lägga till flaggan med Intent.
Det finns fyra typer av startlägen för en aktivitet. Dessa är:
- standard
- singleTop
- singleTask
- SingleInstance
Manifestfil: När du deklarerar en aktivitet i en manifestfil kan du ange hur aktiviteten ska associeras med uppgifter när den startar.
Exp:
<activity android:launchMode = ../>
Intent Flag: Android tillhandahåller också aktivitetsflaggor genom vilka du kan ändra standardbeteendet för aktivitetsassociering med uppgifter när du startar den via metoden startActivity(). Värdena för dessa flaggor kan överföras via intent extra data.
FLAG_ACTIVITY_NEW_TASK -> similar to "launchMode = singleTask"FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_SINGLE_TOP -> similar to "launchMode = singleTop"FLAG_ACTIVITY_CLEAR_TOP
standard
(standard) : Detta är det vanliga läget för de flesta aktiviteter.Flera instanser av aktivitetsklassen kan instansieras och flera instanser kan läggas till samma uppgift eller olika uppgifter.
Exempel:
Antag att du har aktiviteterna A, B, C och D och att din aktivitet B har ”startläge = standard”. Nu startar du återigen aktivitet B –
Aktivitetsstapelns status före start B
A -> B -> C -> D
Aktivitetsstapelns status efter start B
A -> B -> C -> D -> B
singleTop
: Skillnaden från standarden är att om det redan finns en instans av aktiviteten högst upp i den aktuella uppgiften och systemet dirigerar intentionen till denna aktivitet kommer ingen ny instans att skapas eftersom det kommer att utlösa en metodonNewIntent()
i stället för att skapa ett nytt objekt.
Exempel:
Fall 1:
Antag att du har aktiviteterna A, B och C och att din aktivitet D har ”launch mode = singleTop”. Nu startar du aktivitet D –
Aktivitetsstapelns status före start D
A -> B -> C
Aktivitetsstapelns status efter start D-aktivitet
A -> B -> C -> D (Här startar D som vanligt)
Fall 2:
Fall 2:
Förutsatt att du har A, B, C och D-aktiviteter och att din aktivitet D har ”launch mode = singleTop”. Nu startar du återigen aktivitet D –
Aktivitetsstackens status före start D
A -> B -> C -> D
Aktivitetsstackens status efter start D aktivitet
A -> B -> C -> D (Här anropas den gamla instansen och avsiktsdata leds genom onNewIntent()
callback)
singleTask
: En ny uppgift kommer alltid att skapas och en ny instans kommer att skickas till uppgiften som rot. Om någon aktivitetsinstans finns i någon uppgift, dirigerar systemet dock intendentdata till den aktivitetsinstansen via metodonNewIntent()
-anropet. I det här läget kan aktivitetsinstanser skickas till samma aktivitet. Det här läget är användbart för aktiviteter som fungerar som ingångspunkter.
Exempel:
Fall 1:
Antag att du har aktiviteterna A, B och C och att din aktivitet D har ”launch mode = singleTask”. Nu startar du aktivitet D –
Aktivitetsstapelns status före start D
A -> B -> C
Aktivitetsstapelns status efter start D-aktivitet
A -> B -> C -> D (Här startar D som vanligt)
Fall 2:
Fall 2:
Förutsatt att du har aktiviteterna A, B, C och D och att din aktivitet B har ”launch mode = singleTask”. Nu startar du återigen aktivitet B-
Aktivitetsstackens status före start D
A -> B -> C -> D
Aktivitetsstackens status efter start B-aktivitet
A -> B (Här anropas den gamla instansen och intent-data ruttas genom onNewIntent()-callback)
Märk också att aktiviteterna C och D förstörs här.
singleInstance
: Samma som singleTask
förutom att instansen för no activities kan skjutas in i samma uppgift som singleInstance
s. Följaktligen är aktiviteten med lanseringsläge alltid i en uppgift med en enda aktivitetsinstans. Detta är ett mycket specialiserat läge och bör endast användas i tillämpningar som implementeras helt och hållet som en aktivitet.
Exempel:
Fall 1:
Antag att du har aktiviteterna A, B och C och att din aktivitet D har ”launch mode = singleInstance”. Nu startar du aktivitet D –
Aktivitetsstapelns status före start D
A -> B -> C
Aktivitetsstapelns status efter start D activity
Task1-A -> B -> C
Task2-D (här kommer D att vara i en annan aktivitet)
Om du fortsätter på samma sätt och startar E och D kommer stapeln att se ut som-
Task1-A -> B -> C -> E
Task2-D
Fall 2:
Antag att du har aktiviteterna A, B och C i en uppgift och aktivitet D i en annan uppgift med ”launch mode = singleInstance”. Nu lanserar du återigen aktivitet D-
Aktivitetsstackens status före lansering D
Task1-A -> B -> C
Task2-D
Aktivitetsstackens status efter lansering B-aktivitet
Task1-A -> B -> C
Task2-D (Här anropas den gamla instansen och avsiktsdata skickas via onNewIntent()-callback)
FLAG_ACTIVITY_NEW_TASK
: Samma som värdetsingleTask
i manifestfilen (se ovan).
FLAG_ACTIVITY_SINGLE_TOP
: Samma som värdetsingleTop
i Manifestfilen (se ovan).
FLAG_ACTIVITY_CLEAR_TOP
: Om den aktivitet som startas redan körs i den aktuella uppgiften, förstörs alla andra aktiviteter ovanpå den i stället för att starta en ny instans av den aktiviteten, och den här intentionen levereras till den återupptagna instansen av aktiviteten (som nu är överst), dock.onNewIntent()
Det finns inget motsvarande värde i Manifestfilen som ger detta beteende. Jag använde referens för den här artikeln är här och här.
Påminn dig att prenumerera e-post för att få alla nyhetsbrev från den här bloggen och om du känner att det här inlägget kommer att hjälpa dig att bättre förstå så glöm inte att prenumerera, dela och kommentera nedan. Ok, då ses vi i min nästa handledning tills dess njut av ditt liv och glad kodning 🙂
Jag är en mycket entusiastisk Android-utvecklare för att bygga solida Android-appar. Jag har ett stort intresse för att utveckla för Android och har publicerat appar till Google Play Store. Jag är alltid öppen för att lära mig ny teknik. Om du vill ha hjälp kan du alltid skicka ett meddelande till [email protected]
.