2013-05-29 77 views
1

我的android應用程序有兩個活動:用Java和GameActivity編寫的FrontEnd,它是NativeActivity。我使用Android NDK示例(samples \ native-activity \ jni \ main.c)作爲創建遊戲的主要C++模塊的參考。當用戶想從遊戲返回到FrontEnd時,我打電話ANativeActivity_finish(g_state->activity)。我之後觀察如下:從本機活動返回的android需要太長時間

  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

之間活動空閒超時已經一派,我發現這條消息被認爲是「非危險的」,但也許它可以解釋任何事情?

回答

0

原因是我的FrontEnd活動在監聽GlobalLayout的無限循環中。它不是ANR,但是它給UI線程帶來了很大的負擔。這導致Android等待約。 10秒完成我的遊戲活動。