¿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
- Cómo determinar el remitente de Broadcast Intent
- El widget de Android funciona bien en el emulador pero en el teléfono se convierte en el widget de Google App
- Clear Aplicaciones recientes limpiar la memoria de aplicaciones y mi receptor dejó de funcionar
- No se puede instanciar el receptor en BroadcastReceiver SMS
- BroadcastReceiver SMS_Received no funciona en nuevos dispositivos
¿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.
- Recibir la misma intención difundió varias veces pero sólo envió una vez
- ¿Cómo detener / cancelar el administrador de alarmas en otra actividad?
- BroadcastReceiver recibe varios mensajes idénticos para un evento
- Incorrectos extras recibidos con todos los intentos, pero el primero
- ¿Por qué noftificaciones aparecen en la barra de notificación de Android por un tiempo, entonces desaparece
- Llamar a un método de actividad de una clase BroadcastReceiver
- Modo de timbre cambio de escucha Receptor de difusión?
- Establecer extras para BroadcastReceiver de DownloadManager
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.
- Android no pudo exportar la aplicación
- Android: ¿Cuál usar para el nombre del paquete? Nombre de paquete de manifiesto o aplicación de GradleId?