11

finish()我有一个在其中调用的 Android 活动,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(). 但是,如果我提到的问题发生(活动使用相同的流程启动),则在活动开始时会调用 to 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.

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

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

Process.killProcess(Process.myPid());

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

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

4

4 回答 4

12

您在假设新活动必须在新流程中运行时犯了一个可以理解但严重的错误。在 android 上实际上并非如此 - 您可以让新活动实例的 onCreate() 发生在托管早期活动实例后一直保留的进程中。

这可能会使任何与进程相关的静态内容(特别是,但不仅限于本机代码)令人费解地不可靠。

因为正在启动的活动是一个新活动,所以它不会收到 onRestart() - 只有当您重新启动现有活动时才会发生这种情况。

于 2012-06-21T15:18:42.460 回答
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

于 2012-06-21T19:15:14.377 回答
3

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

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

而对于onStop是:

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

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

于 2012-06-21T15:13:07.310 回答
0

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

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

在您的情况下,由于 onDestroy 调用,最终结果是整个进程被终止。由于您的新活动是在与前一个活动相同的过程中启动的,因此您的应用程序会立即退出。

于 2016-02-05T22:29:36.363 回答