Wie funktioniert der Alarm Manager bei Android 6.0 im Doze-Modus?

Ich bin Entwickler von zwei Wecker-Apps bei Google Play. Ich versuche, sie mit Android 6.0 arbeiten zu lassen. Der Doze-Modus macht es jedoch so, dass sie nicht klingeln. Ich lege sie auf die weiße Liste, ich lege ein Vordergrund-Benachrichtigungssymbol auf, ich bin mir nicht sicher, was ich sonst noch machen kann – wenn im Alarmmodus die Alarme des Alarm-Managers immer noch ignoriert werden. Die App “Uhr” (die eher eine Google Play- als eine AOSP-App ist) unterscheidet sich jedoch. Wenn der Wecker in der Uhr-App aktiviert ist, wird “adb deviceidle step” immer “active” und niemals “idle”, “idle_pending” oder irgendetwas anderes lesen.

Ist Android hier betrügen, gibt seine eigene App mehr Macht, aka. “einen Apfel ziehen”? Sind alle Wecker-Apps auf Google Play nicht mehr funktionsfähig? Irgendwie beunruhigt, hier handelt es sich um hochwertige Apps, die jeweils ein Jahr Entwicklungszeit in Teilzeit in Anspruch nehmen und eine große Einnahmequelle für mich darstellen. Irgendwelche Hinweise darauf, wie ich diese zur Arbeit bringen könnte, wären eine große Hilfe.

AlarmManager-Absicht einstellen:

Intent intent = new Intent(context, ReceiverAlarm.class); if (android.os.Build.VERSION.SDK_INT >= 16) { intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); } amSender = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); //FLAG_CANCEL_CURRENT seems to be required to prevent a bug where the intent doesn't fire after app reinstall in KitKat am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, scheduleToTime+1, amSender); 

und die ReceiverAlarm-class:

 public class ReceiverAlarm extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if (wakeLock == null) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle); wakeLock.acquire(); } X.alarmMaster.startRingingAlarm(true); } 

und die relevanten Teile der X.alarmMaster.startRingAlarm () Methode:

  if (wakeLock == null) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle); wakeLock.acquire(); } if (screenWakeLock == null) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); screenWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, Theme.appTitle+" scr"); screenWakeLock.acquire(); } Intent alarmIntent = new Intent(Intent.ACTION_VIEW); alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); alarmIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); alarmIntent.setClass(context, ActivityAlarmAlarm.class); context.startActivity(alarmIntent); 

Einige der Methoden wurden zur leichteren Lesbarkeit inline eingefügt.

Doze und App Standby ändern definitiv das Verhalten in Bezug auf Alarme und Wakelocks, aber sie sind definitiv nicht das Ende der Welt für dich!

Haben Sie versucht, die Methode setAlarmclock() anstelle von set() ? Es ist speziell für Wecker entwickelt und kann durchschlitzen. Es gibt ein paar adb-Befehle, die Sie verwenden können, um ein Telefon manuell in den Schlaf- oder App-Standby-Modus zu versetzen: https://developer.android.com/preview/features/power-mgmt.html

Wenn das Ihre App nicht wecken kann, gibt es die todsichere Methode setExactAndAllowWhileIdle() entwickelt, um das Telefon aus dem setExactAndAllowWhileIdle() egal was setExactAndAllowWhileIdle() . Im schlimmsten Fall können Sie Ihre App mit dieser Methode aufwecken und den Weckruf verwenden, um den nächsten Alarm zu planen.

Eine weitere Seite, die es wert ist, gelesen zu werden, ist dieser Blogbeitrag mit seinem Flussdiagramm für Hintergrundarbeiten und Alarme: https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo

Setzen Sie die Anwendung in die Whitelist und erlauben Sie nur das Netzwerk im Doze-Modus. Der AlarmManager wird nicht von der Whitelist beeinflusst.

Für die Methode setExactAndAllowWhileIdle () überprüfen Sie bitte die folgende Beschreibung von SDK. Es wird das Telefon nicht von dösen erwachen.

Wenn der Alarm ausgetriggers wird, wird die App außerdem für etwa 10 Sekunden der temporären Whitelist des Systems hinzugefügt, damit diese Anwendung weitere Wake Locks erhält, mit denen sie ihre Arbeit abschließen kann.