Android: Как освободить ресурсы, когда приложение завершается?
Я создал приложение, которое использует камеру, и во время выполнения приложения экран всегда включен.
В методе onCreate() я добавил блокировку:
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
this.mWakeLock.acquire();
И это метод overriden onStop():
@Override
protected void onStop() {
if(mWakeLock.isHeld())
{
mWakeLock.release();
}
super.onStop();
}
Но после завершения приложения экран остается все время, и если я запускаю приложение камеры, он обнаруживает ошибку, которая, очевидно, появляется, потому что ресурсы камеры не освобождаются.
Кто-нибудь знает, как освободить все ресурсы при завершении приложения?
Ответы
Ответ 1
Я бы переместил блокировку с OnCreate()
на OnResume()
. Вы хотите блокировку в течение видимого времени жизни Activity, а не всего срока действия Activity. Вы, возможно, все еще выполняете работу с другим действием, выполняющимся перед ним.
Я бы переместил релиз на OnPause()
. OnPause()
- это самая ранняя точка, в которой ваше приложение обычно должно быть убито ОС.
Кроме того, я не буду проверять, есть ли у меня блокировка перед выпуском. Если вы используете OnResume()
для получения блокировки; isHeld
всегда должно быть истинным в OnPause()
.
Ответ 2
Звучит так, как будто ваше приложение никогда не вызывает выпуск на Wakelock
- возможно ли, что оно выбрало исключение раньше в onStop
или onPause
? Я бы включил некоторые протоколы, в которых вы вызываете выпуск, чтобы подтвердить его выполнение.
В любом случае вы обязательно захотите переместить методы acquire
и release
в onResume
и onPause
соответственно. Код, который у вас есть, только приобретет WakeLock при первом запуске приложения.
Спасибо, что фоновая обработка Android вашего кода имеет потенциальный дисбаланс. Если пользователь нажимает клавишу "домой" для переключения приложений, блокировка будет отпущена. Если они вернутся к вашему приложению, то CreateCreate не будет вызываться, поэтому блокировка никогда не будет получена.
Лучше всего построить WakeLock в onCreate (как есть), получить блокировку в onResume и выпустить ее в onPause (включая вызов isHeld). Это гарантирует, что блокировка будет удерживаться всякий раз, когда ваше приложение находится на переднем плане.
Ответ 3
Я использую mWakelock.setReferenceCounted(false), по-прежнему не знаю, что это значит, но он разрешает мою проблему с недопустимой блокировкой Wakelock.
Init: OnStart()
приобретать: onResume()
релиз: onStop()
Ответ 4
У меня были проблемы с выпуском данных, когда я использовал OpenGL. Итак, теперь с android.os.Process.killProcess(android.os.Process.myPid()); он работает так, как я хочу!
Спасибо Art
Ответ 5
Где вы называете finish()?
Вы должны освобождать свои ресурсы в onPause, а не onStop. Нет никакой гарантии, что onStop всегда будет вызван до того, как ваша деятельность будет убита. Если системе нужны ресурсы, тогда она может убить активность до вызова onStop.
Попробуйте поместить отладочные журналы и проследить путь выполнения, если считаете, что ваше приложение завершено.