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

我有一个Android活动,它在onStop() finish()里面调用finish() ,所以当我切换到其他活动(包括主菜单)时,活动将被关闭。 在这一点上,一切都按预期工作。

但是,当我再次运行应用程序时(有时,并非总是如此),我注意到应用程序使用与之前相同的PID运行,并再次调用onCreate() 。 我没有看到对onRestart()任何调用,所以我假设onCreate()调用是在onStop()之后直接执行的,这违反了活动生命周期 。 当应用程序使用新的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. 

问题是,在第二次运行onStart()之后有一个onDestroy() 。 我的活动基本上是Vuforia / QCAR活动的子类,它也是Unity活动的子类。 因此,在我的onDestroy() ,我调用了超类’( super.onDestroy() ),并且对于我覆盖的其他方法也是如此。

如果我查看Unity和Vuforia / QCAR Android库(我很好奇,所以我反编译它们 – 是的,这可能不对),在Unity的onDestroy() ,Unity试图杀死它自己的进程(这是应用程序进程) 。

 Process.killProcess(Process.myPid()); 

所以,当发生这种情况时,我的应用程序再次关闭。 如果第二次运行使用不同的进程,则不会发生奇怪的onDestroy()

我也尝试过noHistory方法。 但同样的事情仍然发生:(当第二次运行使用相同的过程时,会出现一个晚期的onDestroy() ,然后该进程被Unity杀死。

假设新活动必须在新流程中运行,您就会犯一个可以理解但却很严重的错误。 在Android上实际上并非如此 – 您可以让一个新活动实例的onCreate()发生在托管早期活动实例后一直存在的进程中。

这可以使任何对于进程而言是静态的(特别是,但不仅仅是在本机代码中)令人费解地不可靠。

因为正在启动的活动是新活动,所以它不会收到onRestart() – 只有在重新启动现有活动时才会发生。

为什么不在活动的清单条目上设置noHistory="true" ? 然后您不必担心在onStop()中手动完成活动。

在http://developer.android.com/guide/topics/manifest/activity-element.html中搜索noHistory

或者,也可以在startActivity() intent中设置FLAG_ACTIVITY_NO_HISTORYhttp://developer.android.com/reference/android/content/Intent.html#FLAG%5FACTIVITY%5FNO%5FHISTORY

在链接的文档中, onDestroy的描述是:

在您的活动被销毁之前收到的最后一个电话。 这可能是因为活动正在完成(有人在其上调用finish() ,或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。

onStop是:

当活动不再对用户可见时调用,因为另一个活动已恢复并且正在覆盖此活动。 这可能是因为正在开始新活动,现有活动被带到这个活动之前,或者这个活动正在被销毁。 如果此活动返回与用户交互,则返回onRestart();如果此活动消失,则返回onDestroy()。

这意味着finish()调用onDestroy而不是onStop,因此当重新启动活动时,必须调用onCreate ,因为在onStop内调用finish()将强制onDestroy运行。

我遇到了类似的行为:在onCreate / onStart / onResume之后奇怪地调用onDestroy,当活动开始时。 我没有明确的确认,但我的感觉是onDestroy调用对应于之前的活动,而不是新活动。 但由于某种原因,它的执行被延迟,直到再次重新激活该过程(开始新活动时)。

我相信这是因为从onStop调用“finish()”。 我在日志中注意到活动管理器抱怨报告的活动停止,但不再停止(它实际上正在完成)。 所以我想知道这是否会影响我的活动所在的活动经理的状态。

在您的情况下,最终结果是由于onDestroy调用而导致整个进程被终止。 当您的新活动以与上一个活动相同的流程启动时,您的应用会立即退出。