【问题标题】:How to prevent notification bar from closing upon notification action click如何防止通知栏在通知操作单击时关闭
【发布时间】:2016-12-20 09:04:58
【问题描述】:

在我的应用程序中,我收到了带有暂停/播放操作的通知,但是,当用户单击该操作时,通知栏正在关闭。如何防止通知栏在操作点击时关闭?

创建通知的方法:

public void createNotification() {
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent, 0);

        Intent intent2 = new Intent(this, IntentActivity.class);
        intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        pIntent2 = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent2, 0);

        builder = new NotificationCompat.Builder(context);
        Notification noti = builder
                .setAutoCancel(true)
                .setContentTitle("Title")
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentIntent(pIntent)
                .setPriority(Notification.PRIORITY_MAX)
                .setStyle(new NotificationCompat.BigTextStyle().bigText("Czas trwania: " + time + "\nKalorie: 4kcal"))
                .addAction(icon, actionString, pIntent2).build();

        notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(0, noti);
    }

【问题讨论】:

    标签: android notifications android-notifications


    【解决方案1】:

    更改您的代码

    setAutoCancel(true)
    

    到

    setAutoCancel(false)
    

    【讨论】:

    • 我想我没有说清楚,我想防止通知抽屉在操作点击时隐藏。我需要 setAutoCancel(true) 在用户点击通知时关闭通知(在通知上不是通知的操作)
    • @user1852879 试试这个。
    • 我试过了,当我 setAutoCancel(false) 时抽屉仍然关闭,它只在用户点击它时保持通知。
    【解决方案2】:

    我解决了一个类似的问题。

    对于使用 PendingIntent 的每个通知操作。似乎如果您从 PendingIntent.getActivity(...) 创建 PendingIntent - 它会关闭通知。如果您从 PendingIntent.getService(...) 或 PendingIntent.getBroadcast(...) 创建 - 通知仍然存在。

    因此,如果您想从通知开始活动并且不隐藏通知:向服务发送意图或发送广播,然后从那里开始活动。

    但是从那里开始另一个问题:已启动的活动显示在通知下方,我不知道如何将其置于顶部。

    【讨论】:

      【解决方案3】:

      在通过NotificationBuilder 构建通知时,您可以使用builder.setAutoCancel(false);。

      【讨论】:

        【解决方案4】:

        我参加聚会有点晚了,但它可能会帮助其他面临这个话题的人。

        正如 Anrimian 指出的那样,通过 getActivity(Context, int, Intent, int) 构建 PendingIntent 在操作单击时关闭通知面板,据我所知,您对此无能为力,就是这样有效。

        但是使用getBroadcast(Context, int, Intent, int) 或getService(Context, int, Intent, int) 构建PendingIntent 可以满足您的需求。

        假设您构建了一个PendingIntent,如下所示:

        val playIntent = Intent("ACTION_PLAY_INTENT")
        val requestCode = 1
        val playPendingIntent = PendingIntent.getBroadcast(context, requestCode, playIntent, PendingIntent.FLAG_UPDATE_CURRENT)
        

        然后您需要将PendingIntent 添加到NotificationCompat.Builder 中:

        .addAction(icon, actionString, playPendingIntent)
        

        在您的活动中,您可以像这样声明接收者:

        private val playBroadcastReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                // parse your actions here...
            }
        }
        

        最后你可以通过以下方式注册:

        registerReceiver(playBroadcastReceiver, IntentFilter("ACTION_PLAY_INTENT"))
        

        结果是您在不关闭通知面板的情况下执行操作。 我也用RemoteViews 测试过这种方法,效果很好。

        【讨论】:

          猜你喜欢
          • 2012-08-06
          • 2018-04-19
          • 2013-03-12
          • 1970-01-01
          • 1970-01-01
          • 2013-10-26
          • 1970-01-01
          • 2018-05-26
          • 2013-08-30
          相关资源
          最近更新 更多