通知自动取消不会调用 DeleteIntent

13

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

我为所有的通知设置了deleteIntent PendingIntent。这只是从我的本地哈希中删除通知,使其不会再更新。如果我清除所有通知或滑动删除通知,该意图可以正常触发。但是,我还将我的通知设置为自动取消。点击通知不会触发我的通知的deleteIntent。

我的问题是,有没有办法在我的通知被自动取消时收到通知?


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

21

这个问题已经被报告了,但看起来它似乎没有得到任何调查。为了解决这个问题,我做了以下操作:

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

例如:

发送通知

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)

2
新手在这里。我应该在哪里编写“接收广播”的代码? - wakeup
@NehaK 通常这会在后台运行的服务中。 - svattom
未来的读者们,您可以通过以下方式获取notificationManagerNotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - olfek
只是想指出,对于那些可能遇到这个问题的人,这个解决方案将无法用于针对Android 12的应用程序,因为Google已经添加了一个限制,称之为通知跳板:https://developer.android.com/about/versions/12/behavior-changes-12#notification-trampolines - Benjamin M.

1

文档中提到 这里这里,点击 FLAG_AUTO_CANCEL 通知会自动取消。这种行为意味着如果设置了常规 contentIntent,则它将在自动取消时触发,因为它是响应用户点击操作而触发的。 使用 contentIntent 字段和 deleteIntent 来检测显式用户点击执行的取消操作。


1
这是DeleteIntent的正确行为,如Android SDK文档中所述

提供一个PendingIntent,用于在用户明确清除通知时发送。

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

13
抱歉,按照文档说明所述进行了下投票。使用setDeleteIntent(PendingIntent)设置的PendingIntent将在此发生时被发送。 - Ilja S.
1
@IljaS。你说的和我一样:使用setDeleteIntent设置的挂起意图在通知被清除时会被调用。 - Erwan
5
我不认为触碰通知和“被用户明确清除”是同一件事情。这两个行为的意图不同。当用户想要与应用程序交互时,他们会点击它。当用户想要忽略应用时,他们会将其清除/关闭。它们不应该被视为相同的行为。 - dm78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接