Как отклонить уведомление без намерения? - PullRequest
0 голосов
/ 18 мая 2019

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

Я использую пустое намерение, и оно работает:

Intent intent = new Intent();
PendingIntent contentIntent = PendingIntent.getActivity(context, (int)System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "")
                .setSmallIcon(R.drawable.icon)
                .setContentTitle(title)
                .setContentText(text)
                .setAutoCancel(true)
                .setTicker(text);
                .setContentIntent(contentIntent);

Однако есть некоторые сбои:

java.lang.RuntimeException: bad array lengths
    at android.os.Parcel.readIntArray(Parcel.java:789)
    at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:339)
    at android.app.NotificationManager.notify(NotificationManager.java:139)
    at android.app.NotificationManager.notify(NotificationManager.java:112)
    ...

Согласно этому SO-ответу кажется, что сбои происходят из-за того, что intent не запускает действие.

Уведомление может быть отклонено по его идентификатору, но я не могу отклонить его, если нет активности для запуска и вызова метода dismiss.

Как я могу отклонить уведомление при нажатии внутри приложения, не используя пустое намерение?


Обновление:

Согласно это ТАК вопросы , похоже, проблема с Android. Сообщения о сбоях, которые я получил, также произошли на Android 4.3.

Обновление 2:

Согласно этому SO-ответу это, похоже, связано с слишком большим битовым массивом, установленным с setLargeIcon. Теперь я уменьшаю размер растрового изображения с помощью Glide.

Ответы [ 3 ]

1 голос
/ 18 мая 2019

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

Вот пример:

PendingIntent.getBroadcast(context, 12, new Intent("any intent action"), PendingIntent.FLAG_UPDATE_CURRENT)
1 голос
/ 18 мая 2019

Но что мешает вашей деятельности иметь такую ​​реализацию:

@Override
public void onCreate(Bundle savedInstanceState) {}

с дополнительной темой nodisplay в манифесте:

android:theme="@android:style/Theme.NoDisplay"

Это будет просто no-оп один.

1 голос
/ 18 мая 2019

Вы можете создать намерение, которое вызывает BroadcastReceiver, которое затем отменяет уведомление.

Ваш PendingIntent может быть создан следующим образом:

private PendingIntent getCancelNotificationIntent() {
    Intent cancelIntent = new Intent(context, CancelNotification.class);
    return PendingIntent.getBroadcast(context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}

Класс CancelNotification.java будет выглядеть примерно так:

public class CancelNotification extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        notificationManager.cancel(NOTIFICATION_ID);
    }
}
...