¿Cómo configurar una alarma para disparar correctamente a tiempo fijo?

Tengo este código

Calendar c = new GregorianCalendar(); c.add(Calendar.DAY_OF_YEAR, 1); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 22); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); // We want the alarm to go off 30 seconds from now. long firstTime = SystemClock.elapsedRealtime(); firstTime += 30*1000; long a=c.getTimeInMillis(); // Schedule the alarm! AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE); am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, c.getTimeInMillis(), 1*60*60*1000, sender); 

No se ejecuta a las 23: 22h

¿Que estoy haciendo mal? He notado firstTime y c.getTimeInMillis () difiere mucho en tamaño y longitud. Cuando utilizo firstTime, así que cuando se fija a 30 segundos, la alarma se ejecuta bien.

Está utilizando el indicador AlarmManager.ELAPSED_REALTIME_WAKEUP , pero está utilizando un objeto Calendar. Estas dos cosas no van juntas.

Necesita utilizar AlarmManager.RTC o AlarmManager.RTC_WAKEUP si especifica la hora de la alarma utilizando un objeto Calendario o Fecha (milisegundos desde 1970).

Utiliza AlarmManager.ELAPSED_REALTIME o AlarmManager.ELAPSED_REALTIME_WAKEUP cuando especifica la hora de la alarma a través de SystemClock.elapsedRealtime() (milisegundos desde que se inició el teléfono).

He tenido éxito con el siguiente código, si sólo desea configurar la alarma para la siguiente ocurrencia de hh: mm

 Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(System.currentTimeMillis()); cal.set(Calendar.HOUR_OF_DAY, 22); cal.set(Calendar.MINUTE, 19); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); //check if we want to wake up tomorrow if (System.currentTimeMillis() > cal.getTimeInMillis()){ cal.setTimeInMillis(cal.getTimeInMillis()+ 24*60*60*1000);// Okay, then tomorrow ... } 

Para que la alarma se apague en 30 segundos a partir de ahora, use

 Calendar cal = Calendar.getInstance(); 

Para obtener la hora actual, y luego

 AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+30000, sender); 

Editar:

Creo que el problema es ELAPSED_REALTIME_WAKEUP. Esto indica al AlarmManager que el tiempo que le está dando se basa en el tiempo transcurrido desde el inicio del sistema. Esto está bien por 30 segundos a partir de ahora, pero si desea que se basen en tiempo real debe utilizar RTC, o RTC_WAKEUP. Ver javadoc para una explicación completa de esos tipos.

  • Intercepción de SMS de Android sin icono de notificación o mensajes WAP-PUSH
  • Son varios receptores de radiodifusión legal en android?
  • ¿Cómo ser notificado de que cada nueva imagen sea visible para la aplicación de la galería?
  • ¿Cómo iniciar la actividad de intentservice?
  • SMS recibidos en mi aplicación de SMS y en Hangouts, aunque llamo a abortBroadcast ()
  • No puede recibir eventos relacionados con la red
  • Compruebe si hay un BroadCastReceiver registrado con una cadena de acción
  • Determine el clic de addAction para notificaciones de Android
  • Huh? FindViewById () no se puede llamar dentro de onReceive ()?
  • BroadcastReceiver permiso para el shell de adb
  • No se puede encontrar el receptor definido Definido ~ 1% del tiempo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.