Android 安卓坚持通知被短信打断-如何使其不可中断?
简短版本: 我想创建一个通知,该通知在用户清除之前不被所有其他通知、SMS消息等干扰 长版本: 我正在使用Firebase云消息向我的手机发送警报。消息是根据主题处理的,我需要不断重复“报警”消息,直到用户清除通知。目前,这是通过设置带有FLAG_persistent的通知来实现的,它会循环声音 问题在于,当收到不同的通知或短信时,持续的“报警”通知将永久停止 我想忽略所有新通知,或在播放新通知后重新启动警报。我已经搜索了几个小时,尝试了几个标志和设置,但不知道怎么做 下面是我用来处理FCM消息和设置通知的代码:Android 安卓坚持通知被短信打断-如何使其不可中断?,android,notifications,android-notifications,firebase-cloud-messaging,Android,Notifications,Android Notifications,Firebase Cloud Messaging,简短版本: 我想创建一个通知,该通知在用户清除之前不被所有其他通知、SMS消息等干扰 长版本: 我正在使用Firebase云消息向我的手机发送警报。消息是根据主题处理的,我需要不断重复“报警”消息,直到用户清除通知。目前,这是通过设置带有FLAG_persistent的通知来实现的,它会循环声音 问题在于,当收到不同的通知或短信时,持续的“报警”通知将永久停止 我想忽略所有新通知,或在播放新通知后重新启动警报。我已经搜索了几个小时,尝试了几个标志和设置,但不知道怎么做 下面是我用来处理FCM消息
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getData() != null){
String messageTopic= remoteMessage.getFrom();
String messageTitle = remoteMessage.getData().get("title");
String messageBody = remoteMessage.getData().get("message");
if (messageTopic.equals("/topics/news")) {
Intent intent = new Intent(this, MainScreenActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Uri soundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_news)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(soundUri)
.setContentIntent(pendingIntent)
.setPriority(Notification.PRIORITY_MAX);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(30548, notificationBuilder.build());
}
else if (messageTopic.equals("/topics/alarm")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com/alarm.php"));
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_alarm)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(soundUri)
.setContentIntent(pendingIntent)
.setPriority(Notification.PRIORITY_MAX);
Notification mNotification = notificationBuilder.build();
mNotification.flags |= Notification.FLAG_INSISTENT;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(30549, mNotification);
}
}
}
当报警通知ID(30549)处于活动状态时(或创建新通知,然后再次创建报警),我可以通过忽略这些通知来防止自己的通知中断报警。但是,来自其他程序的短信和通知仍然会中断,因此这不是一个完美的解决方案。不幸的是,我认为你不会有这样的运气。据我所知,安卓不会让你收到一个优先通知 但是,在Firebase控制台中,当您转到通知部分并单击高级时,可以将通知的优先级设置为高并设置声音 因为它看起来像是以编程方式编写通知,并将优先级设置为Max,这将获得相同的效果 根据谷歌的文档,将优先级设置为高: 当高优先级通知到达时(见右图),它会以一个扩展的布局向用户显示一段短时间,以显示可能的操作 在这段时间之后,通知将退回到通知阴影。如果通知的优先级标记为“高”、“最大”或“全屏”,则会收到平视通知 另外,请查看此信息,以便有人在收到通知时不会在需要时离开
不幸的是,我认为你在这件事上运气不好。据我所知,安卓不会让你收到一个优先通知 但是,在Firebase控制台中,当您转到通知部分并单击高级时,可以将通知的优先级设置为高并设置声音 因为它看起来像是以编程方式编写通知,并将优先级设置为Max,这将获得相同的效果 根据谷歌的文档,将优先级设置为高: 当高优先级通知到达时(见右图),它会以一个扩展的布局向用户显示一段短时间,以显示可能的操作 在这段时间之后,通知将退回到通知阴影。如果通知的优先级标记为“高”、“最大”或“全屏”,则会收到平视通知 另外,请查看此信息,以便有人在收到通知时不会在需要时离开
谢谢您的回复。我从指定“优先级”高的服务器发送消息,发送“到”主题,只发送数据字段(而不是通知字段),以确保应用程序即使在后台也能处理消息。我很确定应用程序的消息部分正在工作,只是通知部分需要进行更改。我不确定另一个问题与这个问题有什么关系。报警通知会持续显示在任务栏中,但一旦播放新通知,声音就会停止。也许可以尝试创建一个服务,然后播放一些音频,这将需要显示一个通知,例如当应用程序播放音乐时。感谢您的响应。我从指定“优先级”高的服务器发送消息,发送“到”主题,只发送数据字段(而不是通知字段),以确保应用程序即使在后台也能处理消息。我很确定应用程序的消息部分正在工作,只是通知部分需要进行更改。我不确定另一个问题与这个问题有什么关系。报警通知会持续显示在任务栏中,但在播放新通知后声音会停止。也许可以尝试创建一个服务,然后播放一些音频,这将需要显示一个通知,例如当应用程序播放音乐时。