2011-12-29 11 views
9

Jestem zdezorientowany o Activity.onDestroy(). Muszę uwolnić trochę zasobów, gdy moja Aktywność zostanie zniszczona, ale wygląda na to, że onDestroy() jest wywoływany właśnie wtedy, gdy naciskam klawisz "Wstecz", ale nie wtedy, gdy moja Aktywność zostaje zabita przez Dalvika. Testowałem go po prostu dodając dzienniku: Android: Activity.onDestroy() nie jest wywoływany, gdy Dalvik zabija tę aktywność

Log.v("my_tag", "onDestroy() called");

i tym samym w onCreate() metoda

też:

Log.v("my_tag", "onCreate() called");

potem rozpocząć mojej działalności, i widzę w logach: onCreate() called. I naciśnij „Wstecz” klucz, a następnie ponownie rozpocząć działalność, to widzę:

onDestroy() called 
onCreate() called 

potem nacisnąć przycisk „Start” i przejdź do mojej działalności ponownie loguje się nie zmienia. W porządku tutaj.

Następnie ponownie wciskam klawisz "Home" i uruchamiam naprawdę "ciężkie" aplikacje. W dziennikach nie ma nic na temat onDestroy(), ale kiedy ponownie uruchomię moją aktywność, widzę w dziennikach: onCreate() called! Tak więc onDestroy() nie został wywołany, ale moja Aktywność została zabita. Co jest nie tak?

+1

+1 - dla twojego badania .. –

Odpowiedz

8

Z dokumentacji onDestroy():

[..] Istnieją sytuacje, w których system będzie po prostu zabijają proces hosting działalności bez wywołanie tej metody (lub jakiekolwiek inne), więc nie powinno używaj go do robienia rzeczy, które mają pozostać w pobliżu po zakończeniu procesu.

W systemie Android nie można uzyskać gwarantowanej onDestroy() połączenia.
Jeśli chcesz zwolnić niektóre zasoby, powinieneś to zrobić w onPause().

+0

Hmm, dzięki. W dokumentach napisano również: "Całe życie działania odbywa się między pierwszym wywołaniem onCreate (Bundle), a drugim pojedynczym wywołaniem onDestroy()", więc pomyślałem, że powinno to być tak czy inaczej. Cóż, więc gdzie powinienem uwolnić zasoby, aby się upewnić, że zostanie nazwany? Właściwie to 'Activity' wiąże' Service' i chcę go rozpiąć, zanim aktywność zostanie zniszczona. –

+0

Och, przepraszam, widzę, że już powiedziałeś: powinienem to zrobić w 'onPause()'. Dzięki jeszcze raz. –

Powiązane problemy