1

我的 android 应用程序有两个活动:用 Java 编写的前端和 NativeActivity 游戏。我使用 Android NDK 示例 (samples\native-activity\jni\main.c) 作为参考来为游戏创建主 C++ 模块。当用户想从游戏返回到前端时,我调用ANativeActivity_finish(g_state->activity). 之后我观察到的情况如下:

  1. APP_CMD_TERM_WINDOW进入engine_handle_cmd回调
  2. 我通过调用做出反应engine_term_display(就像示例一样)
  3. 出现前端活动。我可以按“播放”按钮再次启动游戏,但我一直在等待......
  4. APP_CMD_STOP进入engine_handle_cmd回调
  5. APP_CMD_DESTROY进入engine_handle_cmd回调
  6. if (state->destroyRequested != 0)在 main.cpp 的主循环中触发
  7. 就像在示例中一样,android_main返回。现在,终于可以安全地再次启动游戏了……

我想强调第 3 步和第 4 步之间的时间间隔大约是 10 秒(至少在 DEBUG 模式下)!如果我在第 3 步和第 4 步之间从 FrontEnd 重新启动游戏,它将启动“垂死”活动而不是新活动。

我不知道 APP_CMD_TERM_WINDOW 和 APP_CMD_STOP 之间发生了什么以及为什么需要这么长时间。我有另一个具有相同架构的应用程序,步骤 3 和 4 之间大约需要 0.3 秒。也许 GC 在第一个应用程序中还有更多工作要做......我不知道。所以我的问题是:

  1. NativeActivity 需要这么长时间才能完成它的完成过程是正常的吗?
  2. 当用户从 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 步之间。

谷歌搜索后,我发现这条消息被认为是“非危险的”,但也许它可以解释什么?

4

1 回答 1

0

原因是我的 FrontEnd 活动处于无限循环中,正在监听 GlobalLayout。它不是 ANR,但它给 UI 线程带来了沉重的负担。这导致Android等待大约。10 秒完成我的游戏活动。

于 2013-05-29T16:39:39.753 回答