3

Ich arbeite an einer Anwendung, die einige Dienste im Hintergrund mit AlarmManager hervorbringt. Timing ist sehr wichtig für unsere Anwendung und die Funktionalität kann nicht auf das nächste Wartungsfenster warten. Wenn ein Benutzer aufgefordert wird, die Anwendung in die Whitelist aufzunehmen, ist dies kein Problem, behebt jedoch nicht das Problem, Alarme auszusetzen. Auch der Batterieverbrauch ist nicht so wichtig.Doze-Modus Handhabung

Die erste mögliche Lösung, die mir in den Sinn kam, war, einen ständig laufenden Vordergrunddienst zu starten, der die Neuplanung von Diensten anstelle von AlarmManager übernimmt, aber dabei die Basisstruktur unserer Anwendung verschiebt und für uns nicht machbar ist.

Der aktuelle Fix, den ich gerade implementiert habe, besteht darin, eine Push-Benachrichtigung mit hoher Priorität zu senden und beim Empfang der Nachricht die Wake-Sperre zu aktivieren und den Bildschirm einzuschalten, um den Schlafmodus zu beenden.

Ich wollte wissen, ob es eine alternative Möglichkeit gibt, den Schlafmodus zu unterbrechen? Ist es auch möglich, ohne eine Wecksperre zu nehmen? Kann es Auswirkungen auf die Implementierung der oben genannten Lösung geben?

P.S. Ich verwende UrbanAirship für Push-Benachrichtigungen.

+0

* Auch ist es möglich, ohne eine Spur Sperre zu nehmen? * Ist das, was möglich ist? –

+0

Ist es möglich, beim Empfang von Push-Benachrichtigungen mit hoher Priorität den Bildschirm zu öffnen, ohne den Bildschirm einzuschalten? Ich erwog, keine Benachrichtigung im Tray zu zeigen, aber ohne das wäre der Bildschirm noch seltsamer. –

+0

Ich habe versucht, das ähnliche Problem mit der FCM-Nachricht zu lösen. aber es weckt meine App sehr kurze Zeit. Hattest du eine gute Lösung? –

Antwort

2

Sie können den Doze-Modus nicht "unterbrechen"/stoppen/deaktivieren, es gibt jedoch Möglichkeiten, die Beschränkungen Ihrer App vorübergehend zu dösen, während das Gerät döst.

  1. Eine FCM-Nachricht mit hoher Priorität.

FCM Nachrichten mit hoher Priorität können Sie zuverlässig Ihre App wecken auf das Netzwerk zuzugreifen, selbst wenn das Gerät des Benutzers in Doze oder die App ist im App Standby-Modus. Im Doze- oder App Standby-Modus übermittelt das System die Nachricht und gewährt der App temporären Zugriff auf Netzwerkdienste und partielle Wakelocks. Anschließend wird das Gerät oder die App in den Leerlaufzustand versetzt.

FCM-Nachrichten mit hoher Priorität wirken sich ansonsten nicht auf den Doze-Modus aus und wirken sich nicht auf den Status einer anderen App aus. Dies bedeutet, dass Ihre App sie für eine effiziente Kommunikation nutzen kann, während gleichzeitig die Akkuauswirkungen auf das System und das Gerät minimiert werden.

  1. Ein andAllowWhileIdle Alarm mit Alarmmanager eingestellt.

Doze ist besonders wahrscheinlich, Aktivitäten zu beeinflussen, die Alarmmanager Alarme und Timer verwalten, weil Alarme in Android 5.1 (API-Ebene 22) oder weniger nicht feuern, wenn das System in Doze ist.

Um die Alarmplanung zu beschleunigen, führt Android 6.0 (API level 23) zwei neue AlarmManager-Methoden ein: setAndAllowWhileIdle() und setExactAndAllowWhileIdle(). Mit diesen Methoden können Sie Alarme festlegen, die ausgelöst werden, selbst wenn sich das Gerät in Doze befindet.

Beachten Sie, dass der Mindestabstand zwischen zwei Alarmen im Schlafmodus 9 Minuten beträgt.


Für beide Fälle, Ihre App die volle Funktionalität wieder hergestellt wird (im Sinne von: die dösen Beschränkungen gelten nicht) für eine kurze Zeit, wenn die Zeit abgelaufen ist, wird das Betriebssystem die dösen Einschränkungen wieder einzusetzen.

Beachten Sie, dass Sie den Bildschirm nicht einschalten müssen, um Code während einer dieser "Weckzeiten" auszuführen.

Ich habe keine Quelle zur Hand, aber ich glaube, die kurze Zeit, die ich nenne, ist ~ 10 Sekunden.

Source & additional reading

+0

Hallo Tim, ich habe eine ähnliche Frage, wenn Sie eine Zeit haben können, bitte sehen Sie es sich an. Es wäre sehr hilfreich für mich. https://stackoverflow.com/questions/44079858/dealing-with-android-doze-mode-on-my-ble-monitoring-app-while-users-sleeping –