Meine App verwendet AlarmManager und funktioniert seit 4 Jahren. Aber ich bemerkte, dass es bei einigen Geräten zu Fehlern kam.
Ich bin mir ziemlich sicher, dass der Code richtig ist (ich verwende WakefulBroadcastReceiver und setExactAndAllowWhileIdle für Geräte mit Doze), da er auf Nexus-Geräten einwandfrei funktioniert, bei Geräten einiger Hersteller (Huawei, Xiaomi ...) jedoch fehlschlägt.
Huawei-Geräte verfügen beispielsweise über eine Art Batteriemanager, mit dem Apps beendet werden. Wenn eine App beendet wird, werden geplante Alarme abgebrochen. Das Einstellen einer App als "geschützt" im Huawei-Akkumanager löst das Problem.
Aber kürzlich habe ich festgestellt, dass es nicht mit mehr Geräten funktioniert: Xiaomi, Samsung (vielleicht hängt es mit dem neuen "Smart Manager" zusammen?) ... Es scheint, dass dieses Verhalten zum Standard wird: Hintergrund-Apps zu töten.
Weiß jemand etwas darüber? Wie kann sichergestellt werden, dass ein Alarm ausgelöst wird?
BEARBEITEN: Dieses Problem wird durch "Batteriesparer" verursacht, die von verschiedenen Herstellern hinzugefügt wurden. Weitere Informationen hier: https://dontkillmyapp.com/
quelle
Antworten:
Ich versuche es schon einige Wochen zu lösen. Ich habe nichts gefunden Huawei beendet nach einiger Zeit alle Alarme. Wenn ich die App in die geschützte App in ihrem Batteriesparmodus lege, hilft das nicht. Wenn ich jedoch den Paketnamen meiner App so ändere, dass er Wörter wie Wecker, Uhr oder Kalender enthält, funktioniert dies wie auf allen anderen Geräten ganz normal. Ich verstehe nicht, wie Google diesen Mist zertifizieren kann. Ich denke, dass OEM die Kernplattform nicht so modifizieren sollte. Ich verstehe, dass sie einen eigenen Batter Saver haben, der die App nach einiger Zeit beendet, wenn der Benutzer sie nicht benutzt. Aber dieses Töten alarmiert auch geschützte Apps.
Auch setAlarmClock () für genaue Timing-Alarme hilft. Es ist jedoch nicht möglich, dies für Gedanken wie ein Widget-Update zu verwenden.
Update: Der Schutz durch Schlüsselwörter für Paketnamen funktioniert auf aktuellen Huawei-Geräten bereits nicht, dies war 2017 der Fall.
quelle
Das Problem ist Smart Manager. Samsung verfügt über einen Akku-Manager, der bestimmte Apps manchmal daran hindert, im Hintergrund ausgeführt zu werden. Es wurde versucht, beim Zurückkehren zur App "fortzufahren", deaktiviert die Anwendung jedoch vollständig oder wird möglicherweise alle 5 Minuten fortgesetzt (je nachdem, wie Samsung sie hat).
Dies würde auf Standardversionen von Android funktionieren, da es keinen Samsung Manager gibt. Sie können auch eine benutzerdefinierte Version von Android installieren, die einige Funktionen zum Aktivieren von SM bietet (abhängig von der Rom).
quelle
Die meisten modernen Android-Geräte verfügen über eine App oder einen Mechanismus, mit dem automatisch versucht wird, den Akku zu schonen, wodurch bestimmte Apps von Drittanbietern möglicherweise zerstört werden. Dies kann dazu führen, dass geplante Aufgaben und Jobs entfernt werden (z. B. Alarme werden nicht ausgelöst, Push-Benachrichtigungen funktionieren nicht usw.). In vielen Fällen geschieht dies völlig unabhängig von den Batteriesparmechanismen von Android. In meinem Fall konnte ich keine Batterieoptimierung mehr vornehmen, wenn ich ein Gerätemodell erkenne. Ich leite den Benutzer zum Startmanager um, um meine Anwendung auf die Whitelist zu setzen
Sie haben in diesem Link für jedes Modell die Absicht gefunden, https://android-arsenal.com/details/1/6771 aufzurufen
quelle
Verwenden Sie AlarmManager für <5.0-Geräte und JobScheduler für 5.0+ Geräte. Ich kann nicht sicher sagen, dass JobScheduler von den Spielereien der Hersteller nicht betroffen sein wird, aber es scheint mir viel weniger wahrscheinlich, da Android versucht, Menschen von AlarmManager auf JobScheduler zu verlagern.
BEARBEITEN: Google hat eine Erstanbieter -Lösung für dieses Problem namens WorkManager herausgebracht . Es abstrahiert mehrere Planungsframeworks und verwendet das für das Gerät am besten geeignete.
quelle
Hören Sie auf BOOT_COMPLETED? Sie müssen Alarme erneut einstellen, wenn ein Gerät neu gestartet wird.
quelle
Ich habe auch eine App, die Alarme setzt. Die Lösung besteht darin, AlarmManager.setAlarmClock () auf api> = 21 zu verwenden. Dies wird von doze afaik nicht beeinflusst und hat den zusätzlichen Bonus, ein Weckersymbol in die Taskleiste zu legen.
quelle
Die meisten neuen Telefone sind heutzutage mit einer Art Batterie- / Energiesparmanager ausgestattet, die dasselbe tun, was Sie beschrieben haben. Dubooster und saubere Meister nicht mitgerechnet.
Ich denke, Sie müssen einen Haftungsausschluss oder eine FAQ in Ihre App / Play Store-Liste aufnehmen, aus der hervorgeht, dass diese App in Ausnahme Ihrer Batteriemanager-App aufgenommen werden muss, damit sie ordnungsgemäß funktioniert.
quelle
Auf welcher Android-Version laufen diese Geräte?
Ab API 23 wechselt das Betriebssystem selbst in einen Leerlaufmodus mit geringem Stromverbrauch, wenn es eine Weile nicht verwendet wurde, und in diesem Modus werden keine Alarme ausgegeben. Es gibt jedoch eine Möglichkeit für Apps, explizit zu sagen: "Ich muss diesen Alarm zu diesem Zeitpunkt unabhängig vom Batterieverbrauch auslösen". Die neuen AlarmManager-Methoden heißen
setAndAllowWhileIdle()
undsetExactAndAllowWhileIdle()
.Aus Ihrer Beschreibung geht hervor, dass dies möglicherweise nicht die besondere Ursache für Ihre Probleme auf bestimmten OEM-Geräten ist. Dies sollten jedoch alle Entwickler, die den Alarm Manager verwenden, berücksichtigen.
Schließlich werden viele Verwendungen des Alarmmanagers mithilfe der Mechanismen des Job Schedulers besser behandelt. Aus Gründen der Abwärtskompatibilität ist der Play Services "GCM Network Manager" in seiner Funktionalität dem Job Scheduler sehr ähnlich - er verwendet den Job Scheduler intern in neueren Versionen von Android - und es geht trotz des Klassennamens nicht unbedingt um Netzwerk.
quelle
Ich glaube nicht, dass das Beenden der App den Alarmmanager daran hindert, Ihre App zu aktivieren.
Nur wenn Sie die App "erzwingen" oder deaktivieren, erhalten Sie keine Rückrufe vom Alarmmanager.
Die Grundursache könnte etwas anderes sein.
Auch auf M ... setExactAndAllowWhileIdle wird gedrosselt ... das heißt, wenn Sie alle 2 Minuten einen Alarm einplanen, wird dieser nicht ausgelöst. ..Es muss 15 Minuten Fenster sein. .
quelle
Für Xiaomi müssen Sie möglicherweise AutoStart für Ihre App aktivieren. Ich versuche, eine Liste von Android-Änderungen (normalerweise vom Hersteller des Telefons) zu erstellen, die einen Hintergrundprozess beeinflussen können. Wenn Sie etwas Neues haben, fügen Sie bitte hier eine Antwort hinzu. Liste der Android-Task-Killer
quelle
Wir müssen unsere App im Autostart-Manager im App-Manager aktivieren, einige Handys wie vivo v5,
In vivo v5 finden Sie dieses Menü unter iManager -> App Manager -> Auto Start Manager. Aktivieren Sie unsere App hier.
Dann löst Ihr Alarm / Alarmmanager einen Alarm aus, wenn die App beendet oder geschlossen wird.
quelle
Ich suchte nach einer Antwort und fand nach einigen Stunden Folgendes:
https://stackoverflow.com/a/35220476/3174791
Im Lebenslauf können Sie feststellen, ob Ihre App von "Geschützten Apps" getötet wurde. Dies funktioniert nur auf Huawei-Geräten. Lassen Sie mich wissen, ob es eine Lösung für andere Geräte gibt (Samsung, Sony, Xiaomi usw.).
quelle
Das mag spät sein, aber ich hoffe, es hilft jemandem.
Ich war so lange mit dem gleichen Problem beschäftigt. Aber jetzt weiß ich, wie ich dieses Problem lösen kann. Dies ist für alle, die das gleiche Problem haben könnten. Die Leute sagen immer wieder, dass Sie AutoStart aktivieren müssen, aber ich habe es ohne automatischen Start geschafft.
Zunächst einmal ist WakeFullBroadcastaReceiver jetzt veraltet und Sie sollten BroadcastReceiver verwenden. Zweitens müssen Sie den ForegroudService anstelle des BackgroundService verwenden.
Ich werde Ihnen das folgende Beispiel geben:
IntentService.class
Starten Sie den Vordergrunddienst in BroadcastReceiver.class
Und die setAlarms mögen das:
Dann müssen Sie den Empfänger und den Vordergrundservice im Manifest deklarieren.
Ich hoffe das hilft jemandem.
quelle
Ich habe vor einiger Zeit aufgehört, AlarmManager zu verwenden ... eine bessere und stabilere Alternative
Ja ... es ist ein Schmerz ... aber die Arbeit wird erledigt, egal was
quelle