Android: AlarmManager после отмены одного будильника, другой не работает или имеет задержку - PullRequest
0 голосов
/ 09 октября 2019

У меня есть класс 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 минут. Каждый идентификатор уникален, я проверил это. Я не знаю, как это исправить. У кого-то есть такая же проблема? Я пытался вызвать setAlarm на cancelAlarm void, и я получил те же результаты, но он не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...