Pergunta

Estou usando o Wakelock no meu aplicativo para impedir que o telefone dormisse quando o aplicativo estiver visível.

O problema ocorre quando há uma mudança de orientação e o sistema destrói e recria o aplicativo no modo paisagem. Se o cronômetro Wakelock expirar em segundo plano, o sistema leva o lançamento do Wakelock como uma oportunidade de desligar a tela.

EDIT: Devo mencionar que estou definindo o Wakelock OnResume e liberando na pausa - como eu o entendo, é necessário liberar e impedir que o aplicativo vazasse o Wakelock.

Eu preciso que Wakelock continue através da mudança de orientação.

Abaixo, descrevi uma solução para isso. Essa é a maneira preferida de lidar com isso e há alguma alternativa?


Crie um serviço que mantenha Wakelock (em vez da atividade) e quando a atividade desbaste o serviço inicia um cronômetro de contagem regressiva (por exemplo, 10 segundos), no qual liberará Wakelock quando o timer expirar se a atividade não se referir. Se for uma mudança simples de orientação, a atividade se referenciará nesses 10 segundos e, assim, manterá Wakelock, se não o fizer, Wakelock será lançado.

Obrigado.

Foi útil?

Solução

Em vez de um WakeLock, tentar getWindow().setFlags() usando o WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON bandeira.

Se o cronômetro Wakelock expirar em segundo plano, o sistema leva o lançamento do Wakelock como uma oportunidade de desligar a tela.

Não deveria. Por definição, o usuário interagiu com o dispositivo, para que a tela permaneça por esse motivo, independentemente de qualquer outra coisa.

Outras dicas

Aqui está como eu fiz isso ...

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");

Seguido por...

wl.acquire();

... quando você precisa realmente ativar o travamento.

O sinalizador 'PowerManager.on_after_release' cutuca o cronômetro de atividade do usuário para que a tela permaneça por mais um pouco quando esse bloqueio de vigília for liberado, o que será o caso quando sua atividade for destruída em uma mudança de orientação.

Funciona bem para mim!

Eu fiz isso realmente nunca lançando o Wakelock. Em vez disso, adquiro -o com o tempo limite.

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);
}

Vantagens sobre outros métodos:

  • Utilizável com o SCREEN_DIM_WAKE_LOCK
  • Simples (sem necessidade de brincar com isfinishing () etc.)
  • Não cutuca a atividade do usuário após a mudança de orientação. Ou seja, o monitor diminuiu fica esgotado
  • Se você lançar (por exemplo, a hora terminou, mas o usuário permaneceu na atividade), ele será lançado imediatamente. Não há necessidade de esperar pelo tempo limite padrão.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top