Отмена повторяющегося уведомления Android на салфетки - PullRequest
0 голосов
/ 04 мая 2019

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

У меня есть функция с именем showChronometer, которая обрабатывает рендеринг различных видов макетов на основе уведомлений. Тем не менее, случай использования заключается в том, что если пользователь ударил уведомление, то мы отклоняем уведомление, и это уведомление с идентификатором уведомления больше никогда не будет отображаться.

К сожалению, несмотря на то, что намерение удаления ожидает отклонение уведомления менеджером уведомлений. Диспетчер аварийных сигналов по-прежнему генерирует уведомления после того, как уведомление было отклонено

public Notification makeNotification()
  {
    final NotificationCompat.Builder builder = makeNotificationBuilder();
    if (builder == null)
        return null;

    final RemoteViews collapsedView = makePrimaryView(COLLAPSED_RES_ID);
    builder.setContent(collapsedView);

    if (rawNotification.getTitle() != null)
        builder.setContentTitle(rawNotification.getTitle());
    if (rawNotification.getBody() != null)
        builder.setContentText(rawNotification.getBody());

    PendingIntent cpi = getPendingClickIntent();
    if (cpi != null)
        builder.setContentIntent(cpi));

    PendingIntent dpi = getDeletePendingIntent();
    if (dpi != null)
        builder.setDeleteIntent(dpi);

    addButtons();

    builder.setAutoCancel(true);


    return builder.build();
}

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

Вот мой код Alarm Manager.

     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent expireHandler = injectNotificationAlarmReceiverIntent();
    long now = System.currentMilliseconds();
    long timeDiff = endingTime * DateUtils.SECOND_IN_MILLIS - now;


    // If more than 60 seconds are remaining, the show the text in normal style.
    PendingIntent initialPendingIntent = injectPendingIntent(expireHandler);
    PendingIntent pendingIntentAtOneMinute = injectPendingIntent(expireHandler);
    if (now < (endingTime * DateUtils.SECOND_IN_MILLIS - DateUtils.MINUTE_IN_MILLIS))
    {
        alarmManager.setExactAndAllowWhileIdle(
            AlarmManager.RTC_WAKEUP,
            endingTime * DateUtils.SECOND_IN_MILLIS - DateUtils.MINUTE_IN_MILLIS, initialPendingIntent);

        showChronometer(rootView, timeDiff, false);
        alarmManager.cancel(initialPendingIntent);
    }
    else if (now < endingTime * DateUtils.SECOND_IN_MILLIS)
    {
        alarmManager.setExactAndAllowWhileIdle(
            AlarmManager.RTC_WAKEUP, endingTime * DateUtils.SECOND_IN_MILLIS,
            pendingIntentAtOneMinute);

        showChronometer(rootView, timeDiff, true);
        alarmManager.cancel(pendingIntentAtOneMinute);
    }
    else
    {
        rootView.setViewVisibility(R.id.notification_countdown, View.GONE);
        rootView.setViewVisibility(R.id.notification_countdown_60s, View.GONE);
        rootView.setViewVisibility(R.id.notification_time_expired, View.VISIBLE);

        // Chronometer is enabled.
        rootView.setTextViewText(R.id.notification_content, "text body");
    }



@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
    PendingIntent injectPendingIntent(Context context, Intent intent)
    {
        return PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_ONE_SHOT);
    }
...