2012-04-25 20 views
12

Mam aplikację z dwoma działaniami: "A" i "B".onDestroy() podczas "czekania" na onActivityResult()

"A" używa startActivityForResult() do odrodzenia się "B", tj. Czeka na "B". Teraz załóżmy, że "B" jest na pierwszym planie. Czy system Android może zniszczyć aktywność "A" bez niszczenia "B"? (Jeśli tak, to kiedy "B" zostanie zakończone, np. Po wprowadzeniu danych przez użytkownika, aktywność "A" musi zostać odtworzona i ponownie przeniesiona na pierwszy plan przez system Android, i muszę pamiętać i przywrócić "A" do wcześniejszego stanu interfejsu użytkownika.)

Zauważ, że nie mówię o procesie zabić (co jest różnym przypadkiem: jeśli proces zostanie zabity, wszystkie działania są zabijane, a onDestroy() nie jest wywoływany lub nie gwarantuje się, że zostanie wywołany). Pytanie dotyczy jedynie tego, czy funkcja onDestroy() jest możliwa podczas oczekiwania na wynik subaktywności.

Odpowiedz

12

Jeśli aktywność na ginie przez czas B kończy, masz gwarancję, że

  1. będzie zostać utworzony ponownie.
  2. A będzie dostarczyć wynik.

Innymi słowy, A zostanie odtworzone następnym razem, gdy użytkownik odwiedza/potrzebuje go, i w tym momencie zostaną dostarczone wszystkie oczekujące wyniki (od B do A).

Należy również pamiętać, że z tego powodu wyniki muszą być zwracane za pośrednictwem pojedynczego wywołania zwrotnego Activity z całkowitym kodem żądania, zamiast dowolnego obiektu wywołania zwrotnego.

+0

Dzięki, dokładnie tak też myślałem, _provided_ a onDestroy może się zdarzyć. Więc mówisz, że może się zdarzyć "A". W tym przypadku jednak "A" uruchomi się ponownie, tzn. Otrzymam również onCreate() (a następnie, jak mówią doktorzy, otrzymuję wynik przed onResume()), więc muszę przywrócić wcześniejszy stan interfejsu użytkownika "A" ", dobrze? Mam na myśli, że "B" jest uruchamiane w określonym podmenu "A", więc użytkownik oczekuje, że stan interfejsu użytkownika "A" jest taki sam, gdy "B" kończy się tak, jak było, gdy uruchomiono "B". (Tzn. "A" jest w tym samym podmenu, jak gdy "B" zostało uruchomione.) Jeśli tak, muszę zachować stan interfejsu użytkownika "A" _a dobrze_ zanim pojawi się "B". –

+0

Popraw mnie, jeśli źle interpretuję twoje pytanie, ale wygląda na to, że zadajesz bardziej ogólne pytanie o cykl życia Aktywności, który nie ma nic wspólnego z 'startActivityForResult'. Masz gwarancję, że wynik zostanie przekazany z B na A (niezależnie od tego, czy A zostanie zniszczony, czy nie), ale to nie znaczy, że stan Aktywności jest zachowany. Jeśli został wywołany 'onDestroy', możesz przywrócić jego stan, gdy zostanie on ponownie utworzony w' onRestoreInstanceState' (lub 'onResume'), tak jak w przypadku każdego innego działania, które napotkasz. –

+0

Mam nadzieję, że te dwa punkty sprawią, że będzie to bardziej zrozumiałe: 1. Ma to związek z startActivityForResult, ponieważ nie mogłem być pewien, czy ustawi dodatkowe ograniczenie, np. Podczas gdy _in ogólne "A" może zostać zniszczone, być może nie jest " t tak, jeśli oczekuje na wynik z "B". (Tj. W takim przypadku "najgorszym", jaki może uzyskać, jest onStop()). Ale, na podstawie Twojej odpowiedzi, w tym przypadku może również dojść do zniszczenia "B". (Oczywiście w przypadku działań w różnych procesach oczywiste jest, że niezależne niszczenie jest możliwe, ale w moim przypadku są one w tej samej aplikacji/procesie). –