ymmärrä startup-toiminnan käyttäytyminen fragmenttien ja aktiivisuuden vuoksi
koko aloitustoiminnan tulos ja onaktiviteettitulos sallitaan kaksisuuntainen viestintä lähdetoiminnan ja kohdetoiminnan välillä. Sen virtaus on esitetty alla olevassa kaaviossa.
alla olevasta virtauksesta voimme helposti ymmärtää on-toiminnan virtaaman, joka seuraa Lähdetoiminnasta Kohdetoimintaan
source activity call, startActivityForResult lähettämällä aikomus yhdessä pyynnön koodin Android SDK.
Android SDK avaa tämän jälkeen toiminnan tarkoituksessa ilmoitetulla tavalla.
kun kohdetoiminta on lopettanut työnsä, se palaa soittajatoimintaan.
se voi lähettää tuloksen takaisin käyttäen settresultia lähettämällä tuloskoodin ja aikomuksen
useita huomautuksia täällä:
tuloskoodia käytetään kohdetoiminnassa merkitsemään lähdetoiminnalleen mikä se on (esim. OK, Peruuta jne.).
lähdetoiminta käyttää pyyntökoodia tietääkseen, mikä kohdetoiminto palauttaa puhelun.
saatoimme nähdä, että kohdetoiminnassa ei ole pyynnön koodin näkyvyyttä.
Paperiton startActivityForResult Fragment Flow
fragmentissa meillä on myös startActivityForResult-funktio soitettavaksi ja onactivityresult-funktio ohitettavaksi.
tämä herättää useita kysymyksiä…esim. miten se toimii? Onko se sama kuin toiminnan aloitustulos ja onaktiivisuustulos? Miten ne liittyvät toisiinsa?
lyhyt vastaus on, että ne ovat samanlaisia, mutta hienovaraisesti erilaisia. Usein aiheuttaa sekaannusta, ja vika. Joten on tärkeää ymmärtää samankaltaisuus ja erot.
katkelmavirta kuvitettu.
alla oleva kaavio havainnollistaa, miten kaikki toimii yhdessä. Erot activity ’s startActivityForResult ja onActivityResult flow’ hun on merkitty punaisella.
tarkennetaan asiaa.
kun kutsumme fragmentin startupforresultiksi (Huom: NOT activity?.startActivityForResult), kohdetoiminnan luominen on sama. Erona on kuitenkin yksitoimintatulos.
startActivityForResult()
täytyy hoitaa se fragment
’s onActivityForResult()
getActivity().startActivityForResult()
täytyy käsitellä sitä activity
’ s onActivityForResult()
jos olet fragment
ja haluat käsitellä tuloksen fragment
, käytä onActivityForResult()
, muuten, jos haluat käsitellä sen katkelman activity
, käytä getActivity.startActivityForResult()
kun Android SDK palauttaa onActivityResult, pyynnön koodi on muutettu. 0xp0000 liitetään alkuperäiseen pyyntökoodiin.
p-arvo alkaa 1: stä, ja jokaisen onactivityresultin lisäys kutsutaan samasta kohdebagmentista. (Jos toinen kohde fragmentti kutsutaan, P-arvo nollataan).
esim. jos alkuperäinen pyyntökoodi on 0xFF (eli 255), pyyntökoodi palaa ensimmäisellä kerralla on 0x100FF. Toisen kerran return requestCode on 0x200FF.
palattuaan lähdetoiminnan yksitoimisuustulokseen sen odotetaan kutsuvan superiksi.onActivityResult, joka sijaitsee Fragmentactivityssä (Appcompatactivityn emoyhtiö)
Onactivityresult Fragmentactivityssä, saa P-arvon (käyttäen pyyntökoodia > > 16). P on sen joukon indeksi, johon lähdekappale on tallennettu. (esim. jos pyyntökoodi on 0x200FF, niin 0x200FF >> 16 = 2)
käyttäen P-arvoa, sillä on nyt pääsy lähdekappaleeseen, jota käytetään vaiheessa 9 alla.
nyt se poistaa p-arvon pyynnön koodista (käyttäen pyyntökoodia & 0xffff), jotta päästään takaisin alkuperäiseen pyyntökoodiin (esim. jos pyyntökoodi on 0x200FF, niin 0x200FF & 0xffff = 0xff)
koska nyt se saa alkuperäisen pyynnön koodin, jonka lähdefragmentti on luonut, se voi kutsua lähdefragmentin onActivityResult alkuperäisen pyynnön koodin kanssa.
joitakin perusasioita, jotka haluavat tietää.
A. aktiviteetin startaktiviteettitulos on erilainen kuin fragmentin startaktiviteettitulos
fragmentissa, jos kutsumme activity?.startActivityForResult(...)
, niin fragmentin onActivityResult
ei kutsuta automaattisesti.
B. Jos ohitamme toiminnan onActivityResult, varmista, että meillä on super.onactivity result in place
jos ohitamme source Activityn onActivityResult
, mutta unohdamme super.onActivityResult
, fragmenttia onActivityResult
ei kutsuta.
C. Activityn onActivityResult-tuloksessa nähty pyyntökoodi eroaa yhdestä fragmentista, joka on annettu
johtuen siitä, että Androidin SDK liitti P
requestCode
, aktiviteetin onActivityResult
emme koskaan saa identtistä requestCode
sinne. Tämä aiheuttaa ajoittain hämmennystä kehittäjälle, kun siellä olevaa koodia virheenkorjataan.
D. kun toiminta palautuu valtiolta (ts. onStateInstance != null), sen tulisi välttää uudestaan sen fragmentti.
kun onActivityResult
kutsutaan, se yritti noutaa alkuperäisen katkelman. Tämä suoritetaan myös toiminnalle, joka palautetaan tapetusta tilasta (esim.emuloidaan käyttämällä älä pidä toimintaa).
joten jos kehittäjä luo fragmentin uudelleen joka kerta, kun onCreate kutsutaan (riippumatta siitä, onko se palautettu tila vai ei), alkuperäinen fragmentti, joka on palautettu, tuhoutuu, ja onActivityResult
soittaja, fragmenttia ei mystisesti kutsuta.
tämä on sudenkuoppa jopa monelle kokeneelle kehittäjälle ja alalle julkaistulle sovellukselle, sillä tunnistettuun bugiin on hyvin vaikea päästä (koska se ei tapahdu joka kerta, ja vaatii monimutkaisemman virtauksen käynnistyäkseen).
Kiitos lukemisesta …