¿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.

  • Recibir la misma intención difundió varias veces pero sólo envió una vez
  • Abra la actividad haciendo clic en la notificación push de Parse
  • Compruebe si hay un BroadCastReceiver registrado con una cadena de acción
  • El envío de una nueva intención a un receptor de radiodifusión da valores extras de intenciones anteriores
  • Android: la aplicación sin actividad de LAUNCHER no funciona
  • BroadcastReceiver permiso para el shell de adb
  • BroadcastReceiver CONNECTIVITY_CHANGE siempre se ejecuta en la primera vez que se inicia la aplicación?
  • Cómo filtrar correctamente Paquete reemplazado broadcast
  • BroadcastReceiver ClassNotFound Exception
  • SMS no se puede prevenir usando abortBroadcast ()?
  • Corregir el patrón para adquirir un WakeLock en un BroadcastReceiver y liberarlo en un servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.