У меня есть активность Android, которая вызывает finish()
внутри него onStop()
, поэтому, когда я переключаюсь на другие действия (включая главное меню), активность будет отключена. В этом случае все работает так, как ожидалось.
Однако, когда я снова запускаю приложение (иногда, не всегда), я замечаю, что приложение запускается с использованием того же PID, что и предыдущее, и снова вызывает onCreate()
. Я не видел никакого вызова onRestart()
, поэтому я предполагаю, что вызов onCreate()
выполняется сразу после onStop()
, что является нарушением действия lifecyce. Когда приложение использует новый PID, я могу понять, почему вызывается onCreate()
, потому что это начало активности.
Кто-нибудь знает, почему это происходит?
Немного о приложении, которое я разрабатываю: это приложение Unity + Vuforia + Android. Я создаю пользовательскую активность, потому что мне нужно создать собственный пользовательский интерфейс на Android (вместо Unity).
Я нашел аналогичную проблему в проекте Android: http://code.google.com/p/android/issues/detail?id=15331, но я не уверен, что причина такая же или нет.
update. Из того, что я вижу из журнала, после вызова finish()
нет вызова onDestroy()
. Однако, если проблема, о которой я упоминал, происходит (действие запускается с использованием того же процесса), есть вызов onDestroy()
в начале действия.
update. Извините за последнее обновление. Здесь я показываю выдержку 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 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.
Проблема в том, что во втором прогоне существует onDestroy()
после onStart()
. Моя деятельность в основном является подклассом деятельности Vuforia/QCAR, которая также является подклассом деятельности Unity. Итак, внутри my onDestroy()
я делаю вызов суперкласса '(super.onDestroy()
), а также тот же для других методов, которые я переопределяю.
Если бы я посмотрел библиотеку Android Unity и Vuforia/QCAR (мне было любопытно, поэтому я декомпилировал их - да, это может быть неправильно), внутри Unity onDestroy()
Unity пытается убить свой собственный процесс (который является процесс приложения).
Process.killProcess(Process.myPid());
Итак, когда это произойдет, мое приложение снова выключится. Если во втором прогоне используется другой процесс, этого странного onDestroy()
не происходит.
Я также пробовал метод noHistory. Но то же самое все еще происходит:( Когда во втором прогоне используется тот же процесс, появится более поздний onDestroy()
, а затем процесс уничтожается Unity.