Android: Wakelock & Handling Orientation Change
-
20-09-2019 - |
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.
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.