我有Alarms.java类,在其中实现了设置警报和关闭警报的方法。看起来像:
public class Alarms {
private Context context;
private DevicesTable devicesTable;
private ArrayList<DeviceItem> deviceItems;
private ArrayList<AlarmManager> managerArrayList;
private final String TAG = "ALARMTEST";
public Alarms(Context context) {
this.context = context;
this.devicesTable = new DevicesTable(context);
this.deviceItems = devicesTable.fetchAllRecords();
this.managerArrayList = new ArrayList<>();
}
public void setAlarm() {
// checking all schedules for every device
// ONLY FOR START
for (final DeviceItem deviceItem : this.deviceItems) {
for (final ScheduleItem scheduleItem : deviceItem.getScheduleItems()) {
Intent intent = new Intent(this.context, AlarmBroadcastReceiver.class);
intent.putExtra("DeviceItem", deviceItem.getPhone());
intent.putExtra("ScheduleItem", scheduleItem.getId());
intent.putExtra("TAG", "START-AUTO");
final int _id = deviceItem.getId() * 10 + scheduleItem.getId();
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context, _id, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmManager != null) {
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
scheduleItem.getStartCalendar(deviceItem.getWorking_time()).getTimeInMillis(),
AlarmManager.INTERVAL_DAY, // scheduled daily, it easier to do
pendingIntent);
this.managerArrayList.add(alarmManager);
}
}
}
Log.d(TAG, "setAlarm");
}
public void cancelAlarm(int device_item_id, int schedule_item_id) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this.context, AlarmBroadcastReceiver.class);
final int _id = device_item_id * 10 + schedule_item_id;
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context, _id, intent, 0);
if (alarmManager != null) {
alarmManager.cancel(pendingIntent);
Log.d(TAG, "cancelled alarm for device id: " + device_item_id + " schedule id: " + schedule_item_id);
}
}
}
某些情况。当我创建一个警报时,它可以完美工作,并在声明的时间唤醒。当我创建两个警报时,它也可以完美运行,并且在声明的时间唤醒。因此,当我创建两个警报并删除第一个警报时,我的 BroadcastReceiver 不起作用,或者第二个警报被延迟了10-15分钟。每个ID都是唯一的,我已经检查过了。我不知道该如何解决。有人有同样的问题吗?我尝试在 cancelAlarm 上调用 setAlarm ,但得到的结果相同,但不起作用。