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() - 只有在重新启动现有活动时才会发生.
为什么不直接设置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
在您链接的文档中,描述onDestroy
是:
您的活动被销毁之前收到的最后一个电话。发生这种情况的原因可能是活动即将完成(有人对其调用 finish(),也可能是因为系统暂时销毁活动的此实例以节省空间。您可以使用 isFinishing() 方法区分这两种情况。
而 foronStop
是:
当该 Activity 对用户不再可见时调用,因为另一个 Activity 已恢复并覆盖了该 Activity。发生这种情况的原因可能是正在启动一项新活动、将现有活动置于当前活动之前,或者正在销毁该活动。如果此 Activity 返回与用户交互,则后跟 onRestart();如果此 Activity 将消失,则后跟 onDestroy()。
这意味着finish()
调用onDestroy
不是 onStop,因此当活动重新启动时,onCreate
必须调用,因为您对finish()
内部的调用onStop
将强制onDestroy
运行。