a startActivityForResult fragmentum és tevékenység viselkedésének megértése

a teljes startActivityForResult és onActivityResult engedélyezett egy 2-utas kommunikáció a forrás tevékenység és a cél tevékenység. Áramlása az alábbi ábrán látható.

az alábbi áramlásból könnyen megérthetjük az Onactivityr eredmény áramlását a forrás tevékenységtől a rendeltetési tevékenységig

a forrás tevékenység hívás, startActivityForResult küldésével a szándék együtt a kérelmet kódot Android SDK.

az Android SDK ezután megnyitja a tevékenységet a szándék szerint.
miután a céltevékenység befejezte a feladatát, visszatér a hívó tevékenységéhez.

a setresult használatával visszaküldheti az eredményt, ha elküldi az eredménykódot és a szándékot

itt több megjegyzés található:

az eredménykódot a céltevékenység használja, hogy megjelölje a forrástevékenységének, hogy mi az állapota (pl. OK, Cancel, stb.).

a kéréskódot a forrástevékenység használja, hogy megtudja, melyik céltevékenység küldi vissza a hívást.

láthattuk, hogy a céltevékenység nem látja a kérés kódját.

nem dokumentált startActivityForResult fragmentum Flow

a fragmentumban startactivityforesult függvényt is hívhatunk, valamint onactivityresult funkciót is felülbírálhatunk.

ez számos kérdést vet fel…pl. hogyan működik? Ugyanaz-e, mint a tevékenységindításaeredmény és az onactivityeredmény? Hogyan kapcsolódnak egymáshoz?
a rövid válasz az, hogy hasonlóak, de finoman különböznek. Gyakori oka a zavartság, és a hiba. Fontos megérteni a hasonlóságokat és a különbségeket.

a fragmentum áramlás illusztrált.

az alábbi ábra világosan szemlélteti, hogyan működik együtt. Az activity startActivityForResult és az onActivityResult flow közötti különbségek piros színűek.

nézzük részletesebben.

amikor fragmentum startActivityForResult (megjegyzés: nem tevékenység?.startActivityForResult), a céltevékenység létrehozása ugyanaz. A különbség azonban az onaktivitáseredményt.

startActivityForResult() kell kezelni a fragmentonActivityForResult()

getActivity().startActivityForResult() kell kezelni azt a activity ‘ s onActivityForResult()

ha a fragment és szeretné kezelni az eredményt a fragment, használja onActivityForResult(), különben, ha szeretné kezelni azt a activitya töredék, használja getActivity.startActivityForResult()

amikor Android SDK visszatér onActivityResult, a kérelem kód megváltozott. A 0xP0000 csatolva van az eredeti requestCode-hoz.

a P-érték 1-től kezdődik, és minden egyes onActivityResult esetében növekszik ugyanabból a célfragmensből. (Ha egy másik célfragmenst hívunk meg, a P-érték visszaáll).

pl. ha az eredeti kérőkód 0xFF (azaz 255), akkor az első alkalommal visszaadott kérőkód 0x100FF lesz. A második alkalommal visszatérési requestCode lesz 0x200FF.

miután visszatért a forrás tevékenység onActivityResult, várható, hogy meg kell hívni super.onActivityResult, amely a FragmentActivity-ben található (az AppCompatActivity szülője)

a FragmentActivity-ben lévő onActivityResult ezután kibontja a P értéket (a >> 16 kérőkód használatával). A P annak a tömbnek az indexe, ahol a forrásfragmenst tárolják. (pl. ha a kérőkód 0x200ff, akkor 0x200ff >> 16 = 2)

a P-érték használatával most hozzáférhet a forrásrészlethez, amelyet az alábbi 9.lépésben használunk.

most eltávolítja a P értéket a requestCode-ból (a requestCode & 0xffff használatával), hogy visszatérjen az eredeti kérési kódhoz (pl. ha a requestCode 0x200ff, akkor 0x200ff & 0xffff = 0xFF)

mivel most megkapja az eredeti kéréskódot, amelyet a forrásfragmens létrehozott, meghívhatja a forrásfragmens onactivityresultját az eredeti kéréskóddal.

néhány alapvető pontot, amelyek szeretnék tudni.

A. Az Activity startActivityForResult viselkedése eltér a fragmentum startactivityforesult

– jétől a fragmentumban, ha activity?.startActivityForResult(...) – nek hívjuk, akkor a fragmentum onActivityResult – je nem lesz automatikusan meghívva.

B. Ha felülírjuk az activity onActivityResult eredményét, győződjünk meg róla, hogy van super.onActivityResult helyett

ha felülírjuk forrás tevékenység onActivityResult, de elfelejti, hogy super.onActivityResult, akkor töredék onActivityResult nem lesz meghívva.

C. a requestCode látható activity onActivityResult eltér az egy töredék biztosított

miatt az OK, Android SDK csatolt P a requestCode, a tevékenység onActivityResult, soha nem fogunk azonos requestCode ott. Ez időnként zavart okoz a fejlesztőnek a kód hibakeresésekor.

D. Amikor egy tevékenység helyreáll az államból (azaz onStateInstance != null), meg kell kerülni újra a fragmentum.

a onActivityResult meghívásakor megpróbálta letölteni az eredeti töredéket. Ez is végre a tevékenység, amely visszaállítja a megölt állapotban (például emulált használatával ne tartsa tevékenység).

tehát, ha a fejlesztő újra létrehozza a töredéket minden alkalommal, amikor az onCreate-t hívják (függetlenül attól, hogy visszaállított állapot-e vagy sem), akkor a visszaállított eredeti töredék megsemmisül, és a hívó fél onActivityResult – je, a töredék titokzatosan nem hívható meg.

ez egy buktató még sok tapasztalt fejlesztők és app megjelent a területen, mivel nagyon nehéz egy azonosított hiba (mivel ez nem történik meg minden alkalommal, és szükség van egy bonyolultabb flow kiváltó).

Köszönöm, hogy elolvastad …