Вопрос по android – Android: как освободить ресурсы, когда приложение закрывается?

13

Я создал приложение, которое использует камеру, и во время выполнения приложения экран всегда включен.

В методе onCreate () я добавил блокировку:

final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
this.mWakeLock.acquire(); 

И это переопределенный метод onStop ():

@Override
protected void onStop() {

    if(mWakeLock.isHeld())
    {
        mWakeLock.release();
    }

    super.onStop();
}

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

Кто-нибудь знает, как освободить все ресурсы при закрытии приложения?

Ваш Ответ

5   ответов
2

когда я использовал OpenGL. Итак, теперь с android.os.Process.killProcess (android.os.Process.myPid ()); это работает так, как я хочу !!

Спасибо Art

3

Wakelock - возможно ли, что он выдает исключение раньше вonStop илиonPause? Я бы включил запись в журнал, где вы вызываете релиз, чтобы подтвердить, что он выполняется.

В любом случае, вы обязательно захотите переместитьacquire а такжеrelease методы вonResume а такжеonPause соответственно. Полученный код приобретет WakeLock только при первом запуске приложения.

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

Лучше всего создать WakeLock в onCreate (как у вас), получить блокировку в onResume и снять ее в onPause (включая вызов isHeld). Это гарантирует, что блокировка будет удерживаться всякий раз, когда ваше приложение находится на переднем плане.

3

но до сих пор не знаю, что это значит, но это решает мою проблему "Wakelock under-locked".

Init: OnStart () приобретать: onResume () выпуск: onStop ()

13

OnCreate() вOnResume(). Вы хотите блокировку в течение видимого времени жизни Действия, а не всего времени жизни Действия. Ваша активность может определенно продолжаться, если перед ней будет запущена другая активность.

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

Кроме того, я бы не проверял, есть ли у меня блокировка перед выпуском. Если вы используетеOnResume() приобрести замок;isHeld всегда должно быть правдой вOnPause().

Ваше предложение не проверять состояние блокировки в порядке, если release () - идемпотентная операция. Если нет, то это плохо. Что если приложению не удалось получить блокировку и закрыть приложение? Thushan
Отличный комментарий. Я посмотрел на исходный код Android. Похоже, что единственный способ, которым вы не можете получить блокировку, - это если вы ошибаетесь в своем вызове, и в этом случае он регистрирует ошибку, но не выдает исключение. Если вы вызываете release () без получения блокировки, он выдаст исключение «WakeLock under-locked». Документация acqu () заставляет задуматься, что если вы попросите блокировку, вы получите блокировку. Но если вы должны проверить, то вы должны проверить сразу после acqu (), а не после того, как программа была запущена, и вы собираетесь выйти. Will
1

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

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

Похожие вопросы