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.wakeLock
Feld 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tatsächlich etwas schwierig zu beantworten. Suche an der Quelle für
PowerManager
undPowerManager.WakeLock
hier dieWakeLock.acquire()
undWakeLock.acquireLocked()
Methoden sind wie folgt......
mService
ist einIPowerManager
- Schnittstelle und die Quelle ist nicht verfügbar, so ist es schwer zu sagen, was kann oder kann nicht schief gehen, wenn Sie versuchen, um callacquireWakeLock(...)
.In jedem Fall, die einzige Ausnahme, die gefangen werden können, ist
RemoteException
und diecatch
blockieren tut nichts. Sofort nach dem try - /catch -mHeld
eingestellt isttrue
unabhängig.Kurz gesagt, wenn Sie anrufen
isHeld()
sofort nachacquire()
ist das Ergebnis immertrue
.Suchen weiter in der Quelle für
PowerManager.WakeLock
zeigt ein ähnliches Verhalten fürrelease()
fordertrelease(int flags)
wo diemHeld
Mitglied immer auffalse
egal, was passiert.Abschließend würde ich vorschlagen, es ist immer eine gute Idee zu überprüfen
isHeld()
nur als "best practice" in späteren Versionen von Android ändern Sie dieses Verhalten derWakeLock
Methoden.InformationsquelleAutor der Antwort Squonk
Verwalten Sie wakeLock innerhalb einer singleton (eindeutige Instanz zugänglich durch alle Ihre Kontext-und Objekt -)
Einsatz einer singleton-Instanz einer benutzerdefinierten Klasse, dann erhalten Sie möglicherweise wakelock-Objekt-Referenz aufrufen ,
hier ein singleton-Beispiel
in Ihrer Anwendung, um Ihre "wakelock" - Objekt zugreifen können, wie
InformationsquelleAutor der Antwort Emmanuel Devaux
Alle dieser job kann getan werden, indem ein Helfer und native Klasse namens WakefulBroadcastReceiver
InformationsquelleAutor der Antwort CelinHC
Ich denke android.os.Messenger kann einen besseren Weg
für den Empfänger:
für den service:
Diese Methode funktioniert ordnungsgemäß, auch wenn service & receiver laufen in verschiedenen Verfahren.
InformationsquelleAutor der Antwort Yessy