Como impedir que um dispositivo Android entre no modo de suspensão por meio de programação?

155

Como impedir que um dispositivo Android entre no modo de suspensão por meio de programação?

James
fonte

Respostas:

133

Uma opção é usar um bloqueio de ativação . Exemplo dos documentos:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

Há também uma tabela nesta página que descreve os diferentes tipos de wakelocks.

Esteja ciente de que é necessário tomar cuidado ao usar os bloqueios de ativação. Certifique-se de que você sempre release()bloqueia quando terminar (ou não em primeiro plano). Caso contrário, seu aplicativo poderá causar um sério consumo de bateria e uso da CPU.

A documentação também contém uma página útil que descreve diferentes abordagens para manter um dispositivo acordado e quando você pode optar por usá-lo. Se "impedir que o dispositivo entre no modo de suspensão" se refere apenas à tela (e não mantém a CPU ativa), provavelmente um bloqueio de ativação é mais do que você precisa.

Você também precisa ter a permissão WAKE_LOCK definida em seu manifesto para usar esse método.

eldarerathis
fonte
21
Você não deve mais usar isso, pois esse método está obsoleto agora. Dê uma olhada em uma das outras respostas.
DuKes0mE
4
Ainda existem alguns motivos para usar wakelocks, como se o dispositivo fosse dedicado a um aplicativo específico e precisasse ser executado mesmo quando minimizado.
Muz
2
O PowerManager.PARTIAL_WAKE_LOCK não está obsoleto e acho que é o método mais eficiente. Ele permite que o usuário pressione o botão liga / desliga, mas a CPU ainda estará ligada até o lançamento da chamada do usuário ();
Mansour Fahad 23/03
A documentação oficial diz "Se você precisar manter a CPU em execução para concluir algum trabalho antes que o dispositivo entre no modo de suspensão, poderá usar um recurso de serviço do sistema PowerManager chamado wake locks".
Joaquin Iurchuk
É uma ótima maneira, mas está obsoleta. verifique esta resposta: stackoverflow.com/a/22447615/5327912
Parth Anjaria
240

Se você quiser apenas para evitar que o modo de hibernação em um específico View, basta ligar setKeepScreenOn(true)em que Viewou definir a keepScreenOnpropriedade para true. Isso impedirá que a tela se apague enquanto Viewestiver na tela. Nenhuma permissão especial é necessária para isso.

Witek
fonte
18
Além disso, isso não forçará o telefone a ficar acordado fora do tempo de vida do aplicativo. Você pode enfrentar esse problema com o WakeLock.
Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
2
Sim, na maioria dos casos, essa é a melhor abordagem.
Edward Falk
8
Essa deve ser a resposta selecionada. Simples, limpo e como o Android pretendia. Obrigado.
Lior Iluz
2
"Usando android: keepScreenOn =" true "é equivalente a usar FLAG_KEEP_SCREEN_ON. Você pode usar a melhor abordagem para seu aplicativo. A vantagem de definir o sinalizador programaticamente em sua atividade é que ele oferece a opção de limpar programaticamente o sinalizador mais tarde e permitindo assim que a tela para desligar" - developer.android.com/training/scheduling/wakelock.html
Antonino
Observe que o setKeepScreenOn(true)efeito entrará em vigor somente quando Viewestiver visível.
Jeff T.
121

Encontrei outra solução funcional: adicione a seguinte linha ao seu aplicativo no evento onCreate.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Meu projeto Cordova de amostra é assim:

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

Depois disso, meu aplicativo não dormia enquanto estava aberto. Obrigado pela resposta vai para xSus.

dogatônico
fonte
esta foi a melhor opção na minha opinião ... +1
Amit 27/07
Isso faz o mesmo que a resposta Witek, a única diferença é que você colocar isso em um arquivo ".java" em vez de um ".xml" ;-)
Tiktak
Que tal permissão? Requer permissão?
Mehdi Khademloo
@Mehdi Khademloo, não precisa de permissão.
Wessam El Mahdy
17

Defina sinalizadores na janela da atividade como abaixo

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
arjun
fonte
6

No shell raiz (por exemplo, shell adb), você pode bloquear com:

echo mylockname >/sys/power/wake_lock    

Após o qual o dispositivo permanecerá acordado, até que você faça:

echo mylockname >/sys/power/wake_unlock    

Com a mesma string para 'mylockname'.

Observe que isso não impedirá que a tela fique preta, mas impedirá a CPU de dormir.

Observe que / sys / power / wake_lock é leitura / gravação para o rádio do usuário (1001) e sistema de grupo (1000) e, é claro, raiz.

Uma referência está aqui: http://lwn.net/Articles/479841/

jelle foks
fonte
3

o que o @eldarerathis disse está correto em todos os aspectos, a trava de ativação é a maneira correta de impedir que o dispositivo entre no modo de suspensão.

Não sei o que o aplicativo precisa fazer, mas é realmente importante que você pense em como arquitetar o aplicativo para não forçar o telefone a ficar acordado por mais do que precisa, ou a duração da bateria sofrerá muito.

Eu indicaria este exemplo realmente bom de como usar AlarmManagerpara disparar eventos e ativar o telefone e (seu aplicativo) para executar o que você precisa fazer e depois voltar a dormir: Gerenciador de Alarmes (fonte: commonsware.com)

lucabox
fonte
Existem aplicativos utilitários especificamente e propositadamente destinados a esgotar a bateria. Eu tive uma necessidade uma vez. Basicamente, ele adquiriria wakelocks, vibraria como um louco, acenderia a lanterna, aumentaria o brilho etc. Então, sim, existem aplicativos que fazem uso disso. Mas isso foi off topic então me perdoe
TheRealChx101
0

Se você é um usuário do Xamarin, esta é a solução:

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
hogarth45
fonte