如何防止通知栏在通知操作单击时关闭

时间:2016-12-20 09:04:58

标签: android notifications android-notifications

在我的应用程序中,我有暂停/播放操作的通知,但是,当用户点击操作时,通知栏正在关闭。如何阻止通知栏在动作点击时关闭?

创建通知的方法:

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);
    }

4 个答案:

答案 0 :(得分:2)

更改您的代码
setAutoCancel(true)

setAutoCancel(false)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我解决了类似的问题。

对于每个使用的通知动作,PendingIntent。看来,如果您从PendingIntent.getActivity(...)创建PendingIntent,则会关闭通知。如果您是从PendingIntent.getService(...)或PendingIntent.getBroadcast(...)创建的,则会保留通知。

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

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

答案 3 :(得分:0)

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

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

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

因此,假设您按照以下方式构建了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测试了这种方法,效果很好。