The Android Launch Mode Animated CheatSheet

Dec 20, 2018 – 6 min citește

Înainte de API 11, activitățile noastre obișnuiau să afișeze fiecare pagină nouă pe ecran. Acum, cu Fragments și cu instrumentele de navigare din API 28, este total posibil să realizăm o aplicație foarte complexă cu o singură activitate. Cu toate acestea, activitățile sunt în continuare excelente pentru a vă secționa aplicația în etape și procese. Poate doriți să împărțiți tot marketingul într-o singură activitate și să aveți aplicația propriu-zisă în propria sa activitate. Poate doriți ca o secțiune să fie rezervată pentru o caracteristică, cum ar fi un serviciu de chat. Cunoașterea modurilor de lansare a activităților vă ajută să divizați mai bine aceste procese în moduri care au sens pentru utilizatorii dvs. Stând la serviciu, nu am putut niciodată să-mi amintesc modurile de lansare din capul locului, așa că m-am gândit să scriu un blog despre asta, să anim câteva gif-uri pentru a ilustra conceptele și apoi să-l împărtășesc cu toată lumea. Bucurați-vă!

Înainte de a vorbi despre modurile de lansare, să înțelegem mai întâi rolul unei sarcini. O sarcină deține o colecție de activități care sunt aranjate într-o stivă numită backstack. Prima activitate care va fi lansată într-o sarcină este activitatea rădăcină. Apăsarea butonului înapoi pe o activitate rădăcină nu numai că omoară activitatea, dar omoară și sarcina și, eventual, aplicația.

Acum să ne scufundăm în câteva moduri de lansare!

Să spunem că aveți o sarcină cu o activitate rădăcină numită Activitate A, iar apoi lansați o nouă activitate numită B, B este împinsă în partea de sus a stivei. Acum, să presupunem că lansați o altă activitate B din B pe care tocmai am creat-o. Veți avea acum două instanțe ale activității B stivuite una peste alta. Dacă un utilizator apasă butonul înapoi, se va întoarce la o altă instanță a activității B. Acest lucru ar putea fi foarte derutant pentru utilizator. Stivuirea și crearea de activități una peste alta, indiferent de situație, se numește modul de lansare standard. Dacă nu există un mod de lansare definit în activitatea XML din manifest, activitatea va utiliza modul de lansare standard.

Acum că am văzut cum modul Standard poate fi derutant pentru utilizator, putem înțelege acum modul de lansare Single Top. Acest mod de lansare oprește ca diferite instanțe ale acelorași activități să fie suprapuse. Să spunem că activitatea B este un top unic. Putem defini modurile de lansare în manifest astfel:

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

Acum, dacă lansați activitatea B din activitatea B, în loc să creați o nouă instanță a lui B și să o suprapuneți peste vechiul B, intenția este trecută în instanța curentă a lui B. Singura modalitate de a avea două instanțe ale aceleiași activități într-o singură sarcină este să lansați o activitate diferită din B și apoi să creați B din acea activitate. Conceptul principal al modului de lansare cu un singur vârf este că nu puteți avea două instanțe ale aceleiași activități suprapuse.

Dacă nu doriți două instanțe ale aceleiași activități cu un singur vârf într-o sarcină în timp ce utilizați modul de lansare cu un singur vârf, puteți trece constanta FLAG_ACTIVITY_CLEAR_TOP în intenția dumneavoastră. Pentru a ilustra ceea ce face acest lucru, să spunem că stiva de activități este ABC (B este încă single top). Dacă lansați B de la C cu FLAG_ACTIVITY_CLEAR_TOP, stiva dvs. va sări până la B, iar intenția va fi transmisă chiar acelei instanțe a lui 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);

Următorul mod de lansare se numește Single Task. În acest mod de lansare, precizăm că o activitate poate aparține unei singure sarcini în toate sarcinile din aplicație. Deci, similar comportamentului FLAG_ACTIVITY_CLEAR_TOP, dacă stiva dvs. este ABC, iar dvs. lansați B (o singură sarcină) din C, facem pop până la B și transmitem intenția către acea instanță.

<activity android:name=".Activity_B" android:launchMode="singleTask"/>

Dar dacă vrem ca B să fie în propria sa sarcină? Aici intră în joc afinitatea sarcinilor. Afinitatea sarcinii vă permite să definiți cărei sarcini îi aparține o activitate. În mod implicit, o activitate are aceeași afinitate de sarcină ca și activitatea sa rădăcină. Cu afinitatea de sarcină, putem acum să separăm activitățile în sarcini diferite.

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

În acest caz, activitatea A și activitatea B au afinități de sarcină diferite. Când A este creată în Sarcina 1, C este lansată din A. În mod implicit, fiecare activitate are aceeași afinitate ca și rădăcina sa, deci suntem tot în Sarcina 1. Acum, B este lansată din C. B are o afinitate de sarcină diferită, așa că acum este rădăcina sarcinii 2, care trece în prim-plan. Dacă lansăm o nouă instanță a activității C din B, C aparține sarcinii 2, deoarece aceasta este afinitatea sarcinii activității rădăcină (în acest caz, B). Dar ce se întâmplă dacă încercăm acum să lansăm A din C în sarcina 2? Din moment ce afinitatea lui A este Sarcina 1, trecem de la Sarcina 2 la Sarcina 1, ne întoarcem până la Activitatea A și, în cele din urmă, transmitem intenția către A.

Cunoașterea Sarcinii unice ne va ajuta să înțelegem mai bine modul final de lansare; Instanța unică. Ca și Single Task, o activitate cu Single Instance poate fi singura activitate din toate sarcinile. Diferența dintre cele două este că o activitate cu instanță unică poate fi, de asemenea, singura activitate dintr-o sarcină.

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

În acest exemplu, activitatea B va avea un mod de lansare de instanță unică. Activitatea A din sarcina 1 lansează activitatea B. Acest lucru face ca activitatea B să fie lansată într-o nouă sarcină, care este apoi plasată în prim-plan. Activitatea B lansează apoi activitatea C. Deoarece o instanță unică poate fi singura activitate dintr-o sarcină, C este lansată deasupra activității A din sarcina 1, iar apoi sarcina 1 trece în prim-plan.

Afinitatea sarcinilor joacă, de asemenea, un rol în instanța unică. Dacă activitatea B nu are afinitate de sarcină, un utilizator nu poate naviga înapoi la sarcina 1. Dacă B a avut afinitate de sarcină, un utilizator va putea merge înainte și înapoi între Sarcina 1 și 2.

Cunoașterea modurilor de lansare mă ajută să realizez experiențe UI/UX mai bune pentru utilizatorii mei și chiar mă ajută să rezolv unele bug-uri care îmi dau bătăi de cap, așa că sper ca aceste informații să vă ajute și pe dumneavoastră!

Vreau să dau un shoutout paginii youtube CodeTutor a lui Anil Deshpande pentru că m-a ajutat să înțeleg mai bine acest concept. Iată primul din cele șapte videoclipuri pe această temă: https://www.youtube.com/watch?v=m8sf0UkJkxo

Lasă un comentariu