Android:Блокировка пробуждения и изменение ориентации управления

StackOverflow https://stackoverflow.com/questions/2058712

Вопрос

Я использую 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() и т. д.)
  • Не тыкает активность пользователя после смены ориентации.Т.е.затемненный дисплей остается затемненным
  • Если вы отпустите (например.время истекло, но пользователь остался в активности), оно немедленно освобождается.Не нужно ждать тайм-аута по умолчанию.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top