如何无意中消除通知?

时间:2019-05-18 16:12:17

标签: android notifications android-notifications

我想在应用程序内显示一条通知,当点击该通知而不启动活动时,该通知会消失。

我使用一个空的意图,并且有效:

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)
    ...

根据this SO answer,崩溃似乎是由于intent没有开始活动而发生的。

可以通过其ID消除通知,但是当没有活动可启动并调用dismiss方法时,我无法将其消除。

如何在不使用空意图的情况下轻按应用内的轻击通知?


更新:

根据this SO questions,这似乎是Android问题。我报告的崩溃也发生在Android 4.3上。

更新2:

根据this SO answer,这似乎是由于setLargeIcon设置的位图太大。所以现在我要用Glide减小位图的大小。

3 个答案:

答案 0 :(得分:1)

您可以创建一个调用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);
    }
}

答案 1 :(得分:1)

如果您不想在用户点击通知时启动活动,则可以构建挂起的意图,该意图发送广播或启动服务。

这里是一个例子:

PendingIntent.getBroadcast(context, 12, new Intent("any intent action"), PendingIntent.FLAG_UPDATE_CURRENT)

答案 2 :(得分:1)

但是阻止您的活动执行以下操作的原因:

@Override
public void onCreate(Bundle savedInstanceState) {}

清单中有其他nodisplay主题:

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

这仅仅是一个no-op