Pergunta

Olá, eu estou tentando usar um serviço para controlar um wakelock para que eu possa deixar permanentemente a tela quando meu aplicativo está sendo executado. Eu crio o wakelock e ativá-lo em onCreate () e liberá-lo em onDestroy () no entanto eu recebo o erro "wl não pode ser resolvido". Alguém pode explicar como posso superar isso? Código abaixo:

public class WakeLockService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }  
    @Override
    public void onCreate() {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
        wl.acquire();
    }
    @Override
    public void onDestroy() {
        wl.release();
    }
}
Foi útil?

Solução

Você não está faltando a linha

    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");

em onDestroy ()? É uma variável local em onCreate (), mas não é declarada em onDestroy () em tudo.

Ou, mais provável, você pode querer torná-lo um campo de WakeLockService classe em vez de uma variável local.

Outras dicas

Bem, mesmo se você usar uma variável de instância Eu acho que esta não é a maneira de fazê-lo. Quem é que vai chamar destroy()? Eu não espero que você, é o trabalho OS para fazê-lo. Mas quando você está segurando um bloqueio esteira é altamente improvável que o seu método destroy() obter chamado, porque o sistema operacional irá primeiro destruir outras atividades / serviços.

Além disso, é demasiado tarde para adquirir o bloqueio de wake no método onCreate(). Antes onCreate() é atingido o telefone poderia ter ido dormir já quando você acionar o serviço de uma vs. alarme de uma atividade que está no fundo.

É difícil dizer o que você deve fazer de forma diferente como você não dão muita contexto. O curso normal dos acontecimentos é este. A BroadcastReceiver é chamado e na onReceive() você adquirir o bloqueio esteira e colocá-lo em uma variável estática em seu serviço. Quando o serviço é feito ele deve chamar stopSelf(), liberar o bloqueio esteira e depois nulo a variável estática que mantém uma referência para o bloqueio.

Além disso, se você usar um serviço de um bloqueio esteira cheia é muito provavelmente não o que você quer, mas um bloqueio de wake parcial é. Você não precisa de tela para ficar, certo?

Desculpe, mas fechaduras vigília são realmente complicado de usar, por causa exatamente os problemas que eu descrevi acima. É definitivamente um tópico avançado e é fácil de estragar. Se você fizer isso, seu aplicativo irá receber comentários muito feio, porque segurando por muito tempo é uma grande ofensa, uma vez que drena a bateria. Não tome isso da maneira errada, por favor, mas dada a natureza do problema que você postou aqui (sintaxe / erro do compilador) Gostaria de sugerir para procurar uma solução sem um bloqueio de Serviço e esteira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top