Uso de Alarmmanager para iniciar un servicio en un momento específico

He buscado un montón de lugares, pero no podía encontrar una explicación secuencial limpio de cómo iniciar un servicio (o si eso no es posible, a continuación, una actividad) en un momento específico a diario con el AlarmManager ??

Quiero registrar varias de estas alarmas y activarlas debería resultar en un servicio que se iniciará. Voy a tener un pequeño pedazo de código en el servicio que luego puede ejecutar y puedo terminar el servicio para 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 ejecución ?? ¿Estoy haciendo algo mal ???

Una cosa más, mi servicio se ejecuta perfectamente en caso de que use el código siguiente:

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

6 Solutions collect form web for “Uso de Alarmmanager para iniciar un servicio en un momento específico”

HI amigos, Después de un montón de investigación y con referencia a la pregunta de "Pentium10" sobre el mismo tema que logré conseguir que funcione. Aunque todavía no puedo entender por qué el concepto de "fecha" y el calendario (no GregorianCalendar) objeto 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); 
 //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); 

Entonces en su clase de AlarmReciever que es un broadcastReciever, bajo onRecieve método poner su lógica. Esto se encargará de lo que nunca la lógica que desea manejar cuando llegue el momento a las 7:20 pm.

Si necesita configurar varias alarmas, cree otra instancia de Calendar y establezca los valores de hora apropiadamente. También es necesario crear otra instancia para pendingIntent, de lo contrario los temporizadores se superpondrán. A continuación, establezca el mismo alarmManager con nuevo temporizador & pendingIntent.

Puede leer el documento 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); 

// Establezca la alarma para que comience 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); 

He intentado mucho para iniciar el servicio a tiempo, así que tengo una solución como

  1) Calculate the **difference** between **current time and selected time** 

Del selector de fechas "Return Long timeMileSec = Milliseconds " Diferencia

  2) after this create a handler inside it and Sleep if "Milliseconds" seconds 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 Diferencia entre dos fechas

 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; } 

Los códigos no funcionan para mí.

Y este código funciona para mí.

Moth decrees 1. y 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); 

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

Asegúrese de configurar todas las alarmas después de completar BOOT.

 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); 
  • Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE
  • Acceda a Running service y llame a su método?
  • Cómo llamar al método en servicio de otra actividad
  • ¿Hay alguna manera de obtener actualizaciones de fondo de la API de Google Fit?
  • Android - Ejecutar en segundo plano - Service vs. standard java class
  • Servicio de Android: proceso vs. no
  • Recolector de datos de sensor de fondo en Android
  • GCM de Android SERVICE_NOT_AVAILABLE
  • Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
  • BadParcelableException: ClaseNotFoundException al unmarshalling
  • Detener el servicio hasta que se pueda establecer conexión a Internet
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.