Возврат Android из родной деятельности занимает слишком много времени
В моем приложении для Android есть два действия: FrontEnd, написанный на Java, и Game, которая называется NativeActivity. Я использовал пример Android NDK (samples\native-activity\jni\main.c) в качестве ссылки для создания основного модуля C++ для Игры. Когда пользователь хочет вернуться из игры в FrontEnd, я звоню ANativeActivity_finish(g_state->activity)
, После этого я наблюдаю следующее:
APP_CMD_TERM_WINDOW
приходит вengine_handle_cmd
Перезвоните- Я реагирую звонком
engine_term_display
(так же, как образец) - FrontEnd активность появляется. И я могу нажать кнопку "Play", чтобы снова запустить игру, но я продолжаю ждать....
APP_CMD_STOP
приходит вengine_handle_cmd
ПерезвонитеAPP_CMD_DESTROY
приходит вengine_handle_cmd
Перезвонитеif (state->destroyRequested != 0)
срабатывает в главном цикле main.cpp- Как в примере,
android_main
возвращается. Теперь, наконец, можно снова запустить игру...
Я хочу подчеркнуть, что временной интервал между шагами 3 и 4 составляет около десяти секунд (по крайней мере, в режиме отладки)! И если я перезапущу игру из интерфейса между шагами 3 и 4, она запустит "умирающую" активность вместо новой.
Я не знаю, что происходит между APP_CMD_TERM_WINDOW и APP_CMD_STOP и почему это занимает так много времени. У меня есть другое приложение с той же архитектурой, и оно занимает около 0,3 с между шагами 3 и 4. Может быть, 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.
Погуглив, я обнаружил, что это сообщение считается "неопасным", но, может быть, оно может что-нибудь объяснить?
1 ответ
Причиной было то, что моя активность FrontEnd была в бесконечном цикле прослушивания GlobalLayout. Это не ANR, но он сильно загружает поток пользовательского интерфейса. Это заставило Android ждать прибл. 10 секунд заканчивая мою игровую активность.