使用Alarmmanager在特定时间启动服务

我已经search了很多地方,但无法find一个干净的顺序解释如何启动一个服务(或如果这是不可能的,然后一个活动)在每天的特定时间使用AlarmManager?

我想注册几个这样的警报,并触发它们应导致服务启动。 我会在服务中有一小段代码,然后可以执行,我可以完成良好的服务….

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

我试过这个代码来激活在4.45的报警…但它没有发射服务…我必须保持过程运行? 我做错了什么?

还有一件事,我的服务得到完美的执行情况下,我使用下面的代码:

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

你好朋友,经过大量的研究,并参考了“奔腾10”在同一话题上的提问,我设法让它工作。 虽然我仍然不能理解为什么我在问题中提到的“date”概念和日历(非GregorianCalendar)对象无法正常工作。

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

然后在你的AlarmReciever类里面是一个broadcastReciever,在onRecieve方法下放你的逻辑。 在下午7时20分时,这将处理你想要处理的逻辑。

如果您需要设置多个警报,请创build另一个日历实例并适当设置时间值。 您还需要为pendingIntent创build另一个实例,否则定时器将重叠。 然后将其设置为与new timer&pendingIntent相同的alarmManager。

您可以从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); 

//设置闹钟在上午8:30开始

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

// setRepeating()让你指定一个精确的自定义时间间隔 – 在这种情况下,// 20分钟。

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

我试了很多时间,所以我有一个解决scheme

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

从dateselect器“返回Long timeMileSec =毫秒”差异

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

//返回两个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; } 

代码不起作用。

这个代码适合我。

飞蛾法令1.和小时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); 

下面的代码应该可以正常工作,并且每天晚上7:40 PM启动服务。 另外,如果设备closures,则所有的警报都会被取消。

确保在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);