0

In meiner Android-Anwendung muss ich eine Minute eine Nachricht an den Server senden (im Grunde ein Ping), wenn eine bestimmte Funktion aktiviert ist. Die Funktion kann für 2-3 Stunden aktiviert werden, daher ist es wichtig, dass der Ping kontinuierlich und zeitnah gesendet wird.Wie wird ein Ping einmal pro Minute zuverlässig an den Server gesendet?

Um dies zu erreichen, verwende ich derzeit AsyncTasks (zum Senden der Anfrage), die einmal pro Minute über einen Vordergrund-Service gestartet werden, der mit setManager setExactAndAllowWhileIdle geplant ist. Der Vordergrund-Dienst hat auch eine teilweise wakelock!

Leider sieht es aus wie Marshmallows Doze-Modus schluckt die Alarme an einem beliebigen Punkt. Dies geschieht JEDERZEIT und an beliebigen Stellen. Manchmal sendet die App Pings für 2 Stunden ohne Probleme, manchmal nur für 30 Minuten, bevor sie nicht mehr ausgehen (und dann 10-15 Minuten später neu gestartet werden).

Was kann ich tun, um den Ping kontinuierlich zu erhalten? Es ist unglaublich wichtig für die App. Die einzige andere Alternative, die ich sehen kann, ist, dass ich das GCM dazu nutze, alle fünf Minuten Nachrichten mit hoher Priorität zu senden, um sie am Leben zu erhalten, aber das wäre ein schrecklicher Hack.

Antwort

0

Bitten Sie den Benutzer, Ihre App zur Akku-Optimierungs-Whitelist hinzuzufügen.

Oder bitten Sie den Benutzer, diese Funktion nur zu verwenden, wenn er an ein Ladegerät oder einen externen Akku angeschlossen ist.

Oder bitten Sie den Benutzer, sein Gerät alle paar Minuten für ein paar Momente zu wackeln, um Android zu überzeugen, dass es nicht im Leerlauf auf einem Nachttisch sitzt.

Oder erstellen Sie Ihr eigenes benutzerdefiniertes ROM, in dem Sie Maßnahmen ergreifen, um Android so zu modifizieren, dass Ihre App eine beliebige Menge Strom verbraucht, und lassen Sie die Benutzer dann Ihr benutzerdefiniertes ROM installieren.

Beachten Sie, dass AFAIK Ihre GCM-Lösung muss jede Minute sein, nicht alle fünf Minuten, wenn Sie "Pings" jede Minute senden möchten. Die GCM-Lösung verhindert nicht, dass das Gerät in den Doze-Modus wechselt. Es ermöglicht Ihnen lediglich, Nachrichten an die App zu senden und ein kurzes Konnektivitätsfenster zu öffnen. Es ist möglich, dass das Fenster 5+ Minuten ist, aber ich würde nicht darauf zählen.

Beachten Sie, dass Sie in der Tat sagen, dass die CPU auf kontinuierlich für Ihre 2-3 Stunden Fenster, aufgrund Ihrer teilweise WakeLock sein muss. Sie sagen auch, dass ein Radio (WiFi oder Mobilfunk) für einen Großteil dieser Zeit in einem Hochleistungsmodus sein wird, da sie eine Reihe von Leistungszuständen mit relativ langsamen Übergangszeiten durchlaufen, und eine minutenlange Menge von Pakete werden das Radio zurück in den High-Power-Zustand schieben. Was Sie tun, ist außergewöhnlich schlecht für die Akkulaufzeit.

Wenn Ihre Benutzer zustimmen, dass das, was Sie tun, "unglaublich wichtig" zu ihnen ist, werden sie nichts dagegen haben, Sie zur Whitelist hinzuzufügen, oder nur diese Funktion während auf einem Ladegerät verwenden.

+0

Das Hinzufügen der App zur Optimierungs-Whitelist wird nicht helfen, da Sie in 9 Minuten nicht mehr als ein Wakeup erhalten. – rastik

Verwandte Themen