java - 在一定范围内设置重复警报并在不受用户干预的情况下重新启动警报
问题描述
我正在创建一个饮用水提醒应用程序(我已经搜索并尝试过,但我没有看到解决方案),其想法是让用户输入开始时间、间隔和结束时间。几乎一切正常,但是当到达结束时间时,闹钟并没有设置为第二天,而是每隔一分钟左右开始响起。
基本上我想要实现的是,如果警报的结束时间到了,它将在第二天建立,无需用户干预。
我已经尝试过这些方法Calendar.before ()
,Calendar.after ()
但我没有看到结果。
Calendar now = Calendar.getInstance();
// cancel already scheduled reminders
cancelWaterReminder(context);
Calendar calendarEndTime = Calendar.getInstance();
calendarEndTime.set(Calendar.HOUR, userPrefs.getWaterReminder_toHour());
calendarEndTime.set(Calendar.MINUTE, userPrefs.getWaterReminder_toMin());
calendarEndTime.set(Calendar.SECOND, 0);
Calendar calendarStartTime = Calendar.getInstance();
calendarStartTime.set(Calendar.HOUR_OF_DAY, hour);
calendarStartTime.set(Calendar.MINUTE, min);
calendarStartTime.set(Calendar.SECOND, 0);
// Enable a Broadcast receiver
ComponentName receiver = new ComponentName(context, WaterAlarmReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Intent intent1 = new Intent(context, WaterAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, DAILY_WATER_REMINDER_REQUEST_CODE, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
//Here is where i try to set and reset alarms
//according to the current hour, start hour and end hour.
if (now.after(calendarEndTime))
{
//calendarStartTime.add(Calendar.DAY_OF_MONTH, 1);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendarStartTime.getTimeInMillis(), 1000 * 60 * interval, pendingIntent);
}
else if (calendarStartTime.before(calendarEndTime))
{
am.setRepeating(AlarmManager.RTC_WAKEUP, calendarStartTime.getTimeInMillis(), 1000 * 60 * interval, pendingIntent);
setWaterReminderEndTime(context, userPrefs.getWaterReminder_toHour(), userPrefs.getWaterReminder_toMin());
}
解决方案
我的猜测是问题出在下面一行:
am.setRepeating(AlarmManager.RTC_WAKEUP, calendarStartTime.getTimeInMillis(), 1000 * 60 * interval, pendingIntent);
可能您设置interval
为1
并且您没有添加日期乘数 ( 24
) 来安排第二天,这就是为什么警报每分钟都会响起的原因。
如果以上是问题,以下更改应该可以解决,
am.setRepeating(AlarmManager.RTC_WAKEUP, calendarStartTime.getTimeInMillis(), 1000 * 60 * 24 * interval, pendingIntent);
推荐阅读
- java - 从数据库中获取图像并直接将其读入面板
- git - 解决 GIT 中针对分叉回购的拉取请求的冲突
- php - Wordpress Plugin Ajax 将 Javascript 数组数据转换为 PHP 变量
- angularjs - 如何在 $window.open url 中传递不记名令牌
- android - 如何自定义“Ok Google”语音命令?
- ruby-on-rails - 杀死 Heroku 上的调度程序进程
- c# - WebConfig & EF 6 & DbFirst & Oracle - 无法将 OracleConnection 转换为 SqlConnection
- entity-framework - 如何先手动将表添加到实体框架模型数据库
- android - 无法从我的 Android 应用程序下载来自 youtube 或 vimeo 的视频
- powerapps - 文本传入时字段增长