当前位置: 首页 > 知识库问答 >
问题:

如何在操作被点击后取消通知

姜天宇
2023-03-14

由于API级别为16(Jelly Bean),因此可以使用

builder.addAction(iconId, title, intent);

但是当我向通知添加一个操作并且按下该操作时,通知不会被取消。当单击通知本身时,可以通过以下方式取消通知

notification.flags = Notification.FLAG_AUTO_CANCEL;

builder.setAutoCancel(true);

但显然,这与通知相关联的操作无关。

有什么提示吗?或者这还不是API的一部分?我什么也没找到。

共有3个答案

程城
2023-03-14

我发现,当您在扩展通知中使用操作按钮时,您必须编写额外的代码,并且您会受到更多的约束。

用户单击操作按钮时,您必须手动取消通知。只有默认操作才会自动取消通知。

此外,如果您从按钮启动广播接收器,则通知抽屉不会关闭。

我最终创建了一个新的通知活动来解决这些问题。这个没有任何用户界面的中介活动取消通知,然后启动我真正想从通知开始的活动。

我在一个相关的帖子中发布了示例代码单击Android通知操作不会关闭通知抽屉。

祁驰
2023-03-14

在使用Lollipop的平视显示通知时发现这是一个问题。参见设计指南。下面是要实现的完整(ish)代码。

直到现在,有一个“解散”按钮还不那么重要,但现在更重要的是在你面前。

构建通知

int notificationId = new Random().nextInt(); // just use a counter in some util class...
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style
        .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission
        .setSmallIcon(R.drawable.ic_action_refresh) // Required!
        .setContentTitle("Message from test")
        .setContentText("message")
        .setAutoCancel(true)
        .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent)
        .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent);

// Gets an instance of the NotificationManager service
NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

// Builds the notification and issues it.
notifyMgr.notify(notificationId, builder.build());

通知活动

public class NotificationActivity extends Activity {

    public static final String NOTIFICATION_ID = "NOTIFICATION_ID";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1));
        finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately
    }

    public static PendingIntent getDismissIntent(int notificationId, Context context) {
        Intent intent = new Intent(context, NotificationActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.putExtra(NOTIFICATION_ID, notificationId);
        PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        return dismissIntent;
    }

}

AndroidManifest。xml(防止SystemUI聚焦到后台堆栈所需的属性)

<activity
    android:name=".NotificationActivity"
    android:taskAffinity=""
    android:excludeFromRecents="true">
</activity>
皇甫繁
2023-03-14

在notification manager上调用notify时,您为其提供了一个id,这是您以后可以用来访问它的唯一id(这是从notification manager:

notify(int id, Notification notification)

要取消,您可以打电话:

cancel(int id)

使用相同的id。那么,基本上,您需要跟踪id,或者可能将id放入一个捆绑包中,您将其添加到Pending帐篷内的意图中?

 类似资料:
  • 我正在使用react native firebase设置前台 该应用程序有一个监听器附加,当它在前台收到通知时,我使用来显示通知。 然后侦听器接收通知并将用户导航到不同的屏幕。 问题是,从接收的通知对象有一个action,每次单击它都会启动Main活动。我不知道这个动作字符串来自哪里,因为客户端应用程序和后端都没有设置任何点击动作。还有这个恰好是我的的意图过滤操作。 我不希望ContentInte

  • HTML: 代码试用: 也试过很多其他的方法。无法单击“取消”按钮。错误: org.openqa.selenium.nosuchelementException:没有这样的元素:找不到元素:{“method”:“XPath”,“selector”:“//button[@type='button'][@class='modal-footer-button g-capitalize btn btn-l

  • 编辑:底部的解决方案 这是一个跳棋游戏。单击一个按钮后,它等待单击第二个按钮与之交换。然而,有时你可能不想移动那个按钮,但一旦你点击了它,就没有回头路了,因为我无法禁用它。 在这里的其他帖子中,我看到人们使用 这只是使它在第一次单击后不可见。 这什么都干不了。 这也没什么用。编辑:所有这些方法都用true和false进行了尝试。 私有无效交换(){ 但你也需要 这样它就重新启用了它,或者其他什么,

  • 我有一种情况,我在JavaFX中有一个容器节点(HBox)和两个子节点。当我从左边的子节点拖到右边时,我会得到很多拖到左边节点的事件,最后当我在右边节点上释放鼠标时,我会在父节点中得到一个单击事件。下面是一些复制这种情况的代码。 我想知道的是:如何阻止家长接收此点击事件?我在使用事件的左、右节点上尝试了各种事件过滤器和事件处理程序,但似乎找不到合适的过滤器和事件处理器来防止单击事件发送到父节点。有

  • 问题内容: 我有以下html元素: 我需要href属性,以便引导程序使用链接样式(颜色,光标)对元素进行样式设置。 问题是,如果现在单击该按钮,它将导致浏览器重定向。如何更新以上内容以不重定向浏览器onClick但仍然运行? 问题答案: 您应该像这样在 onClick* 事件中调用 preventDefault 函数: * 您可以针对自己的用例使用类似以下的内容:

  • 本文向大家介绍Android中如何取消listview的点击效果,包括了Android中如何取消listview的点击效果的使用技巧和注意事项,需要的朋友参考一下 在xml文件里面有listselecter的属性引用 引用transparent之后会让点击效果透明化,昨天整了半天才搞出来,记录一下。 PS:去除或替换listview 默认的点击选中时的颜色 1.去除默认的点击选中时的颜色 (1)设