在onStop()中的finish()之后的onCreate()

时间:2012-06-19 10:34:18

标签: android android-activity unity3d qcar-sdk

我有一个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杀死。

4 个答案:

答案 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调用而导致整个进程被终止。当您的新活动在与上一个活动相同的过程中启动时,您的应用会立即退出。