2011-06-24 31 views
82

Czy ktoś może mi powiedzieć, która z nich jest nazywana jako pierwsza, czy jest to onActivityResult(), czy jest to onResume()? przykład:onActivityResult() i onResume()

Działanie A wywołuje startActivityForResult() rozpocząć działalność B. B wykonuje dopełnia i zwraca wynik, lecz metoda A nazywa pierwszy onActivityResult() lub onResume()?

Wiem, że ktoś już odpowiedział na to pytanie, odnosząc się do Activity Docs, jednak nie mogłem tam znaleźć.

Odpowiedz

106

Pierwsze połączenie onActivityResult() następnie onResume().

Cytat docs:

protected void onActivityResult (int requestCode, int ResultCode, zamiar danych)

od: API Level 1 wywoływana, gdy działalność ty rozpoczęła wyjścia, dając ty kod requestCode, który został przez Ciebie uruchomiony z, resultCode, który został zwrócony, i wszelkie dodatkowe dane z niego. Kod wynikowy będzie RESULT_CANCELED, jeśli zostanie jawnie zwrócone, że nie zwrócił żadnego wyniku ani nie spowodował awarii podczas swojej operacji. Otrzymasz tę rozmowę bezpośrednio przed onResume(), gdy twoja aktywność ponownie rozpocznie się .

+1

W tej chwili mój kod wydaje się wywoływaćActivityResult bezpośrednio przed * onRestart *: -/ –

+1

Te diagramy mogą być przydatne do zrozumienia pełnego cyklu życia aktywności i fragmentu: https: // github.com/xxv/android-lifecycle – Sergii

10

onActivityResult() nazywa się pierwszy (tylko potwierdził to z kilku wypowiedzi dziennika i zobaczyć, że onActivityResult() jest rzeczywiście wywołana przed onResume())

+2

Moje testy również potwierdzają. onResume() nazywa się AFTER onActivityResult(). –

34

Jak inni napisali, onActivityResult() jest wywoływana przed onResume() podczas swojej aktywność jest restartowana.

Diane Hackborn wyjaśnia, że ​​funkcja onActivityResult() jest wywoływana przed onResume() w celu umożliwienia otrzymywania wszystkiego, co może wpływać na interfejs użytkownika i jest dostępne przed aktualizacją interfejsu użytkownika (prawdopodobnie w celu uniknięcia podwójnej aktualizacji - raz w onResume()) bez zwracanego wyniku, a następnie w onActivityResult(), dodając zwracany wynik).

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/3epIML7fjGw

Jedną z konsekwencji jest to, że wszelkie pliki uruchamiania może zdecydowałeś się wykonać tylko w onResume() (na przykład pliki uruchamiania danych z zewnętrznego źródła, które trzeba być świeże), a nie w onCreate (), byłoby niezainicjalizowane, gdy wywołanie funkcji onActivityResult() wystąpi w ramach restartowania aplikacji, która została opróżniona z pamięci przez system operacyjny (ponieważ funkcja onResume() nie zostałaby wywołana przed funkcją onActivityResult()).

W tej sytuacji funkcja onActivityResult() musiałaby być przygotowana do wykonywania takich inicjalizacji dla dowolnych zmiennych, które są używane przez onActivityResult().

Oczywiście, jeżeli inicjalizacje potrzebne do działania onActivityResult() mogą być wykonywane w onCreate(), a nie w onResume(), wówczas metoda onCreate() zostanie wywołana przy ponownym uruchomieniu przed trybami onActivityResult() i onResume(), byłby to najłatwiejszy sposób na znalezienie rzeczy, których nie musisz robić za każdym razem, gdy aplikacja jest wznawiana. Jeśli jednak dane, które inicjujesz, pochodzą ze źródła zewnętrznego i chcesz, aby był on świeży, możesz zainicjować takie dane zarówno w trybie onCreate(), jak i onResume(), z onResume() sprawdzając flagę ustawioną w onCreate(), aby sprawdzić, czy dane właśnie zostały zainicjowane w onCreate), a następnie aktualizować je w onResume() tylko wtedy, gdy nie były. W ten sposób niektóre z nich będą zawsze dostępne (przynajmniej od czasu, kiedy aplikacja została wznowiona).

Innym sposobem radzenia sobie z tym problemem jest przechowywanie informacji zwróconych przez onActivityResult() w zmiennych, które zostaną pobrane przez onResume() i przetworzone w tym miejscu (po przeprowadzeniu jakichkolwiek wymaganych inicjalizacji przez onResume()), zamiast przetwarzanie w obrębie samego obiektu onActivityResult().

Jest to funkcja bardzo krótko udokumentowana, bez żadnych wyjaśnień ani ostrzeżeń (w oficjalnych dokumentach) dotyczących konsekwencji tego nieoczekiwanego sekwencjonowania. Bardzo łatwo jest również przeoczyć problem podczas testowania, ponieważ na urządzeniu z dużą ilością pamięci, na którym nie działa wiele aplikacji, działanie wywołujące funkcję startActivityForResult() (lub jej warianty) może nigdy nie zostać przepłukane z pamięci podczas oczekiwania na uruchomił działanie, aby zwrócić wynik przez onActivityResult(), a zatem wszystkie inicjalizacje wykonane przez onResume() będą już dostępne, a zatem problem może nie zostać wykryty.

Jest informacyjny badanie niektóre z problemów związanych z tym sekwencjonowanie (łącznie z ostrzeżeniem dotyczącym próby wykorzystania obiektu Application o aplikacji do ochrony zmienne z jej efektów), wraz z UML diagram sekwencji rysowane ręcznie, tutaj:

http://steveliles.github.com/android_activity_lifecycle_gotcha.html

-1

Jedną z konsekwencji jest to, że wszelkie pliki uruchamiania może zdecydowałeś się wykonać tylko w onResume() (na przykład pliki uruchamiania danych z zewnętrznego źródła, które trzeba być świeże) niż w onCreate(), to być niezainicjowanym, gdy wywołanie onActivityResult() występuje jako część ponownego uruchomienia aplikacji, która jak wypalony z pamięci przez system operacyjny (ponieważ onResume() nie zostałby wywołany przed onActivityResult()).

W tej sytuacji funkcja onActivityResult() musiałaby być przygotowana do wykonywania takich inicjalizacji dla dowolnych zmiennych wykorzystywanych przez funkcję onActivityResult().

Oczywiście, jeśli pliki uruchamiania potrzebne onActivityResult() można wykonać w onCreate() zamiast w onResume(), następnie od onCreate() zostanie wywołana na restart zarówno przed onActivityResult() i onResume(), że byłoby najprostszym sposobem, aby przejść do rzeczy, które cię nie musisz robić za każdym razem, gdy aplikacja jest wznawiana. Jeśli jednak dane, które inicjujesz, pochodzą ze źródła zewnętrznego i chcesz, aby było ono świeże, możesz zainicjować takie dane zarówno w onCreate(), jak i onResume(), sprawdzając flagę ustawioną w onCreate(), aby sprawdzić, czy dane zostały Właśnie został zainicjowany w onCreate(), a następnie aktualizowany w onResume() tylko wtedy, gdy nie był. W ten sposób niektóre z nich będą zawsze dostępne (przynajmniej od czasu, kiedy aplikacja została wznowiona).

Powiązane problemy