我的Android应用程序有两个活动:用Java编写的FrontEnd和用NativeActivity编写的Game。我使用Android NDK示例(samples \ native-activity \ jni \ main.c)作为参考来为游戏创建主C ++模块。当用户想要从Game返回FrontEnd时,我会拨打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之间的时间间隔大约是十秒(至少在DEBUG模式下)!如果我在第3步和第4步之间从FrontEnd重新启动游戏,它将启动“垂死”活动而不是新活动。
我不知道APP_CMD_TERM_WINDOW和APP_CMD_STOP之间发生了什么,以及为什么需要这么长时间。我有另一个具有相同架构的应用程序,在第3步和第4步之间需要大约0.3秒。也许GC在第一个应用程序中有更多的工作要做...我不知道。所以我的问题是:
更新
我进入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步之间。
用谷歌搜索,我发现这条消息被认为是“非危险的”,但它可以解释一下吗?答案 0 :(得分:0)
原因是我的FrontEnd活动是在一个无限循环中侦听GlobalLayout。它不是ANR,但它给UI线程带来了很大的负担。这导致Android等待大约。 10秒完成我的游戏活动。