Необходимо отменить сигнал тревоги от установленных сигналов при нажатии кнопки - PullRequest
0 голосов
/ 19 января 2020

Мое приложение предназначено для водителей, которые могут принимать или отклонять поездки (которые могут быть несколько) при назначении из бэкэнда. Бэкэнд отправляет «детали задачи», включая запланированное время запуска. Водитель может начать поездку раньше запланированного времени начала. Я реализовал функцию воспроизведения звука за 30 минут до запланированного времени начала поездок, чтобы напомнить водителю о предстоящей поездке (ях). Я использовал тревоги для каждой принятой поездки для этого. Для этого я попытался сгенерировать уникальные случайные числа для использования в качестве кодов запроса для сигналов тревоги. Сигналы тревоги работают нормально. Однако мне нужна функция, при которой сигнал тревоги отменяется в случае, если пользователь отменяет поездку позже, после первоначального принятия поездки, чтобы звук не воспроизводился, когда пользователь отменил поездку.

У меня есть извлек подробности задачи из бэкэнда, и я поместил идентификатор задачи (каждая поездка имеет уникальный идентификатор задачи), запланированное время начала и код запроса (уникальное случайное число) в Hashmap всякий раз, когда пользователь нажимает кнопку, чтобы принять задачу (поездку) , Я поместил этот Hashmap в SharedPreference в качестве «значения» в нем.

Я генерирую уникальное случайное число (для использования в качестве кода запроса для тревоги), затем проверяю, существует ли оно в моем Hashmap (я получаю Hashmap из SharedPreference, как я его там и храню). Если число существует в Hashmap, я генерирую другое случайное число. Для этого я использовал следующий код:

 private int getRandNum() {
      // create instance of Random class
      Random rand = new Random();
      int requestCode;

      // Generate random integers in range 0 to 999
      requestCode = rand.nextInt(1000);

      HashMap<String, DataObject> map = preferencesHelper.getTaskDetails();
      if (map != null) {
          if (!map.isEmpty()) {
              for (Map.Entry<String, DataObject> stringLongEntry : map.entrySet()) {
                  DataObject dataObject = stringLongEntry.getValue();


                  if (requestCode == dataObject.getRequestCode()) {
                      requestCode = getRandNum();
                  }

              }

          }
      }
      return  requestCode;
  }

Я пытаюсь реализовать функцию отмены тревоги при нажатии кнопки. Происходит то, что другой сигнал тревоги отменяется, когда я реализую функцию отмены при нажатии кнопки.

Это способы реализации отмены сигнала тревоги:

Метод отмены сигнала тревоги при нажатии кнопки :

    public void onStartTask(Task task, int position) {
.
.
.
 HashMap<String, DataObject> map = preferencesHelper.getTaskDetails();
                        if (map != null) {
                            for (Map.Entry<String, DataObject> stringLongEntry : map.entrySet()) {
                                String taskId = String.valueOf(((Map.Entry) stringLongEntry).getKey());


                                if (taskId.equalsIgnoreCase(task.getTaskId())) {
                                    DataObject dataObject = stringLongEntry.getValue();


                                    CommonUtils.cancelAlarm(getBaseActivity().getApplicationContext(),
                                            ServiceRestartReceiver.ACTION_ALARM_BEFORE_X_MINUTE,
                                            dataObject.getRequestCode(), task.getTaskId());
                                }
                            }
                        }

        .
.
.
}

Метод с функцией отмены будильника:

  public static void cancelAlarm(Context context, String action, int requestCode, String taskId) {
            PendingIntent pendingIntent = getAlarmPendingIntent(context, action, requestCode, taskId);
            AlarmManager alarmMgr1 = (AlarmManager) context.getSystemService(ALARM_SERVICE);
            alarmMgr1.cancel(pendingIntent);
        }

Способ получения ожидающего намерения:

private static PendingIntent getAlarmPendingIntent(Context context, String action, int requestCode, String taskId) {
            Intent intents = new Intent(context, ServiceRestartReceiver.class);
            intents.setAction(action);
            intents.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
            if (taskId != null) {
                intents.putExtra("taskId", taskId);
            }
            return PendingIntent.getBroadcast(context, requestCode,
                    intents, PendingIntent.FLAG_UPDATE_CURRENT);
        }

Пожалуйста, помогите мне исправить это. Если при генерации случайного числа нет проблем, есть ли обходной путь для кодов в других моих методах?

Пожалуйста, любая помощь будет оценена по достоинству!

...