У меня есть активность Android, которая вызывает finish()
внутри нее onStop()
, поэтому, когда я переключаюсь на другие действия (включая главное меню), действие будет закрыто. До этого момента все работает так, как ожидалось.
Однако, когда я снова запускаю приложение (иногда, не всегда), я замечаю, что приложение работает с тем же PID, что и предыдущее, и снова вызывает onCreate()
. Я не видел никакого вызова onRestart()
, поэтому я предполагаю, что вызов onCreate()
выполняется сразу после onStop()
, что нарушает жизненный цикл активности. Когда приложение использует новый 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'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.
Проблема в том, что во втором запуске есть onDestroy()
после onStart()
. Моя активность в основном является подклассом активности Vuforia/QCAR, которая также является подклассом активности Unity. Итак, внутри моего onDestroy()
я вызываю суперкласс ( super.onDestroy()
), а также то же самое для других методов, которые я переопределяю.
Если я посмотрел на Android-библиотеку Unity и Vuforia/QCAR (мне было любопытно, поэтому я их декомпилировал — да, это может быть неправильно), внутри Unity onDestroy()
Unity пытается убить свою собственный процесс (который является процессом приложения).
Process.killProcess(Process.myPid());
Итак, когда это происходит, мое приложение снова закрывается. Если второй запуск использует другой процесс, этого странного onDestroy()
не происходит.
Я также попробовал метод noHistory. Но то же самое все еще происходит :( Когда второй запуск использует тот же процесс, появится поздний onDestroy()
, а затем процесс будет уничтожен Unity.