2017-02-18 1 views
-1

Grundsätzlich bin ich stecken, weil die "Verbesserungen" in der Batterie in Android 6.0 + hinzugefügt. Meine App unterstützt API von 11+Richtige Art des Laufens IntentService alle x Minuten in Android, dösen inbegriffen

Szenario

Hier ist mein Szenario: meine App holt Daten von einem Web-Service eines 3rd-Party-Server. Da es nicht mein Server ist, habe ich keine Kontrolle darüber, wann Daten hinzugefügt oder entfernt werden. Die Verfügbarkeit der Daten ist unterschiedlich. Ich möchte in der Lage sein, einen IntentService zu feuern, um die Daten zu holen, zum Beispiel alle 30/60 Minuten für die nächsten 6 Stunden. Auf diese Weise können die Daten in meiner App den Fall abdecken, wenn die Daten vom Server nicht mehr verfügbar sind. Natürlich muss das gehen, auch wenn meine App geschlossen ist.

Sie können sagen, dass dies nicht mit der Batterie freundlich ist, aber es ist eine Option für Power-User zur Hand haben.

Was habe ich bisher

Ich habe viel mit der Einstellung Alarms zu kämpfen. Während das Einstellen eines sich wiederholenden Alarms der einfachste und bequemste Weg war, es zu funktionieren, erwies es sich als zuverlässig bis nur android 5.0.

Beginnend mit der Einführung von Doze, nach der Dokumentation, die Alarme werden auf maintenance window verschoben und da diese Fenster um 1-2-4 und so auf Stunden kommen, ist es nicht für meine Bedürfnisse geeignet.

Ich gab die Verwendung von Set repeating auf und versuchte, eine einmalige Alarm zu verwenden, die innerhalb der IntentService Ausführung neu geplant wird. Von Test setExact schien nicht gut zu laufen, aber dann versucht setExactAndAllowWhileIdle, die tatsächlich im richtigen Moment feuern, aber wenn in Doze Modus, hat es keine Netzwerk-Konnektivität Zugriff, so dass es nutzlos.

Trotzdem bin ich nicht sicher, was passiert, wenn ein Alarm mit setRepeating oder setExact verzögert wird, aber das Gerät ist vor dem nächsten Wartungsfenster wecken ...

Grundsätzlich jetzt ich stecken bin, mit einem Mechanismus, der nicht der Fall ist Arbeit und ich weiß nicht, was sonst zu wählen angesichts der Android-Versionen von der App und den Anforderungen unterstützt.

LE: eigentlich bin ich mir nicht bewusst, eine nette Art und Weise Hintergrundjobs auf Android einzustellen, sogar ohne Doze. Ich meine, wir haben die JobScheduler, die scheint eine nette Sache zu tun ... aber hey, es ist nur auf Android 21 und nicht rückwärts unterstützt ... ich meine wirklich, eine einfache Sache zu tun, und ich warte schon ein paar Tage bis jetzt.

Antwort

1

Wenn sich das Gerät im Leerlaufmodus befindet (wegen des Doze-Systems), bedeutet dies, dass der Benutzer es nicht aktiv verwendet. Daher sehe ich im nächsten Wartungsfenster kein Problem mit der Verschiebung Ihres Auftrags (Aktualisierung) .

das Telefon zum Aufwachen Die einzige Möglichkeit, Zugang zum Internet gewähren wird mit

setAlarmClock() 

Wenn Sie setAlarmClock() verwenden, dann wird das Gerät in den Ruhezustand wenige Minuten vor der Alarmzeit verlassen: dies auf dem abhängig Konfiguration der Doze, die Sie und tatsächlich zu Testzwecken mit Shell-Befehlen ändern. Sie sollten setAlarmClock() in Ausnahmefällen verwenden, um wichtige Kalenderereignisse zu erinnern.

Auch wenn Sie es einstellen, sollte ein Symbol (eine Glocke) in der Statusleiste angezeigt werden: es ist der gleiche Mechanismus, der für den Systemalarm verwendet wird.

Übrigens würde ich diesen Ansatz abraten und auf das nächste Wartungsfenster warten. In der Tat sollten Sie den Abstimmungsmechanismus überhaupt vermeiden.

+0

Danke, 'setAlarmClock' scheint die einzige echte Option zu sein, aber in der Tat ist es ein, aber außerhalb des Umfangs. – Alin