5

Hallo Ich versuche, einen Service zu verwenden, um ein Wakelock zu steuern, damit ich den Bildschirm dauerhaft verlassen kann, wenn meine Anwendung ausgeführt wird. Ich erstelle den Wakelock und aktiviere ihn in onCreate() und lasse ihn in onDestroy() frei, bekomme aber den Fehler "wl kann nicht aufgelöst werden". Kann mir jemand erklären, wie ich darüber hinwegkommen kann? Code unten:Verwenden eines Wakelock in einem Dienst Android 1.5

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(); 
    } 
} 

Antwort

5

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 wird überhaupt nicht in onDestroy() deklariert.

Oder, wahrscheinlicher, möchten Sie vielleicht ein Feld der Klasse WakeLockService anstelle einer lokalen Variablen machen.

9

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.

+0

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

+0

Ein partieller Wakelock sollte ausreichen, um die CPU hochzufahren und das Netzwerk zu nutzen. – Eno

+0

Danke von mir auch. Ihre Erklärung ist prägnant und hilfreicher als die Frage und Antwort kombiniert :) – Melllvar