android - onStop() 中的 finish() 之后的 onCreate()

标签 android android-activity unity3d qcar-sdk

我有一个在 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/

相关文章:

无需在 androidmanifest.xml 中注册的 android Activity

c# - 使用 Graph API c# unity3d 访问 facebook 的帖子等

c# - Unity3d:通过GetComponent错误从另一个脚本访问类

c# - 如何使用代码在 Unity 中切换复选框?

android - 生命周期和 Activity 栈

android - 如何以编程方式设置 SharedPreferences 的默认值?

android - Cardview角落背景不透明

android - managedQuery() vs context.getContentResolver.query() vs android.provider.something.query()

php - android、php、mysql之间通讯失败

android - 将模型对象传递给另一个 Activity