Frage

Hallo Ich versuche, einen Dienst zu verwenden, um eine WakeLock zu steuern, so ich permanent den Bildschirm auf verlassen kann, wenn meine Anwendung ausgeführt wird. Ich schaffe das WakeLock und aktivieren Sie es in onCreate () und lassen Sie ihn in onDestroy () jedoch erhalte ich die Fehlermeldung „wl nicht aufgelöst werden kann“. Kann jemand erklären, wie ich darüber hinwegkommen kann? Code unten:

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();
    }
}
War es hilfreich?

Lösung

Sind Sie nicht die Zeile fehlt

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

in onDestroy ()? Es ist eine lokale Variable in onCreate (), aber es ist nicht in onDestroy () erklärt.

Oder wahrscheinlicher, können Sie wollen, dass es ein Feld der Klasse WakeLockService machen statt einer lokalen Variablen.

Andere Tipps

Nun, auch wenn Sie eine Instanz Variable verwenden, würde ich würde denken, dies ist nicht der Weg, es zu tun. Wer ist gonna call destroy()? Ich hoffe nicht, dass Sie, es ist das O Job zu tun. Aber wenn man eine Spur halten sperrt es höchst unwahrscheinlich ist, dass Ihre destroy() Methode aufgerufen, da das Betriebssystem zunächst andere Aktivitäten / Dienstleistungen zerstören.

Außerdem, es ist viel zu spät, um die Wake Sperre in der onCreate() Methode zu erwerben. Bevor onCreate() das Telefon bereits schlafen haben könnte gegangen ist erreicht, wenn Sie den Service von einem Alarm vs. aus einer Aktivität auslösen, die im Hintergrund ist.

Es ist schwer zu sagen, was Sie sollten anders machen, wie Sie nicht viel Kontext geben. Der üblicher Verlauf der Ereignisse ist dies. Ein BroadcastReceiver wird aufgerufen und in der onReceive() Sie die Wake Lock zu erwerben und sie in einer statischen Variablen auf Ihren Diensten. Wenn der Dienst getan ist, sollte es stopSelf() nennen, die Sperre Wach- und dann die statische Variable null, die einen Verweis auf die Sperre hält.

Auch, wenn Sie einen Dienst eine vollständige wake Verriegelung ist sehr wahrscheinlich nicht das, was Sie wollen, aber eine teilweise Wake Lock ist. Sie müssen nicht auf den Bildschirm zu bleiben, nicht wahr?

Es tut uns Leid, aber wake Schlösser sind wirklich zu verwenden kompliziert, weil genau die Fragen, die ich oben beschrieben. Es ist definitiv ein fortgeschrittenes Thema und es ist leicht zu vermasseln. Wenn Sie das tun, wird Ihr App sehr hässliche Kommentare bekommen, weil zu lange hält ein großes Ärgernis, da sie die Batterie entleert. Nehmen Sie nicht das der falsche Weg, bitte, aber die Art des Problems Sie hier gepostet (Syntax / Compiler-Fehler) Ich würde dringend nach einer Lösung zu suchen, legen nahe, ohne Service und Wake Sperre gegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top