Korrigieren Sie das Muster, um einen WakeLock in einem BroadcastReceiver zu erwerben und in einem Service freizugeben

Auch nach viel recherche bin ich noch nicht ganz sicher, ob die Art und Weise, wie implementiere ich eine WakeLock für eine Service begann mit einem BroadcastReceiver korrekt ist - auch wenn es scheint gut zu funktionieren. Der broadcast receiver bekommt Absichten geschickt, um es von einem alarm, so mit zu beginnen, aus den API-docs AlarmManager:

Wenn Ihr alarm-Empfänger namens Kontext.startService(), ist es möglich
dass das Telefon zu schlafen, bevor der angeforderte Dienst ist gestartet. Zu
dies zu verhindern, Ihre BroadcastReceiver und Service müssen
die Implementierung einer eigenen wake-lock-Politik, um sicherzustellen, dass das Telefon
weiterhin ausgeführt, bis der Dienst verfügbar ist.

So, in onReceive() ich tun:

    Intent serviceIntent = new Intent(context, SomeService.class);
    context.startService(serviceIntent);

    if(SomeService.wakeLock == null) {
        PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        SomeService.wakeLock = powerManager.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK, 
                SomeService.WAKE_LOCK_TAG);
    }
    if(! SomeService.wakeLock.isHeld()) {
        SomeService.wakeLock.acquire();
    }

- und service ich:

    try {
        //Do some work
    } finally {
        if(wakeLock != null) {
            if(wakeLock.isHeld()) {
                wakeLock.release();
            }
            wakeLock = null;
        }
    }

Den SomeService.wakeLockFeld Paket private, static-und volatile.

Was ich bin nicht sicher ist die Prüfung mit isHeld() - muss es wirklich sagen Sie mir, wenn ein WakeLock erworben wird oder nicht, und brauche ich, wenn ich diese Prüfung überhaupt?

InformationsquelleAutor der Frage Torsten Römer | 2011-08-24

Schreibe einen Kommentar