我必须在特定的时间每天拨打一个服务。显然我选择了AlarmManager
来唤醒我的服务。除了AlarmManager
以外,当我设置过去时,所有工作都很好时间。但是当我在当前时间之后设定时间时工作正常。
为了更好地澄清,我会说一个例子。
工作尝试:当前时间是
09.00 AM
我将时间表设置为10.00 AM
。AlarmManager
完美地完成了他的工作。FAILURE ATTEMPT:当前时间为
10.00 AM
我将时间表设置为09.00 AM
。AlarmManager
立即调用服务。
实际上我需要在预定的时间过后明天调用我的服务09.00 AM
。
我提到的一些查询几乎与这个相匹配,但它不够好。我做错了什么?
我的代码
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,10);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 00);
Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
myIntent.putExtra(ACTION, ACTION_SC_1);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, REQUEST_CODE_SC_1, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getBaseContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent);
答案 0 :(得分:1)
请勿使用上次IO中引入的警报管理器GcmNetworkManager。它将像魅力一样工作,你将能够设置不精确的警报,所以你不需要唤醒设备。来自谷歌IO网站:谷歌播放服务已经添加了GCM网络管理器,其主要功能类似于JobScheduler,但延伸到Lollipop之前的版本。
答案 1 :(得分:0)
与set(int,long,PendingIntent)类似,除了您还可以提供警报自动重复的时间段。此警报继续重复,直到使用cancel(PendingIntent)明确删除。 如果指定的触发时间是过去的,则会立即触发警报,警报计数取决于触发时间相对于重复间隔的过去程度。
这是故意这样的工作。
答案 2 :(得分:0)
正如Bonatti上面所说,当你在过去设定时间时,这是API的记录行为。
如果您想要设置闹钟,如果已经超过上午10点,您的应用中需要使用逻辑将闹钟推出24小时。
最简单的方法是使用Calendar对象,然后查询
if (calendar.after(SystemClock.currentTimeMillis()) {
// Push alarm out til tomorrow.
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
答案 3 :(得分:0)
如果您需要在早上9点触发闹钟,请不要使用setRepeating(),因为它不会在自Android KitKat之后的确切时间启动(这也是文档记录,您应该真正阅读文档)。
使用日历根据所需的闹钟时间构建时间戳。检查结果时间戳是否小于当前时间戳System.currentTimeMillis(),在这种情况下它是过去所以添加24小时以便为第二天安排它。 最后,在旧版本上使用AlarmManager.set()或在较新版本的Android上使用AlarmManager.setExact()来安排警报。警报响起后,您可以使用相同的技术安排下一个警报。