android - 在特定时间调用 AlarmManager
问题描述
我想每天早上 6 点开始闹钟。我写了下面的代码,但我在调用服务后立即发出警报,而不是保留并设置为早上 6 点。我的问题是什么?我在广播接收器中调用此方法并每秒重复调用一次!如果我将我的代码更改为以下代码,我的闹钟会按时正常工作。
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, new Date().getTime()+2*60*1000, monitoringSchedulePI);
private void setSingleExactMonitoringSchedule() {
final AlarmManager alarmManager = (AlarmManager) KITILApplication.getappContext().getSystemService(Context.ALARM_SERVICE);
Date date = new Date();
Log.e("MonitoringScheduleDate:", "Broadcast:" + date.toString());
Intent monitoringScheduleIntent = new Intent(KITILApplication.getappContext(), AlarmManagerBroadcastReciever.class);
monitoringScheduleIntent.putExtra(AppConstant.REQUEST_CODE_RECEIVER, AppConstant.REPEAT_GET_SCHEDULE);
PendingIntent monitoringSchedulePI = PendingIntent.getBroadcast(KITILApplication.getappContext(), OfflineData.getUniqueIdMonitoringSchedule(KITILApplication.getappContext()), monitoringScheduleIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,6);
calendar.set(Calendar.MINUTE,0);
long trigger=calendar.getTimeInMillis();
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, trigger, monitoringSchedulePI);
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP,trigger, monitoringSchedulePI);
}else{
alarmManager.set(AlarmManager.RTC_WAKEUP, trigger, monitoringSchedulePI);
}
}
解决方案
使用下面的代码。它会起作用的。
private void setSingleExactMonitoringSchedule() {
final AlarmManager alarmManager = (AlarmManager) KITILApplication.getappContext().getSystemService(Context.ALARM_SERVICE);
Date date = new Date();
Log.e("MonitoringScheduleDate:", "Broadcast:" + date.toString());
Intent monitoringScheduleIntent = new Intent(KITILApplication.getappContext(), AlarmManagerBroadcastReciever.class);
monitoringScheduleIntent.putExtra(AppConstant.REQUEST_CODE_RECEIVER, AppConstant.REPEAT_GET_SCHEDULE);
PendingIntent monitoringSchedulePI = PendingIntent.getBroadcast(KITILApplication.getappContext(), OfflineData.getUniqueIdMonitoringSchedule(KITILApplication.getappContext()), monitoringScheduleIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,6);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.DATE, 1);/*call from next day*/
long trigger=calendar.getTimeInMillis();
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()
, AlarmManager.INTERVAL_DAY, monitoringSchedulePI);
}
推荐阅读
- node.js - 当目标具有基本 url (NodeJs http-express-proxy) 时,Url 转发不起作用
- php - 无法从 WooCommerce 结帐中保存自定义复选框值
- flutter - 如何让用户使用 JWT 登录 Flutter 应用程序?
- python - 生成 Google 搜索 url 的 Python 程序
- excel - 选择除标题以外的所有使用范围
- java - 传递空值时区分名称相同但参数列表不同的两个方法
- javascript - 仅匹配空格而不匹配选项卡、回车或 Javascript 中的谎言提要的正则表达式
- javascript - 如何修复 JavaScript 中未定义的 TypeError?对象的所有字段都存在
- android - Android wear os 在设备上试用时显示心率为 1
- facebook - 使用 FB Live 但未经审查的应用程序使用 FB Graph API 在 Facebook 页面上发布