Usar Alarmmanager para comenzar un servicio en un momento específico

He buscado en muchos lugares, pero no he podido encontrar una explicación secuencial limpia de cómo iniciar un servicio (o si eso no es posible, a continuación, una actividad) a una hora específica a diario utilizando el AlarmManager?

Quiero registrar varias de esas alarmas y desencadenarlas debería dar como resultado el inicio de un servicio. Voy a tener un pequeño código en el servicio que luego se puede ejecutar y puedo terminar el servicio para siempre …

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!!"); 

Probé este código para activar la alarma a las 4.45 … pero no enciende el servicio … ¿tengo que mantener el proceso en funcionamiento? ¿Estoy haciendo algo mal?

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

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

Amigos de HI, después de investigar mucho y con la referencia de la pregunta de “Pentium10” sobre el mismo tema, logré que funcionara. 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); 
 //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 AlarmReciever, que es un broadcastReciever, en el método Reciba, ponga 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 y establezca los valores de tiempo de manera apropiada. También necesita crear otra instancia para pendingIntent; de lo contrario, los temporizadores se superpondrán. A continuación, configúrelo en el mismo AlarmManager con el 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); 

// Configurar la alarma para que comience a las 8:30 a.m.

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

los códigos no funcionan para mí.

y este código funciona para mí.

decretos polilla 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 bien 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); 

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

  1. Calcule la diferencia entre la hora actual y la hora seleccionada desde el selector de fecha “Volver Long timeMileSec = Milliseconds ” Diferencia

  2. después de esto, crea un controlador dentro de él y espera 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; } 
Intereting Posts