Android:Блокировка пробуждения и изменение ориентации управления
-
20-09-2019 - |
Вопрос
Я использую Wakelock в своем приложении, чтобы предотвратить переход телефона в спящий режим, когда приложение видно.
Проблема возникает, когда происходит смена ориентации и система уничтожает и воссоздает приложение в альбомном режиме.Если таймер wakelock истек в фоновом режиме, система использует отключение wakelock как возможность выключить экран.
Редактировать:Я должен упомянуть, что я устанавливаю Wakelock onResume и отпускаю onPause - насколько я понимаю, это необходимо сделать, чтобы предотвратить утечку wakelock из приложения.
Мне нужен wakelock, чтобы продолжить изменение ориентации.
Ниже я обрисовал решение этой проблемы.Является ли это предпочтительным способом справиться с этим, и есть ли какие-либо альтернативы?
Создайте службу, которая удерживает wakelock (а не действие), и когда действие отключается, служба запускает таймер обратного отсчета (скажем, на 10 секунд), в котором она отключит wakelock по истечении таймера, если действие не будет повторно привязано.Если это было простое изменение ориентации, действие будет повторно привязано в течение этих 10 секунд и, таким образом, сохранит wakelock, если этого не произойдет, wakelock будет снят.
Спасибо.
Решение
Вместо WakeLock
, попробуй getWindow().setFlags()
используя WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
Отметить.
Если таймер отключения истек в фоновом режиме, система использует разблокировку wakelock как возможность выключить экран.
Так не должно быть.По определению, пользователь взаимодействовал с устройством, поэтому экран должен оставаться включенным по этой причине, независимо от чего-либо еще.
Другие советы
Вот как я это сделал...
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");
С последующим...
wl.acquire();
...когда вам действительно нужно активировать блокировку пробуждения.
Флаг PowerManager.ON_AFTER_RELEASE активирует таймер активности пользователя, поэтому экран остается включенным немного дольше, когда снимается блокировка пробуждения, что произойдет в том случае, если ваша активность будет уничтожена при смене ориентации.
У меня работает нормально!
Я сделал это, фактически никогда не отпуская блокировку пробуждения.Вместо этого я получаю его с тайм-аутом.
private PowerManager.WakeLock wl;
protected void onStart(Bundle savedInstanceState) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Words counter");
// disable reference counting, as acquire/release calls are not paired
wl.setReferenceCounted(false);
wl.acquire();
}
protected void onStop() {
// acquire for few seconds to keep lock until onStart is called with new orietnation
wl.acquire(3000);
}
Преимущества перед другими методами:
- Можно использовать с
SCREEN_DIM_WAKE_LOCK
- Просто (не нужно играть с isFinishing() и т. д.)
- Не тыкает активность пользователя после смены ориентации.Т.е.затемненный дисплей остается затемненным
- Если вы отпустите (например.время истекло, но пользователь остался в активности), оно немедленно освобождается.Не нужно ждать тайм-аута по умолчанию.