我有一个在 onStop()
中调用 finish()
的 Android Activity ,所以当我切换到其他 Activity (包括主菜单)时,该 Activity 将是关闭。至此,一切都按预期进行。
但是,当我再次运行该应用程序时,(有时,并非总是)我注意到该应用程序使用与之前相同的 PID 运行,并再次调用 onCreate()
。我没有看到对 onRestart()
的任何调用,所以我假设 onCreate()
调用是在 onStop()
之后直接执行的,这是违反activity lifecyce的东西.当应用程序使用新的 PID 时,我可以理解为什么调用 onCreate()
,因为这是 Activity 的开始。
有人知道为什么会这样吗?
关于我正在开发的应用程序的一些信息:这是一个 Unity + Vuforia + Android 应用程序。我创建了一个自定义 Activity ,因为我需要在 Android(而不是从 Unity)上创建一个原生 UI。
我在 Android 项目中发现了类似的问题:http://code.google.com/p/android/issues/detail?id=15331但我不确定原因是否相同。
更新:根据我从日志中看到的,在调用finish()
之后,没有调用onDestroy()
。但是,如果发生我提到的问题( Activity 使用相同的进程启动),则会在 Activity 开始时调用 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()
。我的 Activity 基本上是 Vuforia/QCAR Activity 的子类,它也是 Unity Activity 的子类。因此,在我的 onDestroy()
中,我调用了父类(super class) (super.onDestroy()
) 并且我重写的其他方法也是如此。
如果我查看 Unity 和 Vuforia/QCAR Android 库(我很好奇,所以我反编译了它们——是的,这可能不对),在 Unity 的 onDestroy()
中,Unity 试图杀死它自己的进程(即应用程序进程)。
Process.killProcess(Process.myPid());
因此,当发生这种情况时,我的应用程序再次关闭。如果第二次运行使用不同的进程,那么奇怪的 onDestroy()
就不会发生。
我也尝试过 noHistory 方法。但是同样的事情仍然发生:(当第二次运行使用相同的进程时,会出现一个迟到的onDestroy()
,然后进程被Unity杀死。
最佳答案
假设新 Activity 必须在新流程中运行,您犯了一个可以理解但严重的错误。在 android 上实际上不是这种情况——您可以让新 Activity 实例的 onCreate() 发生在托管早期 Activity 实例后一直保留的进程中。
这会使任何关于进程的静态内容(尤其是,尽管不完全是 native 代码)令人费解地不可靠。
因为正在启动的 Activity 是一个新 Activity ,所以它不会收到 onRestart() - 只有当您重新启动现有 Activity 时才会发生这种情况。
关于android - onStop() 中的 finish() 之后的 onCreate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11099178/