Android:取消一个警报后,其他警报不起作用或延迟后,AlarmManager

时间:2019-10-09 06:24:14

标签: android broadcastreceiver alarmmanager

我有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 ,但得到的结果相同,但不起作用。

0 个答案:

没有答案