Android 通知点击跳转
本文旨要介绍有目标地址时如何使用 intent、deeplink 和直接打开应用的方式实现点击通知跳转到目标页面。极光强烈建议你升级 SDK 至 4.6.0 及以上版本,并配置 intent 方式来实现点击通知跳转功能。
- SDK < 4.6.0 版本时,极光通道有 onNotifyMessageOpened 点击回调,厂商通道没有 onNotifyMessageOpened 点击回调。
- SDK ≥ 4.6.0 版本时,Android 极光通道和厂商通道统一处理:无通知跳转目标地址有 onNotifyMessageOpened 点击回调,有通知跳转目标地址时没有 onNotifyMessageOpened 点击回调。
支持版本
Rest API 的 intent 字段包括 intent、deeplink 和直接打开应用的跳转方式。
- SDK<4.2.2 的版本,intent 字段值仅走华硕通道和极光通道时生效,不影响请求走其它厂商通道。
- SDK ≥ 4.2.2 的版本,API 推送时建议填写 intent 字段,否则点击通知可能无跳转动作。
配置目标地址说明
配置通知跳转目标地址指推送下发时有在控制台或者 API 中完成以下配置。
控制台配置
控制台下发时配置 “Android 点击通知打开”中任意一个选项。
API 使用
API 推送时在 notification.android 下发 intent 或者 uri_activity、uri_action 字段。
- SDK ≥ 4.2.2 的版本,只需要填写 intent 参数。
- SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
关键字 | 类型 | 选项 | 含义 | 说明 |
---|---|---|---|---|
intent | JSON Object | 可选 | 指定跳转页面 | 使用 intent 里的 url 指定点击通知栏后跳转的目标页面; 1. 跳转到目标页: intent:#Intent;action=action 路径;component=包名/Activity 全名;end (OPPO 和 FCM 通道必须传"action 路径", 其他厂商必须传"Activity 全名", 否则将出现对应厂商无法跳转问题) 2. 跳转到 deeplink 地址: scheme://test?key1=val1&key2=val2 3. 应用首页: intent:#Intent;action=android.intent.action.MAIN;end (固定为此地址) |
uri_activity | string | 可选 | 指定跳转页面 | |
uri_action | string | 可选 | 指定跳转页面 |
intent 方式(推荐)
格式说明
固定格式 :intent:#Intent;action="action 路径";component="包名"/"Activity 组件路径";end
- intenturi 必须以 "intent:#Intent;" 开头,以 ";end" 结尾。
- 不允许存在多个 "action=" 字符或 "component=" 字符。
示例:
intent:#Intent;action=cn.jiguang.myaction;component=cn.jiguang.jumptest/cn.jiguang.jumptest.OpenClickActivity;end
携带参数格式:intent:#Intent;action=“action 路径”;component="包名"/"Activity 组件路径";S.key1=value1;i.key2=2;end
- "S.":代表参数值是 String 格式。
- "i.":代表参数值是 Int 格式。
示例:
intent:#Intent;action=cn.jiguang.myaction;component=cn.jiguang.jumptest/cn.jiguang.jumptest.OpenClickActivity;S.key1=value;i.key2=2;end
客户端配置
在 AndroidManifest 中完成以下配置。
OPPO 通道和 FCM 通道必须配置 action 和 category 才可以跳转。
<activity
android:name="cn.jiguang.jumptest.OpenClickActivity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="cn.jiguang.myaction" ></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
服务端使用
控制台使用
进入【消息推送】-【推送管理】-【创建推送】页面,选择 Android 平台, 并在 “Android 点击通知打开”中选择“intent(推荐)”,填写 intent 。
API 使用
- SDK ≥ 4.2.2 的版本,只需要填写 intent 参数,参数详情参考 API 使用。
- SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
{
"notification" : {
"android" : {
"alert" : "hello, JPush!",
"title" : "JPush test",
"intent": {
"url": "intent:#Intent;action=cn.jiguang.myaction;component=cn.jiguang.jumptest/cn.jiguang.jumptest.OpenClickActivity;S.key1=value;i.key2=3;end"
},
"uri_activity": "cn.jiguang.jumptest.OpenClickActivity",//兼容4.2.2以下版本
"uri_action": "cn.jiguang.jumptest.OpenClickActivity"//兼容4.2.2以下版本
}
}
}
客户端获取 intent 携带参数
- 若需要跳转至页面指定位置,推送时可以下发自定义参数,获取参数后自行处理业务跳转逻辑。
- SDK 针对 intent 配置的参数均是透传的,所以在目标 Activity 直接获取 intent 跳转获取参数即可。
package cn.jiguang.jumptest;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handleIntent();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent();
}
void handleIntent(){
if(getIntent()!=null){
String value1 =getIntent().getStringExtra("key1");
int value2 =getIntent().getIntExtra("key2",0);
Log.e("MainActivity",""+value1);
Log.e("MainActivity",""+value2);
}
}
}
客户端获取 Extras 附加参数
若需要跳转至页面指定位置,推送时可以下发自定义参数,获取参数后自行处理业务跳转逻辑。
- SDK < 4.6.0 版本时,极光通道有 onNotifyMessageOpened 点击回调,厂商通道没有 onNotifyMessageOpened 点击回调。
- SDK ≥ 4.6.0 版本时,Android 极光通道和厂商通道统一处理:无通知跳转目标地址有 onNotifyMessageOpened 点击回调,有通知跳转目标地址时没有 onNotifyMessageOpened 点击回调。
1.有配置通知跳转目标地址时:
- SDK<4.6.0 版本
- 华为通道使用
getIntent().getData().toString()
方法获取参数。 - 小米、vivo、OPPO、FCM、魅族通道使用
getIntent().getExtras().getString(“JMessageExtra”)
方法获取参数。 - 极光通道在回调的函数
onNotifyMessageOpened(Context context, NotificationMessage message)
中的 message 中获取参数。
- 华为通道使用
- SDK ≥ 4.6.0 版本
- 华为通道使用
getIntent().getData().toString()
方法获取参数。 - 小米、vivo、OPPO、FCM、魅族、荣耀、极光通道使用
getIntent().getExtras().getString(“JMessageExtra”)
方法获取参数。
- 华为通道使用
2.无配置通知跳转目标地址时:
注意:
- REST API 下发时不配置 intent 参数时可以走
onNotifyMessageOpened
回调。- 控制台下发仅选择 intent 且不填参数时走
onNotifyMessageOpened
回调,其余都是配置了通知目标地址,无法走onNotifyMessageOpened
回调!详情参考 配置通目标地址说明。
- SDK<4.6.0 版本时:
- 厂商通道没有点击回调,点击无法跳转,无法获取参数。
- 极光通道在回调的函数
onNotifyMessageOpened(Context context, NotificationMessage message)
中的 message 中获取参数。
- SDK ≥ 4.6.0 版本时,所有通道在回调的函数
onNotifyMessageOpened(Context context, NotificationMessage message)
中的 message 中获取参数。
示例如下
package com.HuananThirdPush.cn;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import cn.jpush.android.api.JPushInterface;
public class OpenClickActivity extends Activity {
private static final String TAG = "OpenClickActivity";
/**通知附加字段**/
private static final String KEY_EXTRAS = "n_extras";
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTextView = new TextView(this);
setContentView(mTextView);
handleOpenClick();
}
/**
* 处理点击事件,当前启动配置的Activity都是使用
* Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
* 方式启动,只需要在onCreat中调用此方法进行处理
*/
private void handleOpenClick() {
Log.d(TAG, "用户点击打开了通知");
String data = null;
//获取华为平台附带的jpush信息
if (getIntent().getData() != null) {
data = getIntent().getData().toString();
}
//获取fcm/oppo/小米/vivo/魅族/荣耀 平台附带的jpush信息
if (TextUtils.isEmpty(data) && getIntent().getExtras() != null) {
data = getIntent().getExtras().getString("JMessageExtra");
}
Log.w(TAG, "msg content is " + String.valueOf(data));
if (TextUtils.isEmpty(data)) return;
try {
JSONObject jsonObject = new JSONObject(data);
String extras = jsonObject.optString(KEY_EXTRAS);
StringBuilder sb = new StringBuilder();
sb.append("extras:");
sb.append(String.valueOf(extras));
sb.append("\n");
mTextView.setText(sb.toString());
}
}
deeplink 方式
格式说明
固定格式:
- scheme://
- scheme://host
- scheme://host/path
携带参数格式:
scheme://host/path?key1=val1&key2=val2
客户端配置
在 AndroidManifest 中完成以下配置。
- action、category 必须按照下列示例配置。
- data 的 scheme 必须配置,其他参数可选。
<activity android:name=".DeeplinkTestActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="jiguang"
android:host="deeptest"
android:path="/index"/>
</intent-filter>
</activity>
服务端使用
控制台使用
进入【消息推送】-【推送管理】-【创建推送】页面,选择 Android 平台, 并在 “Android 点击通知打开”中选择“DeepLink”,填写 DeepLink。
API 使用
- SDK ≥ 4.2.2 的版本,只需要填写 intent 参数,参数详情参考 API 使用。
- SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
{
"notification" : {
"android" : {
"alert" : "hello, JPush!",
"title" : "JPush test",
"intent": {
"url": "jiguang://deeptest/index?key1=val1&key2=val2"
},
"uri_activity": "cn.jiguang.jumptest.DeeplinkTestActivity",//兼容4.2.2以下版本
"uri_action": "cn.jiguang.jumptest.DeeplinkTestActivity"//兼容4.2.2以下版本
}
}
}
打开应用方式
API 使用
控制台使用
进入【消息推送】-【推送管理】-【创建推送】页面,选择 Android 平台, 并在 “Android 点击通知打开”中选择“打开应用”。
API 使用
- SDK ≥ 4.2.2 的版本,只需要填写 intent 参数,参数详情参考 API 使用。
- SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
{
"notification": {
"android": {
"alert": "hello, JPush!",
"title": "JPush test",
"intent": {
"url": "intent:#Intent;action=android.intent.action.MAIN;end"
},
"uri_activity": "cn.jiguang.jumptest.MainActivity", //兼容4.2.2以下版本
"uri_action": "cn.jiguang.jumptest.MainActivity" //兼容4.2.2以下版本
}
}
}