文档导航
Android
SDK 版本:  5.X
公告:融云新文档中心已上线,欢迎到新文档中心阅读 Android IMLibAndroid IMKit 的文档。

自定义推送点击事件

更新时间:2024-02-06 PDF

自定义推送点击事件

本文描述了 IMLib 和 IMKit 处理用户点击远程通知(Remote notifications)的默认行为,以及应用程序如何自行处理远程推送通知的点击事件。

提示

本文仅描述远程推送通知点击事件的处理方案。如果您需要处理 IMKit 的本地通知的点击事件,请参考本地通知点击事件处理。如果您不清楚如何区分本地通知与远程推送,可阅读知识库文档 如何理解即时通讯业务中的实时消息、本地通知和远程推送(Android)

实现 SDK 默认跳转行为

IMLib 和 IMKit 默认处理远程推送通知的点击事件。用户点击通知时,SDK 会发出对应的隐式 Intent。您需要在 App 的应用清单文件(AndroidManifest.xml)配置添加 Intent-filter,以接收 Intent,完成默认跳转动作。

  • 来自一个联系人的通知:用户点击来自一个联系人发来一条或多条通知时,SDK 默认跳转到会话 Activity。
  • 来自多个联系人的折叠通知:多个联系人发来多条通知时,这些通知会折叠显示。用户点击来自多个联系人的通知时,SDK 默认跳转到会话列表 Activity。
  • 不落地推送的通知:当用户点击不落地推送的通知时,SDK 也会发出隐式 Intent。您可以自行决定接收该 Intent 的 Activity。

跳转到与消息对应的会话页面

用户点击来自一个联系人发来一条或多条通知时,SDK 默认发出跳转到会话 Activity 的 Intent。

AndroidManifest.xml 的会话 Activity 中配置如下 intent-filter 即可跳转到会话 Activity。如果自定义了会话 Activity,需要替换 会话 activity 为自定义 Activity 的类名。

<activity
android:name="RongConversationActivity"
android:exported="true">
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data
        android:host="${applicationId}"
        android:pathPrefix="/conversation"
        android:scheme="rong" />
</intent-filter>
</activity>
              
已复制
1
2
3
4
5
6
7
8
9
10
11
12

跳转到会话列表页面

多个联系人发来多条通知时,这些通知会折叠显示。用户点击来自多个联系人的通知时,SDK 默认发出跳转到会话列表 Activity 的 Intent。

AndroidManifest.xml 的会话列表 Activity 中配置如下 intent-filter 即可跳转到当前 Activity。如果自定义了会话列表 Activity,需要替换 RongConversationListActivity 为自定义 Activity 的类名。

<activity
android:name="RongConversationListActivity"
android:exported="true">
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data
        android:host="${applicationId}"
        android:pathPrefix="/conversationlist"
        android:scheme="rong" />
</intent-filter>
</activity>
              
已复制
1
2
3
4
5
6
7
8
9
10
11
12

处理不落地通知点击跳转

通过融云发起的不落地通知会独立显示。用户点击不落地通知时,SDK 默认发出 Intent。

AndroidManifest.xml 进行如下配置,即可跳转到您指定的 Activity。

<activity
android:name="自定义 activity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait">

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />

    <data
        android:host="${applicationId}"
        android:pathPrefix="/push_message"
        android:scheme="rong" />
</intent-filter>
</activity>
              
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

自定义通知点击跳转行为

如果默认跳转行为无法满足需求,您可以通过以下任一方式,修改点击推送通知的跳转行为。

  • 设置 PushEventListener,重写 onNotificationMessageClicked 方法(推荐)。
  • 继承 PushMessageReceiver,重写 onNotificationMessageClicked 方法。

设置 PushEventListener

提示
  • 开发版 SDK 从 5.2.1 版本开始,所有推送类型均支持使用 PushEventListener 自定义点击通知跳转行为。
  • 稳定版 SDK 从 5.1.9.2 版本开始,所有推送类型均支持使用 PushEventListener 自定义点击通知跳转行为。
  • 由于 Android 12 通知 trampoline 限制的原因,当您的 App 的 targetVersion >= 31 时,建议直接在 RongPushClient.setPushEventListener 中的回调中直接启动 Activity。请勿再通过广播或者服务再进行消息分发之后再启动 Activity。

您可以在 Application 的 onCreate 方法中设置 PushEventListener,覆写 onNotificationMessageClicked 方法,监听并拦截推送通知点击事件。

RongPushClient.setPushEventListener(
                new PushEventListener() {
                    @Override
                    public boolean preNotificationMessageArrived(
                            Context context,
                            PushType pushType,
                            PushNotificationMessage notificationMessage) {
                        // 该回调仅在通知类型为透传消息时生效。返回 true 表示拦截,false 为不拦截
                        return false;
                    }

                    @Override
                    public void afterNotificationMessageArrived(
                            Context context,
                            PushType pushType,
                            PushNotificationMessage notificationMessage) {
                        // 该回调仅在通知类型为透传消息时生效
                    }

                    @Override
                    public boolean onNotificationMessageClicked(
                            Context context,
                            PushType pushType,
                            PushNotificationMessage notificationMessage) {
                        // 用户可以在此定义自己的通知的点击事件业务,返回 true 表示拦截,false 为不拦截
                        return false;
                    }

                    @Override
                    public void onThirdPartyPushState(
                            PushType pushType, String action, long resultCode) {}
                });
              
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

使用 PushMessageReceiver

您也可以通过 PushMessageReceiveronNotificationMessageClicked 方法自定义点击事件。该方式优先级低于 PushEventListener

提示
  • 华为 和 Oppo 的推送点击事件无法通过 PushMessageReceiver 方式进行自定义。
  • 由于 Android 12 通知 trampoline 限制的原因,当您的 App 的 targetVersion >= 31 时,建议直接在 PushMessageReceiver 中的回调中直接启动 Activity。请勿再通过广播或者服务再进行消息分发之后再启动 Activity。
  1. 创建 CustomPushMessageReceiver 继承 PushMessageReceiver 类。

    class CustomPushMessageReceiver extends PushMessageReceiver {
        ...
    }
    
                  
    已复制
    1
    2
    3
    4

  2. 在主工程的 AndroidManifest.xml 中注册推送广播接收组件。请注意替换 AndroidManifest.xml 中已添加的 PushMessageReceiver 注册内容。

      <receiver
                android:name="xxx.CustomPushMessageReceiver"
                android:exported="true">
                <intent-filter>
                    <action android:name="io.rong.push.intent.MESSAGE_ARRIVED" />
                    <action android:name="io.rong.push.intent.MESSAGE_CLICKED" />
                    <action android:name="io.rong.push.intent.THIRD_PARTY_PUSH_STATE" />
                </intent-filter>
            </receiver>
                  
    已复制
    1
    2
    3
    4
    5
    6
    7
    8
    9

  3. 注册完成广播后,可在创建的 CustomPushMessageReceiver 类中复写 onNotificationMessageClicked 方法。在此方法中做拦截,然后实现跳转逻辑。

    参数说明

    参数 类型 必填 说明
    context Context 上下文对象
    pushType PushType 推送类型
    notificationMessage PushNotificationMessage 推送消息
    class CustomPushMessageReceiver extends PushMessageReceiver {
        @Override
        public boolean onNotificationMessageClicked(Context context, PushType pushType, PushNotificationMessage notificationMessage) {
            // 可通过 pushType 判断 Push 的类型
            // 华为 和 Oppo的推送点击事件不会回调到该方法, 需要按照各自的配置方法在相应的activity解析intent获得信息.
    
            if (pushType == PushType.XIAOMI) {
                //实现您自定义的通知点击跳转逻辑
                return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。
            } else if (pushType == PushType.MEIZU) {
                //实现您自定义的通知点击跳转逻辑
                return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。
            } else if (pushType == PushType.VIVO) {
                //实现您自定义的通知点击跳转逻辑
                return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。
            } else if (pushType == PushType.GOOGLE_FCM) {
                //实现您自定义的通知点击跳转逻辑
                return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。
            } else if (pushType == PushType.RONG) {
                //实现您自定义的通知点击跳转逻辑
                return true; // 此处返回 true. 代表不触发 SDK 默认实现,您自定义处理通知点击跳转事件。
            }
            return false;
        }
    }
    
                  
    已复制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

文档反馈
意见反馈

您的改进建议

意见反馈

问题类型

联系我们

提交工单

技术支持|集成使用|产品方案


商务咨询

7 x 24 小时

为您解答方案与报价问题

131 6185 6839

文档反馈