Это мой вариант использования. Я генерирую различные виды уведомлений, если разница между временем окончания и текущим временем превышает 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);
}