2013-03-20 5 views
6

Ich habe einen Broadctraceiver, der von einem Alarm (mit AlarmManager geplant) aufgerufen wird. In diesem Empfänger frage ich nur ein Register aus der Datenbank und starte eine Benachrichtigung. Ich habe gelesen, dass eine Wake-Sperre erforderlich ist, wenn ein Dienst oder eine Aktivität von einem Broadcast-Empfänger gestartet wird, aber brauche ich eine Wake-Sperre, wenn ich nur eine Benachrichtigung (im Benachrichtigungsfeld) anzeigen möchte?benötige ich eine Wecksperre in meinem Broadcastempfänger, wenn ich keinen Dienst oder eine Aktivität starte?

+0

http://Stackoverflow.com/a/38816085/6456129 kann hilfreich sein – Yessy

Antwort

16

In diesem Empfänger ich nur ein Register aus der Datenbank abfragen und eine Benachrichtigung starten.

Führen Sie keine Datenbank-E/A im Hauptanwendungs-Thread aus.

readed ich, dass eine Wake Sperre wird benötigt, wenn ein Service oder eine Aktivität von einem Rundfunkempfänger gestartet wird, aber, nicht nur ein Wake Lock ich brauche, wenn ich eine Notificación (im Benachrichtigungsfenster) angezeigt werden soll?

Generell nein, würden Sie nicht ein WakeLock von einem BroadcastReceiver brauchen, auch eine, die über einen _WAKEUP Alarm aufgerufen wird. AlarmManager garantiert in diesem Fall, dass es das Gerät mit seiner eigenen WakeLock wach hält.

In diesem Fall sollten Sie jedoch nicht unbedingt Datenbank-E/A im Hauptanwendungs-Thread ausführen, und onReceive() wird im Hauptanwendungsthread aufgerufen. Das richtige Muster hier ist, dass Sie Ihre "Abfrage eines Registers aus der Datenbank und das Starten einer Benachrichtigung" an eine IntentService, gestartet von Ihrem BroadcastReceiver, verschieben, so dass die Arbeit in einem Hintergrundthread erledigt wird. Diese wird erfordert eine WakeLock, wie Sie jetzt arbeiten außerhalb onReceive(). Ich habe a WakefulIntentService that manages the WakeLock for you, wenn Sie es verwenden möchten.

+0

Danke! Du hast alle meine Fragen dazu beantwortet :) Ich werde mir deinen WakefulIntentService ansehen, um die gesamte Arbeit in einem IntentService zu erledigen und einen WakeLock zu verwenden. –

+0

korrigieren Sie mich, wenn ich falsch liege, aber ich denke, es gibt eine Chance, dass das Gerät wieder in den Ruhezustand geht, während der BroadcastReceiver onReceive() beendet ist, aber Ihr WakefulIntentService ist noch nicht gestartet oder hat noch kein Wakelock erworben Ich würde vorschlagen, einfach einen WakefulBroadcastReceiver zu verwenden (wurde nach der akzeptierten Antwort der Support-Bibliothek hinzugefügt): http://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html –

+0

@ Su-AuHwang : "korrigiere mich, wenn ich falsch liege" - du liegst falsch. 'WakefulIntentService' wurde speziell für dieses Szenario entwickelt. "Deshalb würde ich vorschlagen, einfach einen WakefulBroadcastReceiver zu verwenden" - es gibt Vor- und Nachteile für jeden Ansatz; an keinem von ihnen liegt etwas an sich. – CommonsWare

-1

Ja, es ist notwendig. Ich erinnere mich, dass in der Kernel-Ebene die CPU für etwa 5 Sekunden weiterlaufen wird. Wenn Sie also Ihre Nachricht nicht innerhalb von 5 Sekunden senden können, müssen Sie eine Wecksperre ergreifen. Und lass es los, nachdem du deine Arbeit beendet hast.

+0

Vielen Dank für Ihre Antwort. Nur eine Frage mehr: Muss ich einen Dienst starten? oder kann ich die Arbeit am Empfänger erledigen? –

+0

Downvote, weil BroadcastReceiver keine harte Arbeit leisten kann (nur ein paar Sekunden, also 5 Sekunden sind wirklich in Ordnung). Wenn Sie hart arbeiten wollen, starten Sie einen Dienst. –