Alarm Manager Запуск уведомлений в отложенное время - PullRequest
0 голосов
/ 18 октября 2019

Я работаю над существующим проектом. Я обновил целевую версию SDK до последней версии, так как ранее целевой SDK было 19 лет, и я внес некоторые изменения в пользовательский интерфейс существующего проекта, который я не разработал. Мое приложение имеет список, который должен быть уведомлен через уведомление о времени, выбранном пользователем. Я использовал Alaram Manager с широковещательным приемником для запуска уведомления. Код отлично работает в эмуляторе, но на реальных устройствах он ведет себя по-разному.

  • Redmi - версия 6 - отлично работает

  • Samsung-Версия 9 -Задержка уведомления на 3 минуты часто, а иногда и на ночь 3, 4 или 5. Выбирается, чтобы уведомление показывалось каждые 10 минут, но оно будет отображаться к 3:30, 4:35, 5:45. Такое поведение является случайным и не специфичным. иногда он срабатывает идеально на 10-й минуте.

  • Moto G 8.1 - иногда уведомления приходят дважды, иногда не срабатывают уведомления.

  • Версия Moto G7- Отлично работает и иногда выдает дважды уведомление одновременно.

В эмуляторе работает нормально. К сожалению, у меня есть только несколько устройств для тестирования.

Хорошо ли запускать этот код и как iIcheck регистрирует приложение, в котором apk установлен на тестовых устройствах? Я использую тестовые устройства работы тестовой команды в разных местах. Есть ли возможность сохранить логи на SD-карте пользователя на устройстве, где установлен apk? Как настроить журналы в устройстве?

Это код для сохранения данных:

Intent intentsOpenOnce = new Intent(context, AlarmReceiver.class);
                intentsOpenOnce.setAction("xx.xxx.xxx.ACTION");
                Utils.pendingIntentOnce = PendingIntent.getBroadcast(context,111, intentsOpenOnce, PendingIntent.FLAG_CANCEL_CURRENT);
                Utils.alarmManagerOnce = (AlarmManager) context.getSystemService(ALARM_SERVICE);
                if (Build.VERSION.SDK_INT >= 19){
                    Utils.alarmManagerOnce.setExact(AlarmManager.RTC_WAKEUP, calendaronce.getTimeInMillis(), Utils.pendingIntentOnce);
                }else{
                    Utils.alarmManagerOnce.setRepeating(AlarmManager.RTC_WAKEUP, calendaronce.getTimeInMillis(), AlarmManager.INTERVAL_HOUR,  Utils.pendingIntentOnce);
                }

Вот код, который я использую в широковещательном приемнике:

if (SOMEACTION.equals(action)) {
            if(isOnceAlarmExpired(Utils.pendingIntentOnce, Utils.alarmManagerOnce)) {
                return;
            }

            DateFormat df = new SimpleDateFormat("HH:mm", Locale.getDefault());
            String date = df.format(Calendar.getInstance().getTime()); 
            int currentHours;
            int currentMinute;
            String[] oneSeparated = date.split(":");
            currentHours = Integer.valueOf(oneSeparated[0]);
            currentMinute = Integer.valueOf(oneSeparated[1]);
            Utils.globalOnceTimerOneEndHour = Utils.sharedpreferences.getInt(Utils.endAlarmHour, 0);
            Utils.globalOnceTimerOneEndMinute = Utils.sharedpreferences.getInt(Utils.endAlarmMinute, 0);

            String endDateStr = Utils.sharedpreferences.getString(Utils.endAlarmDate, null);
            if((endDateStr != null) && (!endDateStr.trim().equalsIgnoreCase(""))) {
                Calendar endDateCal = Calendar.getInstance();
                try {
                    endDateCal.setTime(Utils.SDF_YYYY1MM1DD1HH1MM1SS1SSS.parse(endDateStr));
                } catch (java.text.ParseException e) {
                    Log.e(TAG, "[line#056]:onReceive():endDateCal.setTime()",e);
                }
                if(Calendar.getInstance().after(endDateCal)) {
                    boolean needToCancel = false;
                    if(Utils.globalOnceTimerOneEndHour <= currentHours){
                        if(Utils.globalOnceTimerOneEndMinute <= currentMinute){
                            needToCancel = true;
                        }
                    }
                    if(needToCancel){
                        if(Utils.alarmManagerOnce != null)  {
                            Utils.alarmManagerOnce.cancel(Utils.pendingIntentOnce);
                            if(Utils.pendingIntentOnce != null){
                                Utils.pendingIntentOnce.cancel();
                            }
                        }
                        return;
                    }
                }
            }
            if (Build.VERSION.SDK_INT >= 19) {
                Calendar hourlyCalendar = Calendar.getInstance();
                hourlyCalendar.add(Calendar.HOUR_OF_DAY, 1);
                hourlyCalendar.set(Calendar.MINUTE, Utils.sharedpreferences.getInt(Utils.globalOnceTimerMainMinute, 0));
                hourlyCalendar.set(Calendar.SECOND, 0);
                hourlyCalendar.set(Calendar.MILLISECOND, 0);
                Intent intentsOpenOnce = new Intent(context, AlarmReceiver.class);
                intentsOpenOnce.setAction("xx.xxx.xxx.ACTION");
                Utils.pendingIntentOnce = PendingIntent.getBroadcast(context, 111, intentsOpenOnce, PendingIntent.FLAG_CANCEL_CURRENT);
                Utils.alarmManagerOnce = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                Utils.alarmManagerOnce.setExact(AlarmManager.RTC_WAKEUP, hourlyCalendar.getTimeInMillis(), Utils.pendingIntentOnce);
            }
            fireNotification(context);
...