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?
Antwort
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.
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. –
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 –
@ 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
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.
Vielen Dank für Ihre Antwort. Nur eine Frage mehr: Muss ich einen Dienst starten? oder kann ich die Arbeit am Empfänger erledigen? –
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. –
- 1. Benötige ich eine Aktivität, um nur eine Benachrichtigung anzuzeigen?
- 2. Welche Aktivität wird aufgerufen, wenn ich eine Anwendung starte?
- 3. Wie starte ich Dienst-nur Android App
- 4. Wie starte ich eine Aktivität in einem Tab?
- 5. Wie starte ich eine neue Aktivität in der gleichen Registerkarte?
- 6. Benötige ich eine Jobwarteschlange auf meinem COM-Server?
- 7. Wie starte ich eine andere Aktivität, wenn eine Schaltfläche geklickt wird, die in main.xml definiert ist
- 8. Wie starte ich eine Aktivität innerhalb eines Fragments?
- 9. Wie starte ich eine neue Aktivität vom Lockscreen?
- 10. Wie starte ich eine Android-Aktivität von einer Unity-Anwendung?
- 11. Benötige ich eine IP-Adresse?
- 12. Wie erzwinge ich eine Verbindung zu einem a2dp Bluetooth-Gerät durch eine Aktivität oder einen Dienst
- 13. Wie starte ich eine neue Aktivität mit einer if-Anweisung?
- 14. Wie starte ich eine Aktivität mit Heim Widget
- 15. Wie starte ich die Aktivität im Adapter?
- 16. Wie starte ich eine Aktivität nach einem bestimmten Zeitraum?
- 17. Wie starte ich eine QApplication?
- 18. Benötige ich einen Webserver oder nur eine Datenbank?
- 19. Wie starte ich die Aktivität, wenn der Benutzer auf eine Benachrichtigung klickt?
- 20. SQL Server-Bericht-Dienst fest, bis ich Dienst stopp/starte
- 21. Wie starte ich eine neue Aktivität von Anthere Aktivität ... in Android?
- 22. Benötige ich eine EULA in meiner iPhone App?
- 23. Wie starte ich Fragment von Aktivität?
- 24. Was passiert, wenn ich eine EC2-Instanz neu starte?
- 25. Wie starte ich eine Anwendung in C#?
- 26. Wie starte ich eine VM in azurblau?
- 27. Wie starte ich einen Timer, wenn eine Eingabe erfolgt?
- 28. Wie starte ich eine Absicht, indem ich einige Parameter übergebe?
- 29. Wenn ich eine Aktivität aus einer Benachrichtigung starte, wird auch die MainActivity gestartet
- 30. Wie benötige ich eine Mindestversion von zsh?
http://Stackoverflow.com/a/38816085/6456129 kann hilfreich sein – Yessy