2010-01-13 3 views
2

Я использую Wakelock в своем приложении, чтобы телефон не спал, когда приложение видно.Android: изменение ориентации для Wakelock и обработка

Проблема возникает при изменении ориентации, и система уничтожает и воссоздает приложение в ландшафтном режиме. Если таймер wakelock истек в фоновом режиме, система выдает Wakelock в качестве возможности отключить экран.

Редактировать: Я должен упомянуть, что я устанавливаю Wakelock onResume и освобождаю onPause - как я понимаю, необходимо освободить, чтобы предотвратить утечку wakelock приложения.

Мне нужен wakelock, чтобы продолжить изменение ориентации.

Ниже я изложил решение этого вопроса. Это лучший способ справиться с этим, и есть ли альтернативы?


Создать сервис, который держит wakelock (а не деятельности), и когда деятельность отвязывается служба запускает таймер обратного отсчета (для скажем, 10 секунд), в котором он будет выпускать wakelock, когда таймер истекает, если активность делает не переделывать. Если бы это было простое изменение ориентации, активность будет перегруппироваться в течение 10 секунд и, таким образом, поддерживать wakelock, если это не так, будет выпущен wakelock.

Спасибо.

ответ

4

Вместо WakeLock, попробуйте getWindow().setFlags(), используя флаг WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.

Если таймер wakelock истек в фон система берет выпуск wakelock как возможность , чтобы выключить экран.

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

+0

Благодарим за отзыв. Я рассмотрю ваши предложения. - Wakelock работает как ожидалось во всех аспектах, кроме тех, которые вы указали здесь. Любые идеи, почему это может произойти? – bdls

+0

Установка значка KEEP_SCREEN_ON была лучшим решением и решила проблему изменения ориентации. Благодарю. – bdls

+0

Имя флага FLAG_KEEP_SCREEN_ON, а не KEEP_SCREEN_ON. –

0

Вот как я это сделал ...

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» выдает таймер активности пользователя, поэтому экран остается включенным на некоторое время, когда эта блокировка бодрствования отпущена, что будет иметь место, когда ваша деятельность разрушена при изменении ориентации.

Работы ОК для меня!

0

Я сделал это, фактически никогда не выпуская вакелока. Вместо этого я получаю его с таймаутом.

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
  • Simple (не нужно играть с isFinishing() и т.д.)
  • Не меняет активность пользователя после изменения ориентации. То есть затемняемый дисплей остается затемненным
  • Если вы отпустите (например, время закончилось, но пользователь остался в действии), он немедленно отпустится. Не нужно ждать истечения времени ожидания по умолчанию.
Смежные вопросы