¿Cómo hacer que Alarm Manager funcione cuando Android 6.0 está en modo Doze?

Soy un desarrollador de dos aplicaciones de reloj despertador en Google Play. Estoy tratando de hacer que funcionen con Android 6.0. Sin embargo, el modo Doze lo hace para que no suenen. Los puse en la lista blanca, puse un ícono de notificación en primer plano, no estoy seguro de qué más puedo hacer, cuando estoy en el modo Doze, las alarmas de Alarm Manager aún se ignoran. La aplicación Reloj (que es una aplicación Google Play en lugar de AOSP), sin embargo, es diferente. Cuando la alarma está activada en la aplicación Reloj, “paso de adb deviceidle” siempre leerá “activo” y nunca “inactivo”, “inactivo” o cualquier otra cosa.

Es Android engañando aquí, dando a su propia aplicación más poder, también conocido como. “tirando una manzana”? ¿Están a punto de dejar de funcionar todas las aplicaciones de reloj despertador en Google Play? Algo preocupado aquí, estas son aplicaciones de calidad que cada una tomó un año de tiempo de desarrollo a tiempo parcial, y son grandes fonts de ingresos para mí. Cualquier pista sobre cómo podría hacer que funcionen sería una gran ayuda.

Estableciendo la intención del 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); 

y la clase 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); } 

y las partes relevantes del método 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); 

Algunos de los métodos se han pegado en línea para facilitar la lectura.

Doze y App Standby definitivamente cambian el comportamiento en lo que respecta a alarmas y wakelocks, ¡pero definitivamente no son el fin del mundo para ti!

¿Has intentado utilizar el método setAlarmclock() lugar de set() ? Está diseñado específicamente para despertadores y es posible que pueda atravesar el sopor. Hay algunos comandos de adb que puede usar para poner un teléfono en modo dormido o en modo de espera de la aplicación manualmente: https://developer.android.com/preview/features/power-mgmt.html

Si eso no es capaz de reactivar su aplicación, existe el método seguro setExactAndAllowWhileIdle() está diseñado para despertar al teléfono de la setExactAndAllowWhileIdle() que setExactAndAllowWhileIdle() . En el peor de los casos, puede reactivar su aplicación con este método y usar la activación para progtwigr la próxima alarma.

Otra página que vale la pena leer es esta publicación de blog con su diagtwig de flujo para el trabajo de fondo y las alarmas: https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo

Poner la aplicación en la lista blanca solo permite la red en modo dormido. AlarmManager no se ve afectado por la lista blanca.

Para el método setExactAndAllowWhileIdle (), compruebe la descripción siguiente del SDK. No despertará al teléfono de la siesta.

Cuando se envía la alarma, la aplicación también se agregará a la lista blanca temporal del sistema durante aproximadamente 10 segundos para permitir que esa aplicación adquiera cerraduras adicionales para completar su trabajo.