Kontext
Wir entwickeln eine Android App, die folgendes tun soll:
Ich habe die App basierend auf dem Firebase-Push-Beispiel entwickelt, das hier
Das Problem
Die Anwendung funktioniert auf meinen älteren Handys einwandfrei, aber auf meinem neuen Testtelefon (Android 8.1.0, LineageOS 15.1) haben wir ein Problem, wenn sich das Telefon im Schlafmodus befindet. In diesem Fall kommt die FCM-Nachricht sofort an, aber der Dienst wird erst gestartet, wenn das Telefon entsperrt ist. Die Nachricht bleibt also zwischen 2. und 3. stecken.
Wir brauchen die App, um sofort zu antworten - nicht, wenn der Benutzer 2 Stunden später sein Telefon benutzt.
Ich nehme an, dass das Problem auf den Doze-Modus zurückzuführen ist mit Android 6. Ich habe versucht, es zu lösen, indem Sie die App auf die Whitelist in Einstellungen hinzufügen- & gt; Batterie- & gt; Batterie-Optimierung, aber dies hat das Problem nicht gelöst.
Fragen
Ist es der Doze-Modus, der meine App zwischen 2. und 3. verzögert? Wenn ja, warum ist es nicht gelöst, wenn sich die App in der Whitelist befindet?
Gibt es eine andere Möglichkeit, den Ortungsdienst sofort zu starten? Diese Post schlägt vor, dass ein Vordergrund-Dienst es tun kann, aber dies erfordert dies Es wird eine Benachrichtigung angezeigt, die mit 5 bricht.
Gibt es eine andere Möglichkeit, meinen Dienst gleichzeitig als Whitelist und Vordergrunddienst zu starten?
Ja! Sie haben recht, das kann aufgrund der Doze- und App-Standby-Funktion sein Funktionen in API 23 Marshmallow eingeführt.
Wie in der Dokumentation erwähnt, führt das System ignore wakelocks und system lässt nicht zu, dass JobScheduler
ausgeführt wird. Dadurch wird verhindert, dass Ihre App den Job ausführt .
Eine einfache und effektive Problemumgehung wäre es, die Ortserkennungsroutine in einem normalen background service und starte es mit startService()
, wenn du FCM push bekommst.
Beachten Sie, dass Ihre App noch immer auf die weiße Liste setzen müssen, wie in einem anderen Post erwähnt, nur eine Whitelist-App das Netzwerk nutzen und partielle Wake-Sperren halten .
Verzögert sich meine App im Doze-Modus zwischen 2. und 3.?
Von der Dokumentation hängt der Doze-Modus den Netzwerkzugriff ab und blockiert% Code%.
Wenn ja, warum ist es nicht gelöst, wenn sich die App in der Whitelist befindet?
Auch aus der Dokumentation : Eine App, die auf die weiße Liste gesetzt werden kann Verwenden Sie das Netzwerk und halten Sie während Doze und App Standby die partielle Wecksperre . Allerdings gelten andere Einschränkungen für die App auf der weißen Liste wie für andere Apps.
Die Blockierung von JobScheduler
gilt also weiterhin.
Gibt es eine andere Möglichkeit, den Ortungsdienst sofort zu starten? Dies Post schlägt vor, dass ein Vordergrunddienst es tun kann, aber dies erfordert dass eine Benachrichtigung angezeigt wird, die mit 5 bricht.
Ignore Battery Optimizations (für den Internetzugriff) in Kombination mit JobScheduler
mit AlarmManager
oder setAndAllowWhileIdle()
sollten funktionieren.
Seien Sie vorsichtig mit Ignore Battery Optimizations
Die Google Play-Richtlinien verbieten Apps die direkte Ausnahme von den Energieverwaltungsfunktionen in Android 6.0+ (Doze und App Standby), sofern die Kernfunktion der App nicht beeinträchtigt wird.
Ich denke, eine wichtige Frage ist hier: Müssen Sie das setExactAndAllowWhileIdle()
wirklich sofort ausführen?
Wenn ein Benutzer ein Gerät bei ausgeschaltetem Bildschirm für längere Zeit nicht angeschlossen und unbewegt lässt, geht das Gerät in den Doze-Modus.
Wenn sich das Gerät im Doze-Modus befindet, bedeutet dies, dass der Benutzer es nicht verwendet.
Wenn sich das Telefon innerhalb des angegebenen Bereichs befindet, wird eine Aktivität gestartet und die Benutzerinteraktion beginnt.
Dies ist der Schritt Doze Blöcke
Wir brauchen die App, um sofort zu antworten - nicht, wenn der Benutzer 2 Stunden später sein Telefon benutzt.
Wenn sich das Gerät in Doze befindet, bedeutet dies, dass der Benutzer nicht mit ihm interagiert. Selbst wenn Sie JobScheduler
anzeigen, der Benutzer das Telefon nicht benutzt, wird er es sehen, wenn er es 2 Stunden später benutzt :)
Ich habe es immer noch nicht versucht, aber Sie könnten einen WakefulBroadcastReceiver verwenden: Ссылка Ссылка
Gemäß diesen Links sollten Sie Ihren Empfänger als:
deklarieren %Vor%Wahrscheinlich ist Ihr Empfänger bereits ein WakefulBroadcastReceiver, weil Benachrichtigungen angezeigt werden ..
Im Empfänger starten Sie den Dienst (Ihr Dienst muss ein IntentService sein) mit:
%Vor%Denken Sie daran, die Wecksperre im Dienst zu löschen:
%Vor%Ich hoffe, es hat geholfen
Tags und Links android push-notification geolocation firebase-cloud-messaging