A tevékenység indítási módjának megértése Androidban

Sharing is caring!

A tevékenység indítási módja fontos szerepet játszik a feladat és a back stack fenntartásában. Mielőtt elmagyaráznánk az indítási módot, először meg kell értenünk, mi a feladat és a back stack?

Task

A task a “tevékenységek halmaza” az alkalmazásban. Ha egy Tevékenységet háttérbe küldünk (például a HOME billentyű lenyomásával, miközben megtekintjük), akkor az egész Feladat (és a benne lévő összes Tevékenység) is visszakerül. Ha a felhasználó ezután rákattint az alkalmazásodra, a feladat (és a benne lévő tevékenységek sorrendje) előjön. Más szavakkal: A feladat olyan tevékenységek gyűjteménye, amelyekkel a felhasználók interakcióba lépnek, amikor egy bizonyos feladatot végeznek. A tevékenységek egy veremben – a hátsó veremben – vannak elrendezve, abban a sorrendben, ahogyan az egyes tevékenységek megnyíltak.

Így alapvetően amikor a felhasználó elindít egy alkalmazást a home ikonról, különböző képernyőkön navigál, így különböző tevékenységek kerülnek egymás tetejére. A tevékenységek ezen gyűjteményét nevezzük feladatoknak.

Back Stack

A tevékenységek abban a sorrendben vannak elrendezve, ahogyan az egyes tevékenységek megnyíltak. Ezt a karbantartott veremet Back Stacknek nevezzük. Amikor egy új tevékenységet indítunk a startActivity() segítségével, ez egy új tevékenységet “tol” a feladatra, és az előző tevékenységet a back stackbe teszi.

Amikor megnyomjuk a back gombot, akkor a legfelső tevékenység “kipattan” és eltávolítja a back stackből, és visszavisz minket az előző tevékenységhez.

Launch Mode

A “launch mode” az a mód, ahogyan egy tevékenység új példányát az aktuális feladathoz kell társítani. Az indítási módok kétféle mechanizmus segítségével határozhatók meg:

  1. Az AndroidManifest.xml fájlban történő deklarálással
  2. Az Intent jelző hozzáadásával.

A tevékenység indítási módja négyféle lehet. Ezek:

  1. standard
  2. singleTop
  3. singleTask
  4. SingleInstance

Manifest fájl: A tevékenység manifeszt fájlban történő deklarálásakor megadhatja, hogy a tevékenység indításkor hogyan társuljon a feladatokhoz.

Exp:

<activity android:launchMode = ../>

Intent Flag: Az Android olyan Activity flageket is biztosít, amelyekkel megváltoztathatja az Activity és a feladatok társításának alapértelmezett viselkedését a startActivity() metóduson keresztül történő indításakor. Ezek a zászlók értékei az Intent extra adatokon keresztül adhatók át.

FLAG_ACTIVITY_NEW_TASK -> similar to "launchMode = singleTask"FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_SINGLE_TOP -> similar to "launchMode = singleTop"FLAG_ACTIVITY_CLEAR_TOP

standard (alapértelmezett) : Ez a legtöbb tevékenység általános üzemmódja.Az activity osztály több példánya is példányosítható, és több példány adható ugyanahhoz a feladathoz vagy különböző feladatokhoz.

Példa:
Tegyük fel, hogy van A, B, C és D tevékenységünk, és a B tevékenységünk “launch mode = standard”. Most újra elindítja a B tevékenységet –
A tevékenységhalmaz állapota indítás előtt B
A -> B -> C -> D
A tevékenységhalmaz állapota indítás után B
A -> B -> C -> D -> B

singleTop : A szabványtól való eltérés az, hogy ha a tevékenység egy példánya már létezik az aktuális feladat tetején, és a rendszer a szándékot erre a tevékenységre irányítja, akkor nem jön létre új példány, mert új objektum létrehozása helyett egy metódustonNewIntent() indít el.

Példa:
1. eset:
Tegyük fel, hogy van A, B és C tevékenységünk, és a D tevékenységünknek “launch mode = singleTop”. Most elindítja a D tevékenységet –
A tevékenységhalmaz állapota indítás előtt D
A -> B -> C
A tevékenységhalmaz állapota indítás után D tevékenység
A -> B -> C -> D (Itt a D indítása a szokásos módon történik)
2. eset:
Tegyük fel, hogy vannak A, B, C és D tevékenységei és a D tevékenységének “launch mode = singleTop”. Most újra elindítja a D tevékenységet –
A tevékenységhalmaz állapota indítás előtt D
A -> B -> C -> D
A tevékenységhalmaz állapota indítás után D tevékenység
A -> B -> C -> D (Itt a régi példányt meghívja és a szándékadatokat onNewIntent() callback-en keresztül továbbítja)

singleTask : Mindig új feladat jön létre, és egy új példányt tolunk a feladatba gyökérként. Ha azonban bármilyen tevékenységpéldány létezik bármelyik feladatban, a rendszer a módszertonNewIntent() híváson keresztül a szándékot az adott tevékenységpéldányhoz irányítja. Ebben a módban a tevékenységpéldányok ugyanabba a feladatba tolhatók. Ez az üzemmód olyan tevékenységeknél hasznos, amelyek belépési pontként működnek.

Példa:
1. eset:
Tegyük fel, hogy van A, B és C tevékenységünk, és a D tevékenységünk “launch mode = singleTask”. Most elindítja a D tevékenységet –
A tevékenységhalmaz állapota indítás előtt D
A -> B -> C
A tevékenységhalmaz állapota indítás után D tevékenység
A -> B -> C -> D (Itt a D indítása a szokásos módon történik)
2. eset:
Tegyük fel, hogy van A, B, C és D tevékenysége és a B tevékenysége “launch mode = singleTask”. Most újra elindítja a B tevékenységet-
A tevékenységhalmaz állapota indítás előtt D
A -> B -> C -> D
A tevékenységhalmaz állapota indítás után B tevékenység
A -> B (Itt a régi példányt meghívják és a szándékadatokat az onNewIntent() callback-en keresztül továbbítják)
Azt is vegye észre, hogy a C és D tevékenységek itt megsemmisülnek.

singleInstance : Ugyanaz, mint,singleTask kivéve, hogy a no activities példányt a singleInstance‘s ugyanabba a taskba lehet tolni. Ennek megfelelően az indítási móddal rendelkező tevékenység mindig egyetlen tevékenységpéldány feladatban van. Ez egy nagyon speciális mód, és csak olyan alkalmazásokban szabad használni, amelyek teljes egészében egyetlen tevékenységként vannak megvalósítva.

Példa:
1. eset:
Tegyük fel, hogy van A, B és C tevékenységünk, és a D tevékenységünknek “launch mode = singleInstance”. Most elindítja a D tevékenységet –
A tevékenységhalmaz állapota indítás előtt D
A -> B -> C
A tevékenységhalmaz állapota indítás után D tevékenység
Task1-A -> B -.> C
Task2-D (itt a D egy másik feladatban lesz)
Most ha ezt folytatjuk és elindítjuk E-t és D-t, akkor a Stack így fog kinézni-
Task1-A -> B -> C -> E
Task2-D
2. eset:
Tegyük fel, hogy az A, B, C tevékenységek egy feladatban vannak, a D tevékenység pedig egy másik feladatban van “launch mode = singleInstance”. Most újra elindítja a D tevékenységet-
A tevékenységhalmaz állapota indítás előtt D
Task1-A -> B -> C
Task2-D
A tevékenységhalmaz állapota indítás után B tevékenység
Task1-A -> B -> C
Task2-D (Itt a régi példányt meghívják és a szándékadatokat az onNewIntent() callback-en keresztül továbbítják)

FLAG_ACTIVITY_NEW_TASK : Ugyanaz az értéksingleTask, mint a Manifest fájlban (lásd fent).

FLAG_ACTIVITY_SINGLE_TOP : Ugyanaz az értéksingleTop a Manifest fájlban (lásd fentebb).

FLAG_ACTIVITY_CLEAR_TOP : Ha az indítandó tevékenység már fut az aktuális feladatban, akkor ahelyett, hogy a tevékenység új példányát indítaná el, az összes többi, rajta lévő tevékenység megsemmisül, és ezt a szándékot a tevékenység újraindított példánya kapja meg (most a tetején), bár.onNewIntent() A Manifest fájlban nincs megfelelő érték, amely ezt a viselkedést eredményezi. A cikkhez használt hivatkozás itt és itt található.

Kérem, iratkozzon fel e-mailben, hogy megkapja a blog összes hírlevelét, és ha úgy érzi, hogy ez a bejegyzés segít jobban megérteni, akkor ne felejtse el feliratkozni, megosztani és megjegyzést fűzni az alábbiakban. Oké, akkor találkozunk a következő bemutatómban, addig is élvezze az életét és boldog kódolást 🙂

0 0 szavazat
Article Rating

Egy nagyon lelkes Android fejlesztő vagyok, aki szilárd Android alkalmazásokat épít. Nagy érdeklődéssel fejlesztek Androidra, és már publikáltam alkalmazásokat a Google Play Store-ban. Mindig nyitott vagyok az új technológiák tanulására. Bármilyen segítségért bármikor írjon egy sort a [email protected]

címre.