Я работаю над существующим проектом. Я обновил целевую версию 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);