Frage AlarmManager funktioniert nicht in mehreren Geräten


Meine App verwendet AlarmManager und es funktioniert seit 4 Jahren. Aber ich habe festgestellt, dass es in einigen Geräten fehlgeschlagen ist.

Ich bin mir ziemlich sicher, dass der Code richtig ist (ich verwende WakefulBroadcastReceiver und setExactAndAllowWhileIdle für Geräte mit Doze), weil es perfekt auf Nexus-Geräten funktioniert, aber es scheitert in Geräten einiger Hersteller (Huawei, Xiaomi ...).

Huawei-Geräte verfügen beispielsweise über eine Art Batteriemanager, der Apps killt, und wenn eine App beendet wird, werden geplante Alarme abgebrochen. Eine App als "geschützt" im Huawei Batteriemanager zu lösen, löst das Problem.

Aber vor kurzem habe ich bemerkt, dass es nicht mit mehr Geräten funktioniert: Xiaomi, Samsung (vielleicht ist es mit dem neuen "Smart Manager" verwandt?) ... Es scheint, dass dieses Verhalten zu einem Standard wird: Hintergrund Apps zu töten.

Wer weiß etwas darüber? Wie kann man sicherstellen, dass der Alarm ausgelöst wird?


76
2018-01-11 19:56


Ursprung


Antworten:


Ich versuche es schon einige Wochen zu lösen. Ich habe nichts gefunden. Huawei tötet einfach alle Alarme nach einiger Zeit. Wenn ich die App im Akku-Schoner auf die geschützte App bringe, hilft das nicht. Aber wenn ich den Paketnamen meiner App so ändere, dass sie Wörter wie Wecker, Uhr oder Kalender enthält, funktioniert das wie bei jedem anderen Gerät völlig 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 zum Erliegen bringt, wenn der Benutzer sie nicht benutzt. Aber dieses Töten alarmiert auch von geschützten Apps.

Auch setAlarmClock () für genaue Timing-Alarme hilft. Aber es ist nicht möglich, dies zu verwenden, um wie Widget-Update zu denken.


9
2018-02-05 11:34



Das Problem ist Smart Manager. Samsung verfügt über einen Batteriemanager, mit dem bestimmte Apps im Hintergrund manchmal deaktiviert werden. Es hat versucht, "fortzufahren", wenn man zurück zur App geht, aber die Anwendung vollständig deaktiviert oder alle 5 Minuten oder so fortsetzen kann (abhängig davon, wie Samsung es hat).

Dies würde auf Aktienversionen von Android funktionieren, da es keinen Samsung Manager gibt. Sie können auch benutzerdefinierte Version von Android installieren, die einige Funktionen hat, um SM zu aktivieren (abhängig von der ROM).


8
2018-01-20 02:02



Verwenden Sie AlarmManager für <5.0 Geräte und JobScheduler für 5.0+ Geräte. Ich kann nicht mit Sicherheit sagen, dass JobScheduler von Hersteller-Shenanigans nicht betroffen sein wird, aber es scheint mir viel weniger wahrscheinlich, da Android versucht, Leute vom AlarmManager weg und auf JobScheduler zu bringen.


2
2018-06-01 21:10



Ich habe den AlarmManager vor einiger Zeit nicht mehr benutzt ... eine bessere und stabilere Alternative

  1. Erstelle einen Service
  2. Registrieren Sie einen BroadcastReceiver für BOOT_COMPLETED
  3. feuern Sie Ihren Service vom Empfänger ab
  4. Starten Sie einen neuen Handler in Ihrem Dienst, der sich alle X Minuten wiederholt (Android - Ausführen einer Methode mithilfe des postDelayed () -Aufrufs)
  5. Überprüfen Sie, ob die Zeit zum Ausführen der Aufgabe gekommen ist: jetzt - Ausführungszeit> 0 (Wie finde ich die Dauer der Differenz zwischen zwei Daten in Java?)
  6. Wenn ja, führen Sie die Aufgabe aus und stoppen Sie den Handler

ja .. es ist ein Schmerz..aber der Job erledigt, egal was


1
2018-01-19 21:23



Hören Sie auf BOOT_COMPLETED? Sie müssen beim Neustart eines Geräts erneut Alarme einstellen.


1
2018-01-20 01:57



Ich habe auch eine App, die Alarme setzt. Die Lösung ist zu verwenden AlarmManager.setAlarmClock () auf api> = 21. Dies ist nicht von dösen afaik und hat den zusätzlichen Vorteil, ein Wecker-Symbol in der Taskleiste zu setzen.


1
2018-01-28 08:00



Die meisten modernen Android-Geräte sind mit einer App oder einem Mechanismus ausgestattet, der automatisch versucht herauszufinden, wie der Akku gespart werden kann und dadurch bestimmte Apps von Drittanbietern zum Absturz bringen kann. 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 Akku-Speicher-Mechanismen von Android, in meinem Fall könnte ich nicht mehr Akku-Optimierung machen, wenn ich einige Geräte Modell erkennen, ich umleiten Benutzer an den Start-up-Manager, um meine Anwendung Whitelist

Sie haben in diesem Link für jedes Modell die Absicht gefunden, die Sie aufrufen sollten https://android-arsenal.com/details/1/6771 


1
2017-08-01 11:19



Die meisten neuen Telefone sind heutzutage mit einer Art Batterie / Energiesparmanager gebündelt, die das Gleiche tun, was Sie beschrieben haben. Duboster und saubere Meister nicht mitgerechnet.

Ich denke, du musst einen Disclaimer oder eine FAQ in deinen App / Play Store-Eintrag schreiben, der besagt, dass diese App eine Ausnahme von deiner Batterie-Manager-App sein muss, um richtig zu funktionieren.


0
2018-01-13 22:21



Welche Version von Android laufen diese Geräte?

Ab API 23 wird das Betriebssystem selbst in einen stromsparenden Leerlaufmodus versetzt, wenn es für eine Weile nicht benutzt wurde, und in diesem Modus werden keine Alarme ausgegeben. Es gibt eine Möglichkeit für Apps, explizit zu sagen: "Ich brauche diesen Alarm zu diesem Zeitpunkt unabhängig von der Batteriebenutzung". die neuen AlarmManager-Methoden aufgerufen setAndAllowWhileIdle() und setExactAndAllowWhileIdle().

Aus Ihrer Beschreibung geht hervor, dass dies möglicherweise nicht die besondere Ursache für Ihre Probleme auf bestimmten Geräten von OEMs ist, aber das sollten alle Entwickler wissen, die den Alarm Manager verwenden.

Schließlich können viele Anwendungen des Alarm Managers besser mit den Mechanismen des Job Schedulers behandelt werden. Aus Gründen der Abwärtskompatibilität ist der "GCM Network Manager" von Play Services dem Job Scheduler in der Funktionalität sehr ähnlich - er verwendet den Job Scheduler intern bei neueren Versionen von Android - und geht trotz des Klassennamens nicht unbedingt um Vernetzung.


0
2018-01-21 01:56