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

JaV*_*did 27 service android alarm alarmmanager

我已经搜索了很多地方但是找不到如何使用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!!");
Run Code Online (Sandbox Code Playgroud)

我尝试使用此代码在4.45激活警报...但它没有启动服务...我是否必须保持进程运行?我做错了什么?

还有一件事,如果我使用以下代码,我的服务将完美执行:

long firstTime = SystemClock.elapsedRealtime();
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 30*1000,pintent);
Run Code Online (Sandbox Code Playgroud)

JaV*_*did 36

嗨朋友们,经过大量的研究和参考"Pentium10"对同一主题的问题,我设法让它运作起来.虽然我仍然无法理解为什么我在问题中提到的"日期"概念和日历(非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);
Run Code Online (Sandbox Code Playgroud)


M P*_*ama 8

//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);
Run Code Online (Sandbox Code Playgroud)

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

如果需要设置多个警报,请相应地创建另一个日历实例并设置时间值.您还需要为pendingIntent创建另一个实例,否则计时器将重叠.然后使用new timer&pendingIntent将其设置为相同的alarmManager.

  • 在这里使用广播接收器的逻辑是什么?我的意思是如果你想在某个时候做某事(例如得到温度),运行服务应该做的工作,对吧? (3认同)

小智 5

您可以从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);
Run Code Online (Sandbox Code Playgroud)

// 设置闹钟在早上 8 点 30 分开始

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);
Run Code Online (Sandbox Code Playgroud)

// setRepeating() 可让您指定精确的自定义间隔——在本例中为 // 20 分钟。

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        1000 * 60 * 20, alarmIntent);
Run Code Online (Sandbox Code Playgroud)