Comment faire pour que Alarm Manager fonctionne lorsque Android 6.0 en mode Doze?

Je suis développeur de deux applications de réveil sur Google Play. J’essaie de les amener à travailler avec Android 6.0. Cependant, le mode Doze fait en sorte qu’ils ne sonnent pas. Je les mets sur la liste blanche, je place une icône de notification au premier plan, je ne suis pas sûr de ce que je peux faire d’autre – en mode Doze, les alarmes du gestionnaire d’alarmes sont toujours ignorées. L’application Horloge (qui est une application Google Play plutôt que l’application AOSP), cependant, est différente. Lorsque l’alarme est activée sur l’application Clock, “adb deviceidle step” affichera toujours “active” et ne sera jamais “inactif”, “idle_pending” ou autre.

Est-ce que Android sortingche ici, donnant à sa propre application plus de puissance, alias. “tirer une pomme”? Toutes les applications de réveil sur Google Play sont-elles sur le sharepoint devenir non fonctionnelles? Un peu inquiet ici, ce sont des applications de qualité qui ont chacune pris un an de temps de développement à temps partiel, et sont des sources de revenus importantes pour moi. Tout indice sur la façon dont je pourrais les faire fonctionner serait une aide énorme.

Définition de l’intention de AlarmManager:

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); 

et la classe ReceiverAlarm:

 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); } 

et les parties pertinentes de la méthode X.alarmMaster.startRingingAlarm ():

  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); 

Certaines des méthodes ont été collées en ligne pour une meilleure lisibilité.

Doze et App Standby changent définitivement le comportement des alarmes et des wakelocks, mais ce n’est certainement pas la fin du monde pour vous!

Avez-vous essayé d’utiliser la méthode setAlarmclock() au lieu de set() ? Il est conçu spécifiquement pour les réveils et peut être capable de traverser le sumil. Il existe quelques commandes adb que vous pouvez utiliser pour mettre manuellement un téléphone en veille ou en mode veille: https://developer.android.com/preview/features/power-mgmt.html

Si cela ne vous permet pas de réveiller votre application, il existe la méthode setExactAndAllowWhileIdle() est conçue pour setExactAndAllowWhileIdle() le téléphone à tout prix. Dans le pire des cas, vous pouvez réactiver votre application avec cette méthode et utiliser le réveil pour planifier l’alarme suivante.

Une autre page à lire est ce billet de blog avec son organigramme pour le travail de fond et les alarmes: https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo

Mettre l’application en liste blanche permet uniquement le réseau en mode veille. AlarmManager n’est pas affecté par la liste blanche.

Pour la méthode setExactAndAllowWhileIdle (), consultez la description ci-dessous à partir du SDK. Cela ne réveillera pas le téléphone.

Lorsque l’alarme est dissortingbuée, l’application sera également ajoutée à la liste blanche temporaire du système pendant environ 10 secondes pour permettre à cette application d’acquérir des verrous de réveil supplémentaires.