我有一个 Android 的活动,在其 onStop()
方法内调用了 finish()
,这样当我切换到其他活动(包括主菜单)时,该活动将会关闭。到此为止,一切都按预期工作。
但是,当我再次运行应用程序时,(有时,不总是)我注意到应用程序使用与之前相同的 PID 运行,并且它再次调用了 onCreate()
。我没有看到任何对 onRestart()
的调用,因此我假设 onCreate()
调用是在 onStop()
之后直接执行的,这违反了活动生命周期的规定。当应用程序使用新的 PID 时,我可以理解为什么会调用 onCreate()
,因为这是活动的开始。
有人知道这是为什么吗?
关于我正在开发的应用程序:这是一个 Unity + Vuforia + Android 应用程序。我创建了一个自定义活动,因为我需要在 Android 上创建本地 UI(而不是使用 Unity 创建)。
我在 Android 项目中发现了一个类似的问题:http://code.google.com/p/android/issues/detail?id=15331,但我不确定原因是否相同。
更新:从日志中看到,在 finish()
调用之后,并没有调用 onDestroy()
。但是,如果发生了我提到的问题(该活动使用相同的进程启动),则会在活动开始时调用 onDestroy()
。
更新:很抱歉更新晚了。这里展示了日志的一部分。
## 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.
问题在于第二次运行时,在 onStart()
之后有一个 onDestroy()
。我的活动基本上是 Vuforia/QCAR 活动的子类,这也是从 Unity 的活动中继承而来的。所以,在我的 onDestroy()
中,我调用了超类的方法(super.onDestroy()
),并对其他我重写的方法也是同样的处理。如果我查看 Unity 和 Vuforia/QCAR Android 库(我很好奇所以我对它们进行了反编译 - 是的,这可能不正确),在 Unity 的
onDestroy()
中,Unity 尝试杀死它自己的进程(即应用程序进程)。Process.killProcess(Process.myPid());
所以,当这种情况发生时,我的应用程序再次崩溃。如果第二次运行使用了不同的进程,则奇怪的onDestroy()
不会发生。
我还尝试了noHistory方法。但是同样的事情仍然发生:(当第二次运行使用相同的进程时,会出现迟到的onDestroy()
,然后进程被Unity杀死。
finish()
。这就是为什么我从onStop()
中调用它的原因。 - fajranandroid:launchMode="singleInstance"
或尝试使用singleTask
。 - MKJParekh