2013-09-17 6 views
4

У меня есть простое приложение с собственным кодом. То есть, собственный код Activity плюс.Жизненный цикл Android-активности и жизненный цикл кода JNI

Когда активность вводится в фоновом режиме, я сохраняю собственный код для выполнения некоторой обработки. Проблема в том, что активность убита ОС (из-за низкого ресурса), код JNI, похоже, не знает, что произошло на землях Java, и все еще выполняет свою работу, поэтому тратит ресурсы. Почему Android убивает только активность вместо всего процесса? и в этом случае, как нативный код знает, что активность была убита? OnDestroy() не может быть вызван.

ответ

2

У вас может быть несколько видов деятельности на одном Android Application. По мере того, как ваши действия уходят в прошлое, их можно убить, чтобы вернуть ресурсы. Обычно приложение хранится до тех пор, пока в телефоне не будет действительно мало памяти, или пользователь уйдет и уничтожит ваше приложение вручную. Процесс торчит до тех пор, пока приложение не будет убито, грубо говоря.

Поскольку вы можете продолжить обработку в фоновом режиме, когда ваша деятельность будет воссоздана, вы можете проверить статус глобальных переменных и, возможно, подобрать место, где вы остановились.

Имейте в виду, что действия убиты довольно часто, поэтому нет смысла делать обработку в фоновом режиме, но останавливаться, когда действие убито. Вы также можете остановиться, когда в этом случае вызывается onStop().

+0

Вы не ответили на вопрос «Почему Android убивает только активность вместо всего процесса?». Для NDK в onStop не вызываются обратные вызовы, это то, что пользователь спросил. – RelativeGames

+0

Хорошо, я обновил свой ответ, чтобы попытаться ответить на это более четко, спасибо – krsteeve

+0

У вас есть источник для «Действия, применение и только позже процесс» разрушения? У меня [всегда были проблемы с получением информации об этом] (http://stackoverflow.com/questions/8050003/details-of-android-application-components-destruction-and-recreation) (см. Ссылку CommonsWare для еще большей путаницы) – kaay

2

Activity в Android приложении описана в документации,

деятельности является единой, целенаправленной вещь, которую пользователь может сделать.

Обычно это что-то, что видно на экране и имеет внимание пользователя. Он связал с ним государственную машину, которая описывает жизненный цикл показа и скрытия при активизации другой активности. Операционная система имеет право запускать и останавливать действия, которые она выполняет, и позволяет память.

Кроме того, ключевым моментом архитектуры Android является то, что действия и службы являются многократно используемыми компонентами программного обеспечения и не обязательно имеют отношение один к процессам. Внутри того же процесса, что и ваша деятельность, может быть услуга, используемая другим процессом в системе.

Если часть JNI вашего кода по-прежнему работает в фоновом режиме, когда деятельность получила onPause(), onStop(), onDestroy() уведомления, это может быть только потому, что вы не пересылаются эти сообщения в ней. Система, конечно же, не знает, как очистить использование ресурсов собственного кода - в частности, память, выделенная new() или malloc(). Если вы не освободите его, он будет восстановлен только после завершения процесса.

Если вы обеспокоены тем, что ваша деятельность не будет достаточно быстро убита системой и, как результат, содержит ссылки на ресурсы на родине, это хороший признак того, что система не ограничена ресурсами.

Возможно, вы захотите внедрить нативную часть своего приложения в качестве Service и выполнить его самоуничтожение через короткие промежутки времени на dis-iuse.

+0

Привет @marko У меня есть проблема с запуском собственной части приложения как службы. Можете ли вы предложить способ сделать это? Насколько я знаю, нативная часть приложения вызывается с использованием намерения на android.app.NativeActivity.class – bonchenko

Смежные вопросы