在我的应用程序中,我有暂停/播放操作的通知,但是,当用户单击该操作时,通知栏正在关闭。如何阻止通知栏关闭动作点击?
创建通知的方法:
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);
}
改变你的代码
setAutoCancel(true)
至
setAutoCancel(false)
在通过NotificationBuilder
建立通知时,您可以使用builder.setAutoCancel(false);
。
我解决了类似的问题。
对于使用PendingIntent的每个通知操作。看来如果你从PendingIntent.getActivity(...)创建PendingIntent - 它会关闭通知。如果您从PendingIntent.getService(...)或PendingIntent.getBroadcast(...)创建 - 通知仍然存在。
因此,如果您想从通知中启动活动而不隐藏通知:向服务发送意图或发送广播,则从那里开始活动。
但是从那里开始另一个问题:在通知下启动活动显示,我不知道如何将它带到顶部。
我有点迟到了,但它可能会帮助其他人面对这个话题。
正如Anrimian指出的那样,通过PendingIntent建立getActivity(Context, int, Intent, int)
会在动作点击时关闭通知面板,据我所知,你可以做的事情并不多,它只是它的工作原理。
但是用PendingIntent
或getBroadcast(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测试了这种方法,效果很好。