2010-06-16 11 views
22

He buscado en muchos lugares pero no pude encontrar una explicación secuencial limpia de cómo iniciar un servicio (o si eso no es posible luego una actividad) a una hora específica diaria usando el AlarmManager ??Uso de Alarmmanager para iniciar un servicio en un momento específico

Quiero registrar varias alarmas de este tipo y desencadenarlas debería dar como resultado el inicio de un servicio. Voy a tener una pequeña pieza de código en el servicio que puede ejecutar y que pueda terminar el servicio para el bien ....

Calendar cal = Calendar.getInstance(); 
Calendar cur_cal = Calendar.getInstance(); 
cur_cal.setTimeInMillis(System.currentTimeMillis()); 
Date date = new Date(cur_cal.get(Calendar.YEAR), cur_cal.get(Calendar.MONTH), cur_cal.get(Calendar.DATE), 16, 45); 
cal.setTime(date); 
Intent intent = new Intent(ProfileList.this, ActivateOnTime.class); 
intent.putExtra("profile_id", 2); 
PendingIntent pintent = PendingIntent.getService(ProfileList.this, 0, intent, 0); 
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent); 
System.out.println("The alarm set!!"); 

he intentado este código para activar la alarma a las 4.45 ... pero no está disparando el servicio ... ¿tengo que mantener el proceso en funcionamiento? M ¿Estoy haciendo algo mal?

Una cosa más, mi servicio se ejecute a la perfección en caso de que utilice el siguiente código:

long firstTime = SystemClock.elapsedRealtime(); 
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 30*1000,pintent); 
+0

posible duplicado de [Cómo configurar una alarma para disparar correctamente a tiempo fijo?] (Http://stackoverflow.com/questions/2992882/how-to-set-an-alarm-to-fire- proper-at-fixed-time) – Pentium10

+1

miré tu pregunta "Pentium10" y supongo que es similar, pero ¿encontraste la solución para la misma? – JaVadid

Respuesta

30

Hola amigos, Después de mucha investigación y con referencia a la pregunta "Pentium10" 's en el mismo tema lo logré para que funcione. Aunque todavía no entiendo por qué el concepto de "fecha" y el objeto Calendario (no GregorianCalendar) que he mencionado en la pregunta no funcionan correctamente.

Calendar cur_cal = new GregorianCalendar(); 
cur_cal.setTimeInMillis(System.currentTimeMillis());//set the current time and date for this calendar 

Calendar cal = new GregorianCalendar(); 
cal.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR)); 
cal.set(Calendar.HOUR_OF_DAY, 18); 
cal.set(Calendar.MINUTE, 32); 
cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND)); 
cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND)); 
cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE)); 
cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH)); 
Intent intent = new Intent(ProfileList.this, IntentBroadcastedReceiver.class); 
PendingIntent pintent = PendingIntent.getService(ProfileList.this, 0, intent, 0); 
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 
+0

En este código, la alarma comienza a las 18:32 del mismo día, ¿verdad? – Sver

+0

Intente utilizar el objeto Time, y también, de acuerdo con la documentación, esta alarma comenzará a las 18:32 UTC – gregm

+0

@JaVadid: Tengo la misma Pregunta, por favor, ayúdeme para eso. Aquí está: http://stackoverflow.com/questions/10039593/android-alarm-to-be-play-every-30-minutes-and-it-start-from-1230/10039699#10039699 –

7
//Create alarm manager 
AlarmManager alarmMgr0 = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

//Create pending intent & register it to your alarm notifier class 
Intent intent0 = new Intent(this, AlarmReciever.class); 
PendingIntent pendingIntent0 = PendingIntent.getBroadcast(this, 0, intent0, 0); 

//set timer you want alarm to work (here I have set it to 7.20pm) 
Intent intent0 = new Intent(this, OldEntryRemover.class); 
Calendar timeOff9 = Calendar.getInstance(); 
timeOff9.set(Calendar.HOUR_OF_DAY, 19); 
timeOff9.set(Calendar.MINUTE, 20); 
timeOff9.set(Calendar.SECOND, 0); 

//set that timer as a RTC Wakeup to alarm manager object 
alarmMgr0.set(AlarmManager.RTC_WAKEUP, timeOff0.getTimeInMillis(), pendingIntent0); 

Luego, en su clase de AlarmReciever que es un broadcastReciever, bajo el método onRecieve poner su lógica. Esto se encargará de la lógica que quieras manejar cuando llegue el momento de las 7.20 p. M.

Si necesita establecer varias alarmas, cree otra instancia de Calendario & establezca los valores de tiempo de forma adecuada. También necesita crear otra instancia para pendingIntent; de lo contrario, los temporizadores se superpondrán. Luego configúrelo en el mismo AlarmManager con el nuevo temporizador & pendingIntent.

+3

¿Cuál es la lógica del uso del receptor de difusión aquí? Es decir, si quieres hacer algo en algún momento (por ejemplo, obtener la temperatura), ejecutar un servicio debería hacer el trabajo, ¿verdad? – MSaudi

+0

De hecho, un servicio será una mejor opción si la "lógica" es más que mostrar un brindis. Además, la nomenclatura variable podría mejorarse. – Entalpi

1

He intentado un montón iniciar el servicio en tiempo, así que tengo una solución como

  1. Calcular la diferencia entre hora actual y el tiempo seleccionado del selector de fechas "retorno a largo timeMileSec = Millisegundos "Diferencia

  2. después de esto crear un controlador dentro de él y Suspender si" Millisegundos "segundos

    new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         CreateService(); 
         getActivity().startService(intentServiceObj); 
        } 
    }, timeMileSec); 
    
    
    // Below is the service Methods. 
    private void CreateService() { 
        Calendar cal = Calendar.getInstance(); 
        cal.setTimeInMillis(System.currentTimeMillis()); 
    
        cal.add(Calendar.DAY_OF_YEAR, year); 
        cal.set(Calendar.HOUR_OF_DAY, hourScreen); 
        cal.set(Calendar.MINUTE, minuteScreen); 
    
        // cal.setTimeInMillis(timeselectedmillisecond); 
    
        Intent intent = new Intent(getActivity(), 
         ServiceDailyLocationUpdate.class); 
        pintent = PendingIntent.getService(getActivity(), 0, intent, 0); 
    
        alarm = (AlarmManager) getActivity().getSystemService(
         Context.ALARM_SERVICE); 
    
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.HOUR, 86000 * 1000, 
         pintent); 
    
    } 
    
    // Return Differnce between two date 
    private long calculateDateDiffSecond(String firstDate, String secondDate) { 
    
        long numberOfDays = 0; 
    
        String dateStart = firstDate; 
        String dateStop = secondDate; 
    
        Date d1 = null; 
        Date d2 = null; 
    
        try { 
         d1 = sdfTime.parse(dateStart); 
         d2 = sdfTime.parse(dateStop); 
    
         // in milliseconds 
         long diff = d2.getTime() - d1.getTime(); 
    
         long diffSeconds = diff/1000 % 60; 
         long diffMinutes = diff/(60 * 1000) % 60; 
         long diffHours = diff/(60 * 60 * 1000) % 24; 
         long diffDays = diff/(24 * 60 * 60 * 1000); 
    
         System.out.print(diffDays + " days, "); 
         System.out.print("Hours::" + diffHours + " hours, "); 
         System.out.print("HoursMinute::" + diffMinutes + " minutes, "); 
         System.out.print(diffSeconds + " seconds."); 
         numberOfDays = diffDays; 
         numberOfDays = diff; 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        return numberOfDays; 
    
    } 
    
4

Usted puede leer documentos desde https://developer.android.com/training/scheduling/alarms.html

private AlarmManager alarmMgr; 
private PendingIntent alarmIntent; 

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmReceiver.class); 
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

// Establecer la alarma para comenzar a las 8:30 am

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 8); 
calendar.set(Calendar.MINUTE, 30); 

// setRepeating() le permite especificar un intervalo personalizado preciso - en este caso, // 20 minutos.

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
     1000 * 60 * 20, alarmIntent); 
1

códigos que no funcionan para mí.

y este código funciona para mí.

moth decrets 1. y las horas 0-11.

int day = ff.getGregorianDay() ; 
int month = ff.getGregorianMonth() ; 
int year = ff.getGregorianYear(); 
int hour = TimePicker1.getCurrentHour(); 
int minute = TimePicker1.getCurrentMinute(); 



Calendar cal_alarm = Calendar.getInstance(); 
cal_alarm.setTimeInMillis(System.currentTimeMillis()); 
cal_alarm.set(Calendar.YEAR, year); 
cal_alarm.set(Calendar.MONTH, month-1); 
cal_alarm.set(Calendar.DAY_OF_MONTH, day); 


cal_alarm.set(Calendar.AM_PM, Calendar.AM); 
cal_alarm.set(Calendar.HOUR, hour); 

if(hour >= 12){ 
    cal_alarm.set(Calendar.AM_PM, Calendar.PM); 
    cal_alarm.set(Calendar.HOUR, hour-12); 
} 
cal_alarm.set(Calendar.MINUTE, minute); 
cal_alarm.set(Calendar.SECOND, 0); 

Intent myIntent = new Intent(YadavariNewActivity.this, Alarm_Sag.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(YadavariNewActivity.this, 0, myIntent,0); 

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC_WAKEUP, cal_alarm.getTimeInMillis(), pendingIntent); 
+0

¿Qué significa ff aquí? –

+0

es una clase personalizada. tiene año mes y día. @ umar-ata –

+0

por qué no lo agrega en su respuesta –

0

El siguiente código debería funcionar correctamente e inicia el servicio a las 7:40 PM todos los días. Además, si el dispositivo se apaga, todas sus alarmas se cancelan.

Asegúrese de configurar todas las alarmas después de que se haya completado el arranque.

Intent slIntent = new Intent(this, x.class); 

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 19); 
calendar.set(Calendar.MINUTE, 40); 
calendar.set(Calendar.SECOND, 0); 

PendingIntent slPendingIntent = PendingIntent.getService(this, 1, slIntent, PendingIntent.FLAG_ONE_SHOT); 

AlarmManager alarmManager=(AlarmManager) getSystemService(Context.ALARM_SERVICE); 

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
          AlarmManager.INTERVAL_DAY, slPendingIntent); 
Cuestiones relacionadas