我有一个Android活动,在finish()
内调用onStop()
,所以当我切换到其他活动(包括主菜单)时,活动将被关闭。在这一点上,一切都按预期工作。
然而,当我再次运行应用程序时(有时,并非总是如此),我注意到应用程序使用与之前相同的PID运行,并再次调用onCreate()
。我没有看到对onRestart()
的任何调用,因此我认为onCreate()
调用是在onStop()
后直接执行的,这违反了activity lifecyce。当应用程序使用新的PID时,我可以理解为什么调用onCreate()
,这是因为这是活动的开始。
有人知道为什么会这样吗?
关于我正在开发的应用程序:这是一个Unity + Vuforia + Android应用程序。我创建了一个自定义活动,因为我需要在Android(而不是Unity)上创建本机UI。
我发现在Android项目中报告了类似的问题:http://code.google.com/p/android/issues/detail?id=15331但我不确定原因是否相同。
更新:根据我在日志中看到的内容,finish()
来电后,onDestroy()
没有来电。但是,如果我提到的问题发生(活动是使用相同的流程启动的),则会在活动开始时调用onDestroy()
。
更新:对于延迟更新感到抱歉。这里我展示了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()
),并且对我覆盖的其他方法也是如此。
如果我查看Unity和Vuforia / QCAR Android库(我很好奇,所以我反编译它们 - 是的,这可能不对),在Unity的onDestroy()
内,Unity试图杀死它自己的进程(是申请程序)。
Process.killProcess(Process.myPid());
所以,当发生这种情况时,我的应用程序再次关闭。如果第二次运行使用不同的进程,则不会发生奇怪的onDestroy()
。
我也尝试过noHistory方法。但同样的事情仍然发生:(当第二次运行使用相同的过程时,将出现一个晚onDestroy()
,然后该过程被Unity杀死。
答案 0 :(得分:12)
在假设新活动必须在新流程中运行时,您会犯一个可理解但严重的错误。在Android上实际上并非如此 - 您可以在托管早期活动实例后保留的进程中发生新活动实例的onCreate()。
这可以使任何与进程相关的静态内容(特别是,但不仅仅是在本机代码中)令人费解地不可靠。
由于正在启动的活动是新活动,因此它不会收到onRestart() - 只有在重新启动现有活动时才会发生。
答案 1 :(得分:5)
为什么不在活动的清单条目上设置noHistory="true"
?然后您不必担心在onStop()中手动完成活动。
在http://developer.android.com/guide/topics/manifest/activity-element.html
中搜索noHistory或者,也可以在FLAG_ACTIVITY_NO_HISTORY
意图中设置startActivity()
。 http://developer.android.com/reference/android/content/Intent.html#FLAG%5FACTIVITY%5FNO%5FHISTORY
答案 2 :(得分:3)
在链接的文档中,onDestroy
的说明是:
在您的活动被销毁之前收到的最后一个电话。这个可以 之所以发生,是因为活动正在结束(有人叫 完成()就可以了,或者因为系统正在暂时销毁它 节省空间的活动实例。你可以区分 这两个场景使用isFinishing()方法。
虽然onStop
是:
当活动不再对用户可见时调用,因为 另一项活动已经恢复并涵盖了这一项。这可能 发生的原因是因为正在开始新活动,现有活动 被带到这一个面前,或者这个被摧毁。 如果此活动返回,则跟随onRestart() 如果此活动消失,则与用户或onDestroy()进行交互。
这意味着finish()
调用onDestroy
而不是onStop,因此当重新启动活动时,必须调用onCreate
,因为您在finish()
内调用了onStop
将迫使onDestroy
运行。
答案 3 :(得分:0)
我遇到了类似的行为:onCtroy在onCreate / onStart / onResume之后奇怪地调用,当活动开始时。我没有明确的确认,但我的感觉是onDestroy调用对应于之前的活动,而不是新活动。但由于某种原因,它的执行被延迟,直到再次重新激活该过程(开始新活动时)。
我相信这是因为他们打电话给#34;完成()"来自onStop。我在日志中注意到,活动经理抱怨报告的活动停止,但不再停止(它实际上正在完成)。因此,我想知道这是否会影响我的活动所在的活动经理的状态。
在您的情况下,最终结果是由于onDestroy调用而导致整个进程被终止。当您的新活动在与上一个活动相同的过程中启动时,您的应用会立即退出。