自定义推送点击事件
本文描述了 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
您也可以通过 PushMessageReceiver
的 onNotificationMessageClicked
方法自定义点击事件。该方式优先级低于 PushEventListener
。
- 华为 和 Oppo 的推送点击事件无法通过
PushMessageReceiver
方式进行自定义。 - 由于 Android 12 通知 trampoline 限制的原因,当您的 App 的 targetVersion >= 31 时,建议直接在
PushMessageReceiver
中的回调中直接启动 Activity。请勿再通过广播或者服务再进行消息分发之后再启动 Activity。
-
创建
CustomPushMessageReceiver
继承PushMessageReceiver
类。class CustomPushMessageReceiver extends PushMessageReceiver {
...
} -
在主工程的
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> -
注册完成广播后,可在创建的
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;
}
}