Android内容通知被短信中断 - 如何实现不间断?

时间:2016-06-05 23:12:01

标签: android notifications android-notifications firebase-cloud-messaging

简短版本:

我想创建一个不会被所有其他通知,短信等不可中断的通知,直到用户清除它为止。

长版:

我正在使用Firebase云消息传递向我的手机发送提醒。根据主题处理消息,我需要连续重复“警报”消息,直到用户清除通知为止。目前,这是通过使用FLAG_INSISTENT设置通知来完成的,这会循环播放声音。

问题是当不同的通知或短信通过时,持续的“警报”通知会永久停止。

我想忽略所有新通知,或在播放新通知后重新启动闹钟。我搜索了几个小时,尝试了几个标志和设置,但无法弄清楚如何做到这一点。

以下是我用来处理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)处于活动状态时忽略它来阻止我自己的通知中断警报(或创建新通知,然后再次创建警报)。但是,来自其他程序的SMS和通知仍然会中断,因此这不是一个完美的解决方案。

1 个答案:

答案 0 :(得分:0)

不幸的是,我不认为你会幸运。 Android不会让您通知我的理解完全优先。

但是,在Firebase控制台中,当您转到“通知”部分并单击“高级”时,可以将通知的优先级设置为“高”并设置声音。

由于您看起来像是以编程方式编写通知并将优先级设置为Max,因此会产生相同的效果。

将优先级设置为高,来自Google的文档:

  

当高优先级通知到达时(见右图),它会在短时间内呈现给用户,扩展布局会显示可能的操作。

     

在这段时间之后,通知会撤回到通知阴影。如果通知的优先级被标记为高,最大或全屏,则会收到抬头通知

另外,请查看此消息,告知某人,当他们想要通知时,他们的通知不会消失 here