Die Push-Nachricht kann den Dienst nicht sofort starten

9

Kontext

Wir entwickeln eine Android App, die folgendes tun soll:

  1. Der Benutzer installiert die App, registriert und schließt die App
  2. ein- oder zweimal im Jahr sendet ein Administrator eine Firebase-Datennachricht mit Priorität hoch an den Benutzer, der einen Geo Fence enthält
  3. Die FCM-Nachricht startet einen JobService, der nach dem Standort des Telefons sucht.
  4. Wenn sich das Telefon innerhalb des angegebenen Bereichs befindet, wird eine Aktivität gestartet und die Benutzerinteraktion wird gestartet
  5. Wenn sich das Telefon außerhalb des Bereichs befindet, wird der Dienst gestoppt und der Benutzer wird nicht gestört

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

  1. 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?

  2. 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.

  3. Gibt es eine andere Möglichkeit, meinen Dienst gleichzeitig als Whitelist und Vordergrunddienst zu starten?

Theis Borg 26.01.2018, 13:33
quelle

3 Antworten

1

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 .

    
riyaz-ali 02.03.2018, 05:18
quelle
1
  

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 :)

    
LordRaydenMK 26.02.2018 20:28
quelle
0

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

    
Federico De Gioannini 23.02.2018 14:46
quelle