Android推送集成
Android推送集成
极光推送
上报 “推送 ID”
在极光提供的 onRegister 接口中调用 :HinaCloudSDK.getInstance().setPushUId("jiguang_id",s)
注意:若推送 ID 存在实效性,建议调用:HinaCloudSDK.getInstance().userSet(“push_id”,s)。
// 推送 ID 的处理
public class MyJPushMessageReceiver extends JPushMessageReceiver {
@Override
public void onRegister(Context context, String s) {
super.onRegister(context, s);
//上报极光 "推送 ID"
HinaCloudSDK.getInstance().setPushUId("jiguang_id", s);
}
}
采集推送点击事件
海纳嗨数 Android SDK 可以自动采集来自极光、个推、友盟推送的推送点击事件,请参考此文档开启采集。
处理推送消息
非厂商通道可以在 onNotifyMessageOpened 接口中处理推送消息。
public class MyJPushMessageReceiver extends JPushMessageReceiver {
@Override
public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {
super.onNotifyMessageOpened(context, notificationMessage);
if (notificationMessage == null) return;
// 处理海纳云智能营销推送的 "打开 App"、"打开 URL 消息"、"自定义消息" 的动作
handleHinaCloudPushMessage(notificationMessage.notificationExtras);
}
}
使用厂商通道的情况下,需要在厂商通道 Activity 的 onCreate,onNewIntent 中拿到 intent,解析出相应的参数再处理推送消息。
/**
* 如果使用了极光 VIP 的厂商通道(uri_activity/uri_action),需要在厂商消息打开的 Activity 中处理厂商通道消息。
* 处理厂商通道消息的点击事件的 Activity。
*/
public class OpenClickActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 处理厂商通道消息的点击
handlePushOpen();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 处理厂商通道消息的点击
handlePushOpen();
}
/**
* 处理厂商通道消息的点击。
* <p>
* 华为通道消息数据:通过 getIntent().getData().toString(); 获取。
* 小米、vivo、OPPO、FCM 通道消息数据 :通过 getIntent().getExtras().getString("JMessageExtra") 获取。
* 魅族通道消息数据:通过 onNotifyMessageOpened 获取。
*/
private void handlePushOpen() {
try {
Intent intent = getIntent();
if (intent == null) {
return;
}
String pushData = null;
// 华为通道消息数据
if (getIntent().getData() != null) {
pushData = getIntent().getData().toString();
}
// 小米、vivo、OPPO、FCM 通道消息数据(魅族会回调 onNotifyMessageOpened )
if (TextUtils.isEmpty(pushData) && getIntent().getExtras() != null) {
pushData = getIntent().getExtras().getString("JMessageExtra");
}
if (TextUtils.isEmpty(pushData)) {
return;
}
JSONObject jsonObject = new JSONObject(pushData);
// 推送消息附加字段
String extras = jsonObject.optString("n_extras");
// 处理海纳云智能营销推送的 "打开 App"、"打开 URL"、"自定义消息" 动作
handleHinaCloudPushMessage(extras);
} catch (Exception e) {
e.printStackTrace();
}
}
}
友盟推送
上报 “推送 ID”
在 IUmengRegisterCallback 的 onSuccess 接口中调用:HinaCloudSDK.getInstance().setPushUId("umeng_id", token)。
注意:若推送 ID 存在实效性,建议调用:HinaCloudSDK.getInstance().userSet(“push_id”,s)。
// 推送 ID 的处理
PushAgent.getInstance(context).register(new IUmengRegisterCallback() {
@Override
public void onSuccess(String token) {
//上报友盟 "推送 ID"
HinaCloudSDK.getInstance().setPushUId("umeng_id", token);
}
@Override
public void onFailure(String s, String s1) {}
});
记录 「推送点击」事件并处理平台推送的消息
需要在 launchApp、openUrl、openActivity、dealWithCustomAction 这 4 个接口中调用 trackAppOpenNotification(uMessage.extra, uMessage.title, uMessage.text) 和 handleHinaCloudPushMessage(notificationExtras)。
PushAgent.getInstance(context).setNotificationClickHandler(new UmengNotificationClickHandler() {
@Override
public void launchApp(Context context, UMessage uMessage) {
super.launchApp(context, uMessage);
// 触发 App 打开推送消息 事件
trackAppOpenNotification(uMessage.extra, uMessage.title, uMessage.text);
// 处理海纳云智能营销推送消息的动作(海纳云智能营销的推送消息必须在 launchApp 接口中处理)
handleHinaCloudPushMessage(uMessage.extra);
}
@Override
public void openUrl(Context context, UMessage uMessage) {
super.openUrl(context, uMessage);
// 触发 App 打开推送消息 事件
trackAppOpenNotification(uMessage.extra, uMessage.title, uMessage.text);
}
@Override
public void dealWithCustomAction(Context context, UMessage uMessage) {
super.dealWithCustomAction(context, uMessage);
// 触发 App 打开推送消息 事件
trackAppOpenNotification(uMessage.extra, uMessage.title, uMessage.text);
}
@Override
public void openActivity(Context context, UMessage uMessage) {
super.openActivity(context, uMessage);
// 触发 App 打开推送消息 事件
trackAppOpenNotification(uMessage.extra, uMessage.title, uMessage.text);
}
});
厂商通道使用说明
需要在处理厂商通道的 Activity 的 onMessage 接口中处理消息,调用 trackAppOpenNotification(extraStr, title, content) 和 handleHinaCloudPushMessage(notificationExtras)。
/**
* 友盟厂商通道消息的 Activity 。
* <p>
* 该 Activity 需继承自 UmengNotifyClickActivity,同时实现父类的 onMessage 方法,
* 对该方法的 intent 参数进一步解析即可,该方法异步调用,不阻塞主线程。
* 并设置 launchMode="singleTask" 和 exported="true"
*/
public class HandlePushActivity extends UmengNotifyClickActivity {
/**
* 处理友盟厂商通道消息
*/
@Override
public void onMessage(Intent intent) {
super.onMessage(intent);
if (intent != null) {
// 如果你们使用了友盟的厂商通道消息,需要在 onMessage 处理厂商通道消息!!!
String messageBody = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
Log.e("TODO", "厂商通道消息:" + messageBody);
if (!TextUtils.isEmpty(messageBody)) {
try {
JSONObject push = new JSONObject(messageBody);
JSONObject extra = push.optJSONObject("extra");
String extraStr = null;
if (extra != null) {
extraStr = extra.toString();
// 处理海纳云智能营销推送消息的动作
handleHinaCloudPushMessage(extraStr);
}
// 推送标题
String title = push.optJSONObject("body").optString("title");
// 推送内容
String content = push.optJSONObject("body").optString("text");
// 触发 App 打开推送消息 事件
trackAppOpenNotification(extraStr, title, content);
Log.e("TODO",
String.format("title: %s。content:%s。extraStr: %s。", title, content, extraStr));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
个推推送
上报 “推送 ID”
在 GTIntentService 的 onReceiveClientId 接口中调用:HinaCloudSDK.getInstance().setPushUId("getui_id",clientId)
注意:若推送 ID 存在实效性,建议调用:HinaCloudSDK.getInstance().userSet(“push_id”,s)。
// 推送 ID 的处理
public class GeTuiService extends GTIntentService {
@Override
public void onReceiveClientId(Context context, String clientId) {
//上报个推 "推送 ID"
HinaCloudSDK.getInstance().setPushUId("getui_id", clientId);
}
}
记录 「推送点击」事件并处理平台推送的消息
需要在 onNotificationMessageClicked 记录通知消息被点击的通知标题和通知内容,在 onReceiveMessageData 接口中记录事件并处理平台推送的消息。
public class GeTuiService extends GTIntentService {
private boolean isNotificationClick = false;
private String title;
private String content;
/**
* 点击通知消息。
* 上报「推送点击」事件需要在 onReceiveMessageData 接口获取海纳云智能营销的消息内容,因此此处先将通知的标题和内容保存到成员变量中
*/
@Override
public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) {
title = gtNotificationMessage.getTitle();
content = gtNotificationMessage.getContent();
isNotificationClick = true;
}
/**
* 处理透传消息到达 或 通知消息的点击
*/
@Override
public void onReceiveMessageData(Context context, GTTransmitMessage gtTransmitMessage) {
if(context ==null || gtTransmitMessage ==null) return;
/*
* 透传消息的处理,此处仅仅演示了 sf_data 推送的相关字段,注意,如果你有原有的逻辑也有相关处理
* 的逻辑,需要做一定的兼容处理。
*/
byte[] payload = gtTransmitMessage.getPayload();
String sfData = new String(payload);
/*
* onReceiveMessageData 在 透传消息的到达 与 通知消息的点击 时都会被回调,但只有 通知消息的点击 时需要上报「推送到达」事件。
* 因此通过 isNotificationClick 变量来判断本次 onReceiveMessageData 被调用是由于 透传消息到达 还是 通知消息的点击
*/
if (isNotificationClick) {
isNotificationClick = false;
trackAppOpenNotification(sfData, title, content);
handleHinaCloudConfig(sfData);
}else{
/*
* 透传消息到达需要自定义处理。例如从 sfData 获取出标题和内容来手动触发一个 notification
* 透传消息有点击的话,也需要调用 trackAppOpenNotification
*/
}
}
}
厂商通道使用说明
首先需要在在推送设置的的 intent 模板配置 intent,以下为配置示例,开发者可根据自己的项目进行配置。
intent://www.test.com/path?custom=aaa#Intent;scheme=yang;launchFlags=0x10000000;component=com.hinadt.android.push/.HandlePushActivity;S.sf_key={sf_data:{sf_data},title:{sf_customized.title},content:{sf_customized.content}};end
需要在处理厂商通道的 Activity 的 onCreate 中处理 intent,解析出相应的参数,调用 trackAppOpenNotification(extras, title, content)。
public class HandlePushActivity extends AppCompatActivity {
private static final String TAG = "HandlePushActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
handlePushIntent();
}
/**
* 处理推送消息的 Intent
*/
private void handlePushIntent() {
Intent intent = getIntent();
if (intent != null) {
// 拿到自定义透传字段的值
String sf_key = intent.getStringExtra("sf_key");
Log.i(TAG, sf_key);
if (TextUtils.isEmpty(sf_key)) {
return;
}
try {
JSONObject jsonObject = new JSONObject(sf_key);
String title = jsonObject.optString("title");
String content = jsonObject.optString("content");
String extras = jsonObject.optString("sf_data");
trackAppOpenNotification(extras, title, content);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
最后编辑:王建华 更新时间:2024-11-08 10:38