Înțelegerea modului de lansare a activității în Android
Sharing is caring!
Modul de lansare a activității joacă un rol important în menținerea stivei de sarcini și a stivei din spate. Înainte de a explica modul de lansare, trebuie să înțelegem mai întâi ce este task-ul și back stack-ul?
Task
Un task este un „stack de activități” în aplicația dumneavoastră. Dacă o activitate este trimisă în fundal (prin apăsarea tastei HOME în timp ce o vizualizați, de exemplu), atunci întreaga sarcină (și toate activitățile din interiorul ei) va fi trimisă și ea înapoi. Dacă utilizatorul face apoi clic pe aplicația dvs., sarcina (și ordinea activităților sale) revine în față. Cu alte cuvinte, O sarcină este o colecție de activități cu care interacționează utilizatorii atunci când efectuează o anumită activitate. Activitățile sunt aranjate într-o stivă – stiva din spate) – în ordinea în care fiecare activitate este deschisă.
În principiu, atunci când un utilizator lansează o aplicație de la pictograma de acasă, acesta navighează prin diferite ecrane, astfel încât diferite activități plasate una peste alta. Această colecție de activități este cunoscută sub numele de sarcini.
Stiva de activități
Activitățile sunt aranjate în ordinea în care este deschisă fiecare activitate. Această stivă menținută se numește Back Stack. Atunci când porniți o nouă activitate folosind startActivity(), aceasta „împinge” o nouă activitate în sarcina dumneavoastră și pune activitatea anterioară în stiva din spate.
După ce apăsați butonul back, atunci „sare” cea mai de sus activitate și o elimină din stiva din spate și vă duce înapoi la activitatea anterioară.
Mode de lansare
Un „mod de lansare” este modul în care o nouă instanță a unei activități trebuie să fie asociată cu sarcina curentă. Modurile de lansare pot fi definite utilizând unul dintre cele două mecanisme:
- Prin declararea în fișierul AndroidManifest.xml
- Prin adăugarea indicatorului cu Intent.
Există patru tipuri de moduri de lansare a activităților. Acestea sunt:
- standard
- singleTop
- singleTask
- SingleInstance
Fisier Manifest: Atunci când declarați o activitate într-un fișier manifest, puteți specifica modul în care activitatea trebuie să se asocieze cu sarcinile atunci când pornește.
Exp:
<activity android:launchMode = ../>
Intent Flag: Android oferă, de asemenea, stegulețe de activitate prin care puteți modifica comportamentul implicit de asociere a activității cu sarcinile în timpul pornirii acesteia prin metoda startActivity(). Aceste valori ale steagurilor pot fi transmise prin intermediul datelor suplimentare 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
(implicit) : Acesta este modul comun pentru majoritatea activităților.Mai multe instanțe ale clasei de activitate pot fi instanțiate și mai multe instanțe pot fi adăugate la aceeași sarcină sau la sarcini diferite.
Exemplu:
Să presupunem că aveți activitățile A, B, C și D, iar activitatea B are „launch mode = standard”. Acum lansați din nou activitatea B –
Stare a stivei de activități înainte de lansare B
A -> B -> C -> D
Stare a stivei de activități după lansare B
A -> B -> C -> D -> B
singleTop
: Diferența față de standard este că, în cazul în care o instanță a activității există deja în partea de sus a sarcinii curente și sistemul direcționează intenția către această activitate, nu se va crea o nouă instanță, deoarece se va lansa o metodăonNewIntent()
în loc să se creeze un nou obiect.
Exemplu:
Cazul 1:
Să presupunem că aveți activitățile A, B și C și că activitatea D are „launch mode = singleTop”. Acum lansați activitatea D –
Starea stivei de activități înainte de lansare D
A -> B -> C
Starea stivei de activități după lansarea activității D
A -> B -> C -> D (Aici D se lansează ca de obicei)
Cazul 2:
Să presupunem că aveți activitățile A, B, C și D, iar activitatea D are „modul de lansare = singleTop”. Acum lansați din nou activitatea D –
Starea stivei de activități înainte de lansare D
A -> B -> C -> D
Starea stivei de activități după lansare D activitate
A -> B -> C -> D (Aici instanța veche este apelată și datele de intenție sunt direcționate prin onNewIntent()
callback)
singleTask
: O nouă sarcină va fi întotdeauna creată și o nouă instanță va fi introdusă în sarcină ca rădăcină. Cu toate acestea, în cazul în care există o instanță de activitate în orice sarcină, sistemul direcționează intenția către acea instanță de activitate prin apelul metodeionNewIntent()
. În acest mod, instanțele de activitate pot fi trimise în aceeași sarcină. Acest mod este util pentru activitățile care acționează ca puncte de intrare.
Exemplu:
Cazul 1:
Să presupunem că aveți activitățile A, B și C și că activitatea D are „launch mode = singleTask”. Acum lansați activitatea D –
Starea stivei de activități înainte de lansare D
A -> B -> C
Starea stivei de activități după lansarea activității D
A -> B -> C -> D (Aici D se lansează ca de obicei)
Cazul 2:
Să presupunem că aveți activitățile A, B, C și D, iar activitatea B are „modul de lansare = singleTask”. Acum lansați din nou activitatea B-
Starea stivei de activități înainte de lansare D
A -> B -> C -> D
Starea stivei de activități după lansarea activității B
A -> B (Aici se apelează vechea instanță și datele de intenție sunt direcționate prin callback-ul onNewIntent())
De asemenea, observați că activitățile C și D sunt distruse aici.
singleInstance
: Același lucru ca și,singleTask
, cu excepția faptului că nici o instanță de activități nu poate fi împinsă în aceeași sarcină cu cea a singleInstance
. În consecință, activitatea cu modul de lansare se află întotdeauna într-o sarcină cu o singură instanță de activitate. Acesta este un mod foarte specializat și ar trebui să fie utilizat numai în aplicațiile care sunt implementate în întregime ca o singură activitate.
Exemplu:
Cazul 1:
Să presupunem că aveți activitățile A, B și C, iar activitatea D are „launch mode = singleInstance”. Acum lansați activitatea D –
Starea stivei de activități înainte de lansare D
A -> B -> C
Starea stivei de activități după lansarea activității D activitate
Task1-A -> B -> B -> C
Task2-D (aici D va fi în altă activitate)
Acum, dacă continuați acest lucru și porniți E și D, atunci Stack va arăta astfel-
Task1-A -> B -> C -> E
Task2-D
Cazul 2:
Să presupunem că aveți activitățile A, B, C într-o sarcină, iar activitatea D se află într-o altă sarcină cu „launch mode = singleInstance”. Acum lansați din nou activitatea D-
Starea stivei de activități înainte de lansare D
Task1-A -> B -> C
Task2-D
Starea stivei de activități după lansarea activității B
Task1-A -> B -> C
Task2-D (Aici se apelează vechea instanță și datele de intenție sunt direcționate prin callback-ul onNewIntent())
FLAG_ACTIVITY_NEW_TASK
: Aceeași valoare ca și valoareasingleTask
din fișierul Manifest (a se vedea mai sus).
FLAG_ACTIVITY_SINGLE_TOP
: Același lucru ca și valoareasingleTop
din fișierul Manifest (a se vedea mai sus).
FLAG_ACTIVITY_CLEAR_TOP
: Dacă activitatea care se lansează este deja în curs de desfășurare în sarcina curentă, atunci, în loc să se lanseze o nouă instanță a acelei activități, toate celelalte activități de deasupra ei sunt distruse și această intenție este livrată instanței reluate a activității (acum de deasupra), deși.onNewIntent()
Nu există o valoare corespunzătoare în fișierul Manifest care să producă acest comportament. Referințele pe care le-am folosit pentru acest articol sunt aici și aici.
Vă rugăm să vă abonați la e-mail pentru a primi toate buletinele de știri ale acestui blog și dacă simțiți că acest articol vă va ajuta să înțelegeți mai bine, atunci nu uitați să vă abonați, să distribuiți și să comentați mai jos. Ok, atunci vă voi vedea în următorul meu tutorial până atunci bucurați-vă de viață și codare fericită 🙂
Sunt un dezvoltator Android foarte entuziast pentru a construi aplicații Android solide. Am un interes deosebit în dezvoltarea pentru Android și am publicat aplicații în Google Play Store. Sunt întotdeauna deschis să învăț noi tehnologii. Pentru orice ajutor, lăsați-ne o linie oricând la [email protected]
.