【问题标题】:Notification Auto-Cancel does not call DeleteIntent通知自动取消不会调用 DeleteIntent
【发布时间】:2012-10-25 22:21:12
【问题描述】:

我正在我的应用中实现 GCM 并保留通知的哈希值以跟踪通知阴影中的内容(我必须根据用户是否进入应用来更改意图)。

我为所有通知设置了 deleteIntent PendingIntent。所有这一切都是从我的本地哈希中删除通知,这样它就不会再更新了。如果我清除所有或滑动以删除通知,则意图被触发。但是,我还将通知设置为自动取消。点击通知不会触发我的通知的 deleteIntent。

我的问题是,当我的通知被自动取消时,有什么方法可以通知?

【问题讨论】:

  • 我在我的应用程序中观察到相同的行为。我不确定这种行为是否取决于某些手机型号。我使用三星 Galaxy Ace 进行测试,确实自动取消不会触发 deleteIntent。

标签: android google-cloud-messaging


【解决方案1】:

这个错误has been reported,但看起来根本没有被调查过。为了解决这个问题,我做了以下工作:

  • 关闭自动取消
  • 对内容使用广播并通过不同的操作删除意图
  • 广播接收器检查操作
    • 内容操作:同时执行点击和删除操作,并手动取消通知
    • 删除操作:仅执行删除操作

例如:

发送通知

Notification.Builder builder = new Notification.Builder(context)
    // Set other properties (not auto-cancel)
    .setContentIntent(PendingIntent.getBroadcast(context, 0, new Intent(NOTIFICATION_CLICKED_ACTION), 0))
    .setDeleteIntent(PendingIntent.getBroadcast(context, 0, new Intent(NOTIFICATION_DELETED_ACTION), 0));
notificationManager.notify(NOTIFICATION_ID, builder.build());

接收广播

if (intent.getAction().equals(NOTIFICATION_CLICKED_ACTION)) {
    startActivity(new Intent(context, MyActivity.class));
    notificationManager.cancel(NOTIFICATION_ID);
}
// Do deletion behaviour here (for both click and delete actions)

【讨论】:

  • 这里是新手。我在哪里写“接收广播”代码?
  • @NehaK 通常这将在后台运行的服务中。
  • 未来的读者,你可以通过NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);获得notificationManager
  • 只想向可能遇到此解决方案的人指出,它不适用于针对 Android 12 的应用程序,因为 Google 已对他们所谓的通知蹦床添加了限制:developer.android.com/about/versions/12/…
【解决方案2】:

这是 Android SDK 文档中 here 中描述的 DeleteIntent 的正确行为:

提供一个 PendingIntent 以在通知被清除时发送 由用户明确

只有当用户通过滑动或使用通知菜单的“全部清除”功能明确清除通知时,才会调用 DeleteIntent。即使 AutoCancel 设置为 True,点击通知也只会触发 ContentIntent。

【讨论】:

  • 抱歉,投反对票为documentation describes here使用 setDeleteIntent(PendingIntent) 设置的 PendingIntent 将在发生这种情况时发送
  • @IljaS。你和我说的一样:当通知明确时,调用 setDeleteIntent 设置的待处理意图。
  • 我不觉得触摸通知与“用户明确清除”是一样的。这两个动作的意图并不相同。当用户打算与应用程序交互时,他们会触摸它。当用户打算忽略该应用程序时,他们将清除/关闭它。他们不应该被同等对待。
【解决方案3】:

文档说herehere,点击带有 FLAG_AUTO_CANCEL 的通知会自动取消它。此行为还意味着常规 contentIntent(如果已设置)将与自动取消一起触发,因为它是为响应用户的点击操作而触发的。 使用 contentIntent 字段和 deleteIntent 来检测由显式用户点击执行的取消。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多