Mam aktywność Androida, która wywołuje finish()
wewnątrz jej numeru onStop()
, więc po przełączeniu się na inne czynności (w tym menu główne) działanie zostanie zamknięte. W tym momencie wszystko działa zgodnie z oczekiwaniami.onCreate() po zakończeniu() w onStop()
Jednak po ponownym uruchomieniu aplikacji (czasami nie zawsze) zauważam, że aplikacja działa z tym samym identyfikatorem PID co poprzedni i ponownie wywołuje onCreate()
. Nie widzę żadnego połączenia z numerem onRestart()
, więc zakładam, że wywołanie onCreate()
jest wykonywane bezpośrednio po onStop()
, co jest niezgodne z activity lifecyce. Gdy aplikacja używa nowego PID, mogę zrozumieć, dlaczego jest wywoływana onCreate()
, ponieważ jest to początek działania.
Ktoś wie, dlaczego tak się stało?
Trochę o aplikacji, którą tworzę: Jest to aplikacja Unity + Vuforia + Android. Tworzę niestandardową aktywność, ponieważ muszę utworzyć macierzysty interfejs na Androida (zamiast z Unity).
Znalazłem podobny problem zgłoszony do projektu Android: http://code.google.com/p/android/issues/detail?id=15331, ale nie jestem pewien, czy przyczyna jest taka sama, czy nie.
aktualizacja: Z tego, co widzę z dziennika, po wywołaniu finish()
, nie ma wezwanie do onDestroy()
. Jeśli jednak pojawi się problem, o którym wspomniałem (aktywność jest uruchamiana przy użyciu tego samego procesu), na początku działania jest wywołanie onDestroy()
.
aktualizacja: Przepraszamy za późną aktualizację. Tutaj pokazuję fragment logcat.
## First run
I/ActivityManager( 265): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=the.app/the.app.UnityAriusActivity bnds=[238,115][351,273] } from pid 423
I/ActivityManager( 265): Start proc the.app for activity the.app/the.app.UnityAriusActivity: pid=1686 uid=10013 gids={3003, 1006, 1015}
D/arius (1686): UnityAriusActivity: onStart
D/arius (1686): UnityAriusActivity: onResume
## Home button is pressed
I/ActivityManager( 265): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.sonyericsson.home/.HomeActivity } from pid 265
D/arius (1686): UnityAriusActivity: onPause
D/arius (1686): UnityAriusActivity: onStop
## Second run
I/ActivityManager( 265): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=the.app/the.app.UnityAriusActivity bnds=[238,115][351,273] } from pid 423
## Same process, onStart is called again
D/arius (1686): UnityAriusActivity: onStart
D/arius (1686): UnityAriusActivity: onResume
I/ActivityManager( 265): Displayed the.app/the.app.UnityAriusActivity: +500ms
D/Unity (1686): Creating OpenGL ES 2.0 context (RGB16 565 16/0)
W/IInputConnectionWrapper( 423): showStatusIcon on inactive InputConnection
I/QCAR (1686): onSurfaceCreated
## Strangely, there's an onDestroy here
D/arius (1686): UnityAriusActivity: onDestroy
## Unity apparently kills the process from its onDestroy
I/Process (1686): Sending signal. PID: 1686 SIG: 9
I/ActivityManager( 265): Process the.app (pid 1686) has died.
Problemem jest to, że nie jest onDestroy()
po onStart()
na drugim biegu. Moja aktywność jest w zasadzie podklasą aktywności Vuforia/QCAR, która jest również podklasą działalności z Unity. Tak więc, w moim onDestroy()
, nawiązuję połączenie z nadklasą "(super.onDestroy()
) i tym samym dla innych metod, które nadpisuję.
Gdybym spojrzał na bibliotekę Unity i Vuforia/QCAR Android (byłem ciekawy, więc je zdekompilowałem - tak, to może nie być w porządku), wewnątrz Unity onDestroy()
, Unity próbuje zabić swój własny proces (który jest aplikacją proces).
Process.killProcess(Process.myPid());
Kiedy to nastąpi, moja aplikacja ponownie się wyłączy. Jeśli drugi proces używa innego procesu, to nie dzieje się tak dziwnie.
Próbowałem również podejście nieHistory. . Ale wciąż to samo dzieje :(Kiedy drugi bieg wykorzystuje ten sam proces, późne onDestroy()
pojawi, a następnie proces jest zabić przez Unity
Muszę również wywołać 'finish()', gdy użytkownik naciśnie przycisk home. Właśnie dlatego wywołuję go z 'onStop()'. – fajran
Każde wywołanie metody finish() wymusi na Utwórz ponownie, ponieważ spowoduje to zniszczenie działania –
. Na czym dokładnie polega problem? Że onDestroy() nie jest wywoływany? Lub, że to się nazywa?Wydaje się, że cykl życia aktywności wymaga obsługi obu możliwości. –