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

faj*_*ran 11 android unity-game-engine android-activity qcar-sdk

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

但是,当我再次运行应用程序时(有时,并非总是如此),我注意到应用程序使用与之前相同的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.
Run Code Online (Sandbox Code Playgroud)

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

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

Process.killProcess(Process.myPid());
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*ton 12

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

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

由于正在启动的活动是新活动,因此它不会收到onRestart() - 只有在重新启动现有活动时才会发生.

  • 无法保证onDestroy()会发生,尤其是在处理过程时 - 查看Activity Lifecycle图中的killable列. (2认同)

Jos*_*osh 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


Moh*_*lah 3

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

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

而 foronStop是:

当该 Activity 对用户不再可见时调用,因为另一个 Activity 已恢复并覆盖了该 Activity。发生这种情况的原因可能是正在启动一项新活动、将现有活动置于当前活动之前,或者正在销毁该活动。如果此 Activity 返回与用户交互,则后跟 onRestart();如果此 Activity 将消失,则后跟 onDestroy()。

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