Возврат Android из родной деятельности занимает слишком много времени

В моем приложении для Android есть два действия: FrontEnd, написанный на Java, и Game, которая называется NativeActivity. Я использовал пример Android NDK (samples\native-activity\jni\main.c) в качестве ссылки для создания основного модуля C++ для Игры. Когда пользователь хочет вернуться из игры в FrontEnd, я звоню ANativeActivity_finish(g_state->activity), После этого я наблюдаю следующее:

  1. APP_CMD_TERM_WINDOW приходит в engine_handle_cmd Перезвоните
  2. Я реагирую звонком engine_term_display (так же, как образец)
  3. FrontEnd активность появляется. И я могу нажать кнопку "Play", чтобы снова запустить игру, но я продолжаю ждать....
  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 составляет около десяти секунд (по крайней мере, в режиме отладки)! И если я перезапущу игру из интерфейса между шагами 3 и 4, она запустит "умирающую" активность вместо новой.

Я не знаю, что происходит между APP_CMD_TERM_WINDOW и APP_CMD_STOP и почему это занимает так много времени. У меня есть другое приложение с той же архитектурой, и оно занимает около 0,3 с между шагами 3 и 4. Может быть, 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.

Погуглив, я обнаружил, что это сообщение считается "неопасным", но, может быть, оно может что-нибудь объяснить?

1 ответ

Решение

Причиной было то, что моя активность FrontEnd была в бесконечном цикле прослушивания GlobalLayout. Это не ANR, но он сильно загружает поток пользовательского интерфейса. Это заставило Android ждать прибл. 10 секунд заканчивая мою игровую активность.

Другие вопросы по тегам