Nun, selbst wenn Sie eine Instanzvariable verwenden würden, würde ich denken, dass dies nicht der richtige Weg ist. Wer wird destroy()
anrufen? Ich hoffe nicht, es ist der OS-Job, dies zu tun. Aber wenn Sie eine Wake-Sperre halten, ist es höchst unwahrscheinlich, dass Ihre destroy()
-Methode aufgerufen wird, weil das Betriebssystem zuerst andere Aktivitäten/Dienste zerstört.
Außerdem ist es viel zu spät, die Wake-Sperre in der onCreate()
Methode zu erwerben. Bevor onCreate()
erreicht wird, ist das Telefon möglicherweise bereits in den Ruhezustand versetzt worden, wenn Sie den Dienst von einem Alarm oder von einer Aktivität im Hintergrund auslösen.
Es ist schwer zu sagen, was Sie anders machen sollten, da Sie nicht viel Kontext geben. Der übliche Verlauf der Ereignisse ist dies. Ein BroadcastReceiver
wird aufgerufen und in der onReceive()
erwirbst du die Wake Lock und stellst sie in eine statische Variable auf deinen Service. Wenn der Dienst fertig ist, sollte er stopSelf()
aufrufen, die Wake-Sperre aufheben und dann die statische Variable auf Null setzen, die einen Verweis auf die Sperre behält.
Auch, wenn Sie einen Service verwenden, ist eine vollständige Wecksperre sehr wahrscheinlich nicht das, was Sie wollen, aber eine teilweise Wecksperre ist. Du brauchst den Bildschirm nicht, um weiterzumachen, oder?
Entschuldigung, aber Wake Locks sind wirklich kompliziert zu verwenden, wegen genau der Probleme, die ich oben beschrieben habe. Es ist definitiv ein fortgeschrittenes Thema und es ist leicht zu vermasseln. Wenn du dies tust, wird deine App sehr hässliche Kommentare bekommen, weil das zu lange Anhalten ein großes Vergehen ist, da es den Akku entleert. Bitte nehmen Sie dies nicht falsch, aber angesichts der Art des Problems, das Sie hier gepostet haben (Syntax/Compiler-Fehler) würde ich dringend empfehlen, nach einer Lösung ohne Service- und Wecksperre zu suchen.
Danke für den Kommentar. In der Anwendung, an der ich arbeite, brauche ich das Telefon, um im 100% -Weckmodus zu sein, weshalb ich die vollständige Wecksperre verwendete. – Tom
Ein partieller Wakelock sollte ausreichen, um die CPU hochzufahren und das Netzwerk zu nutzen. – Eno
Danke von mir auch. Ihre Erklärung ist prägnant und hilfreicher als die Frage und Antwort kombiniert :) – Melllvar