我的 android 应用程序有两个活动:用 Java 编写的前端和 NativeActivity 游戏。我使用 Android NDK 示例 (samples\native-activity\jni\main.c) 作为参考来为游戏创建主 C++ 模块。当用户想从游戏返回到前端时,我调用ANativeActivity_finish(g_state->activity)
. 之后我观察到的情况如下:
APP_CMD_TERM_WINDOW
进入engine_handle_cmd
回调- 我通过调用做出反应
engine_term_display
(就像示例一样) - 出现前端活动。我可以按“播放”按钮再次启动游戏,但我一直在等待......
APP_CMD_STOP
进入engine_handle_cmd
回调APP_CMD_DESTROY
进入engine_handle_cmd
回调if (state->destroyRequested != 0)
在 main.cpp 的主循环中触发- 就像在示例中一样,
android_main
返回。现在,终于可以安全地再次启动游戏了……
我想强调第 3 步和第 4 步之间的时间间隔大约是 10 秒(至少在 DEBUG 模式下)!如果我在第 3 步和第 4 步之间从 FrontEnd 重新启动游戏,它将启动“垂死”活动而不是新活动。
我不知道 APP_CMD_TERM_WINDOW 和 APP_CMD_STOP 之间发生了什么以及为什么需要这么长时间。我有另一个具有相同架构的应用程序,步骤 3 和 4 之间大约需要 0.3 秒。也许 GC 在第一个应用程序中还有更多工作要做......我不知道。所以我的问题是:
- NativeActivity 需要这么长时间才能完成它的完成过程是正常的吗?
- 当用户从 FrontEnd 重新启动游戏时,我如何防止遇到垂死的活动?
更新
我进入 LogCat:
05-29 18:27:17.729: W/ActivityManager(476): 启动超时已过期,放弃唤醒锁!05-29 18:27:17.739: W/ActivityManager(476): ActivityRecord{4209b2d0 u0 blah.blah.MainActivity} 的活动空闲超时
就在第 3 步和第 4 步之间。
谷歌搜索后,我发现这条消息被认为是“非危险的”,但也许它可以解释什么?