Android - проблема с сервисом отправки нескольких локальных уведомлений

Я унаследовал кодовую базу для приложения Android и столкнулся с особой проблемой локальных уведомлений.

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

Все работает просто отлично, за исключением того, что после того, как уведомление выдается впервые, если пользователь открывает приложение до начала события, уведомление выдается в другой раз. Это происходит каждый раз, когда приложение открывается между (дата начала события - напоминание) и датой начала события.

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

В настоящее время структура кода выглядит следующим образом:

Редактировать - обновленное описание TabBarActivity

Внутри TabBarActivity у меня есть методscheduleTravelNotification который планирует AlarmManager. Этот метод выполняется каждый раз, когда в локальную базу данных добавляется новое событие или если существующее событие было обновлено. TabBarActivity запускает этот метод внутри методов onCreate и onResume. TabBarActivity также является целью уведомления - событие onclick.

private static void scheduleTravelNotification(Context context, RouteItem routeItem) {

    long currentTime = System.currentTimeMillis();
    int alarmTimeBefore = routeItem.getAlarmTimeBefore();
    long alarmTime = routeItem.getStartTime() - (alarmTimeBefore * 1000 * 60);

    if(alarmTimeBefore < 0){
        return;
    }

    if(alarmTime < currentTime){
        return;
    }

    Intent actionOnClickIntent = new Intent(context, TravelNotificationReceiver.class);
    PendingIntent travelServiceIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis(), actionOnClickIntent, PendingIntent.FLAG_ONE_SHOT);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(alarmTime);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), travelServiceIntent);

    Log.e("NEXT ALARM", "Time: " + String.valueOf(calendar.getTimeInMillis()));
}

ЭтоTravelNotificationReceiver.java (я должен использовать LocalBroadcastReceiver вместо BroadcastReceiver?)

public class TravelNotificationReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("RECEIVER", "received TravelNotification request");
        Intent notificationIntent = new Intent(context, TravelNotificationService.class);
        context.startService(notificationIntent);
    }
}

TravelNotificationService.java продолжаетсяNotificationService.java установка как type = "Travel", флаги = 0, title = "что-то" и text = "что-то еще".

public abstract class NotificationService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        sendNotification();
        return super.onStartCommand(intent, flags, startId);
    }

    public abstract String setNotificationType();
    public abstract int setNotificationFlags();
    public abstract String setNotificationTitle();
    public abstract String setNotificationText();

    /**
     * Executes all the logic to init the service, prepare and send the notification
     */
    private void sendNotification() {

        int flags = setNotificationFlags();
        String type = setNotificationType();

        NotificationHelper.logger(type, "Received request");

        // Setup notification manager, intent and pending intent
        NotificationManager manager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE);
        Intent intentAction = new Intent(this.getApplicationContext(), TabBarActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, intentAction, flags);

        // Prepares notification
        String title = setNotificationTitle();
        String text = setNotificationText();
        Notification notification = NotificationHelper.buildNotification(getApplicationContext(), title, text, pendingIntent);

        // Effectively send the notification
        manager.notify(101, notification);

        NotificationHelper.logger(type, "Notified");
    }
}

Изменить - вот код для NotificationHelper.buildNotification

    public static Notification buildNotification(Context context, String title, String text, PendingIntent pendingIntent) {

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

        builder.setAutoCancel(true);
        builder.setContentText(text);
        builder.setContentTitle(title);
        builder.setContentIntent(pendingIntent);
        builder.setSmallIcon(R.mipmap.launcher);
        builder.setCategory(Notification.CATEGORY_MESSAGE);
        builder.setVisibility(Notification.VISIBILITY_PUBLIC);

        return builder.build();
    }

Спасибо за ответы!

Изменить Я также виделэтот но не имеет принятых ответов, покаэтот сообщение предлагает что-то, с чем, я думаю, уже справились if (alarmTime <currentTime) {return; } в scheduleTravelNotification.

Ответы на вопрос(4)

Ваш ответ на вопрос