实现在线消息提醒

更新时间: 2025/03/11 17:01:50

网易云信即时通讯 SDK(NIM SDK)提供内置的消息提醒功能,该功能与离线推送功能相互独立,可单独使用。

使用场景

当应用进程在存活的情况下,应用退后台或者收到非当前会话的消息会触发消息提醒。消息提醒作用的场景与推送不同,一般对即时通讯的场景来说,主要作用在:

  • App 处于后台,且 SDK 进程未被清理时

  • 在前台与用户 A 聊天,但收到其他用户(非用户 A)的发来的消息时

  • 在非聊天界面且非最近会话列表界面时

以下场景一般不需要消息提醒:

  • 如果用户正处于聊天界面,且收到当前会话的消息

  • 如果用户停留在最近联系人列表界面,收到消息也不应该有消息提醒(但会有未读数变更通知)

实现消息提醒

SDK 通过初始化参数 SDKOptions.statusBarNotificationConfig 来控制通知栏消息提醒功能,默认为 null,即 SDK 不提供通知栏提醒功能,由客户 App 自行实现。

  1. 初始化 时,配置 SDKOptions.statusBarNotificationConfig 参数,即 SDK 提供通知栏提醒功能。statusBarNotificationConfig 参数详情请参考 通知栏消息提醒配置项参考。示例代码如下:

    JavaStatusBarNotificationConfig config = new StatusBarNotificationConfig();
    // 单击通知需要跳转到的界面
    config.notificationEntrance = WelcomeActivity.class;
    // 通知铃声的 uri 字符串
    config.notificationSound = "raw/msg";
    config.notificationFolded = true;
    config.notificationFoldStyle = NotificationFoldStyle.ALL;
    config.downTimeEnableNotification = true;
    // 呼吸灯配置
    config.ledARGB = Color.GREEN;
    config.ledOnMs = 1000;
    config.ledOffMs = 1500;
    // 是否 App ICON 显示未读数红点(安卓 O 有效)
    config.showBadge = true;
    config.notificationFilter = new StatusBarNotificationFilter() {
        @Override
        public FilterPolicy apply(IMMessage imMessage) {
            return FilterPolicy.PERMIT;
        }
    };
    
    options.statusBarNotificationConfig = config;
    
  2. (可选)开启/关闭通知栏消息提醒功能。SDK 默认开启通知栏消息提醒功能,不需要单独调用 toggleNotification 方法开启。但是如果主动关闭过消息提醒功能,则需要单独调用该接口重新开启。示例代码如下:

    JavaNIMClient.toggleNotification(true);
    
    • SDK 默认开启撤回消息操作的通知栏提醒,如需关闭,可通过 toggleRevokeMessageNotification 方法实现。
    • 只有 statusBarNotificationConfig 配置不为空时,toggleNotificationtoggleRevokeMessageNotification 方法才有效。
  3. (可选)启用通知栏消息提醒后,需要依据当前页面环境动态调整是否需要消息提醒。此处,需要结合未读数相关接口进行处理:

    • 进入聊天界面,调用 setChattingAccount 方法设置当前正在聊天的对象(account)。设置后会影响内置的消息提醒。如果有新消息到达,且消息来源是正在聊天的对象(account),将不会有消息提醒。

    • 进入最近联系人列表界面,同样调用 setChattingAccount 方法设置所有消息无需进行消息提醒。

    • 退出聊天界面或离开最近联系人列表界面,调用 setChattingAccount 方法设置所有消息都进行消息提醒。

    示例代码如下:

    Java// 进入聊天界面,建议放在 onResume 中,表示来自 account 的消息无需进行消息提醒。
    NIMClient.getService(MsgService.class).setChattingAccount(account,sessionType);
    
    // 进入最近联系人列表界面,建议放在 onResume 中。表示所有消息无需进行消息提醒。
    NIMClient.getService(MsgService.class).setChattingAccount(MsgService.MSG_CHATTING_ACCOUNT_ALL, SessionTypeEnum.None);
    
    // 退出聊天界面或离开最近联系人列表界面,建议放在 onPause 中。表示所有消息都可以进行消息提醒。
    NIMClient.getService(MsgService.class).setChattingAccount(MsgService.MSG_CHATTING_ACCOUNT_NONE, SessionTypeEnum.None);
    
  4. (可选)后续若需要修改通知栏消息提醒配置,可通过 updateStatusBarNotificationConfig 方法进行更新。具体请参考 配置消息提醒功能

通知栏消息提醒配置项参考

StatusBarNotificationConfig 参数 说明
notificationSmallIconId 通知栏小图标的资源 ID,不提供则使用 App 图标。
ring 是否响铃提醒,默认 true。
notificationSound 提醒声音资源,不提供则使用系统默认提示音。
vibrate 是否振动提醒,默认 true。
ledARGB 呼吸灯颜色,建议使用基本颜色(绿、蓝、红等),避免混合色。
ledOnMs 呼吸灯亮起持续时间(毫秒)。
ledOffMs 呼吸灯熄灭持续时间(毫秒)。
hideContent 是否隐藏消息详情和发送者昵称,默认 false。
downTimeToggle 免打扰设置开关,默认关闭。
downTimeBegin 免打扰开始时间,24小时制,格式 HH:mm。
downTimeEnd 免打扰结束时间,24小时制,格式 HH:mm。
若结束时间设置小于开始时间,则为 "开始时间-24:00-结束时间"。
notificationEntrance 通知栏点击跳转的 activity 类型。
若为 null,则使用包 launcher 的入口 activity。
titleOnlyShowAppName 通知栏标题是否只显示应用名,默认 false。
  • false:单会话显示会话名,多会话显示应用名。
  • true:始终显示应用名。
应用名在 AndroidManifest 的 application 节点设置 android:label。
notificationColor 通知栏颜色,应用于 NotificationCompat.BuildersetColor安卓 5.0+ 会影响 smallIcon
downTimeEnableNotification 免打扰期间是否显示通知,默认显示。
notificationFoldStyle 通知栏折叠类型:
  • 折叠所有通知为一条:NotificationFoldStyle.ALL
  • 不折叠通知:NotificationFoldStyle.EXPAND
  • 同会话消息折叠:NotificationFoldStyle.CONTACT
notificationExtraType 点击通知栏传递的 extra 类型:
  • 返回 ArrayList<IMMessage>:NotificationExtraTypeEnum.MESSAGE
  • 返回 String 格式的 JSONArray:NotificationExtraTypeEnum.JSON_ARR_STR
showBadge App 图标是否显示未读数(红点),仅安卓 8.0+ 有效。
customTitleWhenTeamNameEmpty 当群名称为空时,用作通知栏标题。
notificationFilter 决定是否弹出通知的过滤接口,为空等同于返回 DEFAULT,默认 null。
postNotificationsRequester Android 13 弹出通知前,向 App 请求 Manifest.permission#POST_NOTIFICATIONS 权限。
此文档是否对你有帮助?
有帮助
去反馈
  • 使用场景
  • 实现消息提醒
  • 通知栏消息提醒配置项参考