2010-06-07 22 views
6

tengo este código¿Cómo configurar una alarma para que se active correctamente en un tiempo fijo?

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 en 23: 22h

lo que estoy haciendo mal? Noté que firstTime y c.getTimeInMillis() difieren mucho en tamaño y longitud. Cuando uso firstTime, de modo que cuando se establece en 30 segundos, la alarma se ejecuta bien.

+0

que he visto que en este ejemplo: http://www.google .com/codesearch/p? hl = es # kZ0MkhnKNzw/trunk/Photostream/src/com/google/android/photostream/CheckUpdateService.java & q = setRepeating% 20package: http: //apps-for-android%5C.googlecode%5C .com & sa = N & cd = 1 & ct = rc – Pentium10

Respuesta

10

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

Debe usar AlarmManager.RTC o AlarmManager.RTC_WAKEUP si especifica la hora de la alarma con un objeto Calendario o Fecha (milisegundos desde 1970).

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

3

Para conseguir que la alarma se apaga 30 segundos a partir de ahora, utilice

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 le dice al AlarmManager que el tiempo que le está dando se basa en el tiempo desde el inicio del sistema. Esto está bien por 30 segundos a partir de ahora, pero si desea que se base en tiempo real, debe usar RTC o RTC_WAKEUP. Ver javadoc para una explicación completa de esos tipos.

+0

Tengo que irme a una hora específica 23: 22h. Ya tengo una solución de trabajo que se activa en 30 segundos, eso está funcionando bien. – Pentium10

+0

Ah, lo siento, he leído mal la pregunta. Ver editar. –

8

que tuvieron éxito con el siguiente código, si sólo desea configurar la alarma para la siguiente instancia 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 ... 
    } 
+0

Esta es la respuesta exacta que alarma de incendio al día siguiente si el tiempo se había ido –

Cuestiones relacionadas