Android 通知点击跳转
最近更新:2022-06-08
展开全部

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 指定点击通知栏后跳转的目标页面;
  • SDK<4.2.2的版本,此字段值仅对走华硕通道和极光自有通道下发生效,不影响请求走其它厂商通道。
  • SDK≥4.2.2的版本,API 推送时建议填写 intent 字段,否则点击通知可能无跳转动作。此字段支持以下三种类型:
    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 可选 指定跳转页面
  • 该字段用于指定开发者想要打开的 activity,值为 activity 节点的 “android:name”属性值。
  • 适配华为、小米、vivo 厂商通道跳转。
  • Jpush SDK≥V4.2.2,可不再填写本字段,仅设置 intent 字段即可。
  • uri_action string 可选 指定跳转页面
  • 该字段用于指定开发者想要打开的 activity,值为 "activity"-"intent-filter"-"action" 节点的 "android:name" 属性值。
  • 适配 oppo、fcm跳转。
  • Jpush SDK≥V4.2.2,可不再填写本字段,仅设置 intent 字段即可,但若需兼容旧版 SDK 必须填写该字段。
  • 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=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
              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>
              <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以下版本 } } }
              {
        "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); } } }
              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()); } }
              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());
    
        }
    }
    
            
    此代码块在浮窗中显示

    格式说明

    固定格式:

    • 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>
              
    <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以下版本 } } }
              {
        "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以下版本 } } }
              {
        "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以下版本
            }
        }
    }
    
            
    此代码块在浮窗中显示
    文档内容是否对您有帮助?

    Copyright 2011-2022, jiguang.cn, All Rights Reserved. 粤ICP备12056275号-13 深圳市和讯华谷信息技术有限公司

    在文档中心打开