跳到主要内容

自定义推送点击事件

本文描述了 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>

跳转到会话列表页面

多个联系人发来多条通知时,这些通知会折叠显示。用户点击来自多个联系人的通知时,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>

处理不落地通知点击跳转

通过融云发起的不落地通知会独立显示。用户点击不落地通知时,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>

自定义通知点击跳转行为

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

  • 设置 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) {}
});

使用 PushMessageReceiver

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

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

    class CustomPushMessageReceiver extends PushMessageReceiver {
    ...
    }

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

    参数说明

    参数类型必填说明
    contextContext上下文对象
    pushTypePushType推送类型
    notificationMessagePushNotificationMessage推送消息
    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;
    }
    }