AlarmManager setExact con WakefulBroadcastReceiver a veces no es exacto

Uso de Android 19+

SetExact en conjunto con WakefulBroadcastReceiver a veces no se dispara a tiempo (puede ser unos segundos o tan tarde). Me refiero a la mayoría de las veces que lo hace. Probablemente 49 veces de 50 su correcto.

No estoy seguro de si es sólo porque el sistema está ocupado en el momento y no puede manejar la carga de trabajo o lo que

Aquí es cómo puse la alarma:

AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(AlarmReceiver.INTENT_FILTER); PendingIntent alarmIntent = PendingIntent.getBroadcast(context, MyApplication.ALARM_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmMgr.setExact(AlarmManager.RTC_WAKEUP, timeToWakeUp, alarmIntent); 

Aquí está mi código de receptor:

 public class AlarmReceiver extends WakefulBroadcastReceiver { public static final String INTENT_FILTER = "myfilter"; @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, MyWakefulService.class); startWakefulService(context, service); } } 

Y en el WakefulService

 public class MyWakefulService extends IntentService { .... @Override protected void onHandleIntent(Intent intent) { .... 

Este comportamiento se agrega en API 19:

Comenzando con la entrega de alarmas API 19 (KITKAT) es inexacta: el sistema operativo cambiará las alarmas para minimizar los despertares y el uso de la batería. Existen nuevas API para admitir aplicaciones que requieren garantías de entrega estrictas; Vea setWindow (int, long, long, PendingIntent) y setExact (int, long, PendingIntent) . Las aplicaciones cuyo targetSdkVersion es anterior a la API 19 seguirán viendo el comportamiento anterior en el que todas las alarmas se entregan exactamente cuando se solicitan.

Desde AlarmManager .

Importante : setExact() todavía no tiene que ser exacto, como el estado de documentos:

La alarma se entregará lo más posible al tiempo de activación solicitado.

Para la era de la melcocha (?), Necesitamos algunos códigos feos como abajo …: (Y "delayInMillis" parámetro debe ser más de 15 minutos en la API 23. Si no, el sistema ignora los minutos menos de 15 minutos.

 private void registerExactAlarm(PendingIntent sender, long delayInMillis) { final int SDK_INT = Build.VERSION.SDK_INT; AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); long timeInMillis = (System.currentTimeMillis() + delayInMillis) / 1000 * 1000; //> example if (SDK_INT < Build.VERSION_CODES.KITKAT) { am.set(AlarmManager.RTC_WAKEUP, timeInMillis, sender); } else if (Build.VERSION_CODES.KITKAT <= SDK_INT && SDK_INT < Build.VERSION_CODES.M) { am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, sender); } else if (SDK_INT >= Build.VERSION_CODES.M) { am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeInMillis, sender); } } 
  • ¿Cómo guardar la alarma programada después de que la aplicación fue asesinada por Android o asesino de tareas?
  • Cancelar un AlarmManager pendienteIntent en otro pendienteintent
  • ¿Hay alguna forma de comprobar si ya está configurada una alarma?
  • Notificación de incendio cada 24 horas ya la hora exacta de 8 AM
  • IntentService no comenzará a usar AlarmManager
  • Evitar que la alarma de repetición ocurra el fin de semana
  • ¿Cómo se inicia una Actividad con AlarmManager en Android?
  • Notificación de repetición diaria de Android en el momento específico de un día mediante AlarmManager
  • AlarmManager en fecha y hora específicas
  • Alarmmanager.setRepeating dispara Inmediatamente
  • ¿Cuál es la mejor manera de crear un recordatorio de citas en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.