Forstå oppførselen til startActivityForResult For Fragment og Aktivitet
hele startActivityForResult og onActivityResult tillates en 2-veis kommunikasjon mellom kildeaktiviteten og målaktiviteten. Strømmen er som vist i diagrammet nedenfor.
fra understrømmen kan vi lett forstå strømmen Av Onactivityresultat fra Kildeaktivitet Til Destinasjonsaktivitet
kilden aktivitet samtale, startActivityForResult ved å sende inn hensikten sammen med forespørselskoden Til Android SDK.
Android SDK åpner deretter aktiviteten tilsvarende som angitt i Hensikten.
når målaktiviteten er ferdig med jobben, går den tilbake til anropsaktiviteten.
det kan sende resultatet tilbake ved hjelp av setResult ved å sende inn resultCode og intent
Flere notater her:
resultCode brukes av målaktiviteten til å flagge til kildeaktiviteten hva det er statusen (F.EKS.
forespørselskoden brukes av kildeaktiviteten til å vite hvilken målaktivitet som returnerer anropet.
vi kunne se at destinasjonsaktiviteten ikke har noen synlighet for forespørselskoden.
Udokumentert startActivityForResult Fragment Flow
I Fragment har vi også startActivityForResult funksjon å ringe, og også onactivityforresult funksjon å overstyre.
dette reiser flere spørsmål…F. Eks Hvordan fungerer det? Er det det samme som aktivitetens startActivityForResult og onActivityResult? Hvordan er de relatert?
det korte svaret er, de er like, men subtilt forskjellige. En hyppig årsak til forvirring og feil. Så det er viktig å forstå likheten og forskjellene.
fragmentet flyt illustrert.
nedenfor er diagrammet som illustrerer tydelig hvordan alt fungerer sammen. Forskjellene med aktivitetens startActivityForResult og onActivityResult flow er farget I RØDT.
La oss mer utdype det.
Når vi kaller Fragment ‘ s startActivityForResult (merk: IKKE aktivitet?.startActivityForResult), er opprettelsen av destinasjonsaktivitet den samme. Men forskjellen er onactivityresultat.
startActivityForResult()
må håndtere det fra fragment
‘ s onActivityForResult()
getActivity().startActivityForResult()
må håndtere det fra activity
‘s onActivityForResult()
hvis du er på en fragment
og du vil håndtere resultatet på fragment
, bruk onActivityForResult()
, ellers, hvis du vil håndtere det fra activity
av fragmentet, bruk getActivity.startActivityForResult()
Når Android SDK returnerer onActivityResult, har forespørselskoden blitt endret. En 0xp0000 legges til den opprinnelige forespørselskoden.
p-verdien starter fra 1, og økes for hver onActivityResult kalles fra samme målfragment. (Hvis et annet målfragment kalles, tilbakestilles p-verdien).
f. eks. hvis den opprinnelige forespørselskoden er 0xFF (dvs. 255), vil forespørselskoden returnere første gang være 0x100FF. Den andre gangen return requestCode vil være 0x200FF.
ved retur til kilden aktivitetens onactivityresultat, er det forventet at det skal kalle super.onActivityResult, som ligger I FragmentActivity (overordnet Av AppCompatActivity)
onActivityResult I FragmentActivity vil da trekke ut p-verdien (ved hjelp av requestCode > > 16). P Er indeksen for matrisen der kildefragmentet er lagret. (f. eks hvis forespørselskoden er 0x200FF, deretter 0x200FF >> 16 = 2)
Ved Hjelp Av p-verdien har den nå tilgang til kildefragmentet, som brukes i trinn 9 nedenfor.
nå fjerner Den p-verdien Fra forespørselskoden (ved hjelp av forespørselskode & 0xffff), for å komme tilbake til den opprinnelige forespørselskoden (f. eks. hvis forespørselskoden er 0x200FF, så 0x200FF & 0xffff = 0xFF)
Som nå får den opprinnelige forespørselskoden som kildefragmentet opprettet, kan det kalle kildefragmentets onActivityResult med den opprinnelige forespørselskoden.
noen grunnleggende punkter som vil vite.
a. oppførselen Til aktivitetens startActivityForResult er forskjellig fra Fragmentets startActivityForResult
I Fragment, hvis vi kaller activity?.startActivityForResult(...)
, Vil Fragmentets onActivityResult
ikke bli kalt automatisk.
B. hvis vi overstyrer aktivitetens onactivityresultat, sørg for at vi har super.onActivityResult på plass
hvis vi overstyrer kildeaktivitetens onActivityResult
, men glemmer å ha super.onActivityResult
, Vil Fragmentets onActivityResult
ikke bli kalt.
C. forespørselskoden sett i aktivitetens onActivityResult er forskjellig fra det ene fragmentet som er gitt
På Grunn Av At Android SDK tilføyde P
til requestCode
, i aktivitetens onActivityResult
, vil vi aldri få den identiske requestCode
der. Dette til tider fører til forvirring til utbygger når debugging koden der.
D. når en aktivitet gjenopprettes fra staten (dvs. onStateInstance != null), bør det unngå å gjenskape sitt fragment.
når onActivityResult
kalles, prøvde den å hente det opprinnelige fragmentet. Dette utføres også for aktiviteten som gjenopprettes fra en drept tilstand (f.eks.
Så hvis utvikleren gjenskaper Fragmentet hver gang påopprett kalles (uansett om det er en gjenopprettet tilstand eller ikke), vil det opprinnelige Fragmentet som ble gjenopprettet bli ødelagt, og onActivityResult
av den som ringer, vil fragmentet mystisk ikke bli kalt.
Dette er en fallgruve selv for mange erfarne utviklere og app utgitt i feltet, da det er veldig vanskelig å en identifisert feil (siden det ikke skjer hver gang, og krever en mer kompleks flyt for å utløse).
Takk for at du leser…