本章节介绍接入厂商通道后如何使用辅助弹窗。
前言
在厂商通道收到推送通知消息并展示到系统通知栏后,辅助弹窗会协助开发者处理推送的数据,包括:
解密推送数据
将推送的明文数据传给App处理
App开发接入辅助弹窗请参考App集成辅助弹窗。
后端通过辅助通道推送通知消息请参考服务端配置。
准备工作
已经按照Android SDK接入完成了移动推送SDK的接入。
已经按照第一步:接入辅助通道完成了辅助通道的接入。
App集成辅助弹窗
1 自定义实现辅助弹窗Activity
1.1 自定义实现辅助弹窗中转Activity
这个方案介绍的是自定义Activity作为中转Activity,辅助获取推送的额外参数,额外参数里必须配置指定Activity的路由信息,您可以根据这些路由信息跳转到指定Activity。
如果您通过推送通知要打开的Activity页面较多的话,建议用这种方式。
在推送时,配置的打开的页面要配置成实现的辅助弹窗中转Activity,且真正要打开的指定Activity路由信息需要配置在额外参数中。
自定义Activity继承自
AndroidPopupActivity
或者通过PopupNotifyClick
实现。实现
AndroidPopupActivity
的抽象方法onSysNoticeOpened
,该方法是成功解密推送数据后的回调方法,在该方法内可以获取到通知的标题、内容和额外参数,您可以根据这些参数跳转到具体的Activity。重写
AndroidPopupActivity
的onNotPushData
方法,该方法是没有获取到推送数据的回调方法。重写
AndroidPopupActivity
的onParseFailed
方法,该方法是对推送数据解密失败的回调方法。
方案一:自定义Activity继承自AndroidPopupActivity
import android.content.Intent
import android.os.Bundle
import com.alibaba.sdk.android.push.AndroidPopupActivity
class PopupPushActivity : AndroidPopupActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
override fun onSysNoticeOpened(title: String, summary: String, extMap: Map<String, String>) {
//TODO 获取推送参数,跳转到指定页面
finish()
}
/**
* 不是推送数据的回调
*
* @param intent
*/
override fun onNotPushData(intent: Intent) {
super.onNotPushData(intent)
finish()
}
/**
* 是推送数据,但是又解密失败时的回调
*
* @param intent
*/
override fun onParseFailed(intent: Intent) {
super.onParseFailed(intent)
finish()
}
}
import android.content.Intent;
import android.os.Bundle;
import com.alibaba.sdk.android.push.AndroidPopupActivity;
import java.util.Map;
public class PopupPushActivity extends AndroidPopupActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
@Override
protected void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
//TODO 获取推送参数,跳转到指定页面
finish();
}
/**
* 不是推送数据的回调
*
* @param intent
*/
@Override
public void onNotPushData(Intent intent) {
super.onNotPushData(intent);
finish();
}
/**
* 是推送数据,但是又解密失败时的回调
*
* @param intent
*/
@Override
public void onParseFailed(Intent intent) {
super.onParseFailed(intent);
finish();
}
}
方案二:自定义Activity实现PopupNotifyClick
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener
import com.alibaba.sdk.android.push.popup.PopupNotifyClick
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener
class PopupPushActivity : Activity(), PopupNotifyClickListener,
OnPushParseFailedListener {
private val mPopupNotifyClick = PopupNotifyClick(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mPopupNotifyClick.onCreate(this, intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
mPopupNotifyClick.onNewIntent(intent)
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
override fun onSysNoticeOpened(title: String, summary: String, extMap: Map<String, String>) {
//TODO 获取推送参数,跳转到指定页面
finish()
}
/**
* 不是推送数据的回调
*
* @param intent
*/
override fun onNotPushData(intent: Intent) {
finish()
}
/**
* 是推送数据,但是又解密失败时的回调
*
* @param intent
*/
override fun onParseFailed(intent: Intent) {
finish()
}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener;
import com.alibaba.sdk.android.push.popup.PopupNotifyClick;
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener;
import java.util.Map;
public class PopupPushActivity extends Activity implements PopupNotifyClickListener, OnPushParseFailedListener {
private final PopupNotifyClick mPopupNotifyClick = new PopupNotifyClick(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPopupNotifyClick.onCreate(this, getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
mPopupNotifyClick.onNewIntent(intent);
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
@Override
public void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
//TODO 获取推送参数,跳转到指定页面
finish();
}
/**
* 不是推送数据的回调
*
* @param intent
*/
@Override
public void onNotPushData(Intent intent) {
finish();
}
/**
* 是推送数据,但是又解密失败时的回调
*
* @param intent
*/
@Override
public void onParseFailed(Intent intent) {
finish();
}
}
1.2 已有Activity实现辅助弹窗
这个方案介绍的是已有Activity直接实现辅助弹窗,点击推送通知直接打开已有Activity。
如果您通过推送通知要打开的Activity页面较少的话,也可以用这种方式。
在推送时,配置的打开的页面要配置成已经实现辅助弹窗的Activity。
一般App开发有自己的BaseActivity
,所以这里只介绍使用PopupNotifyClick
实现辅助弹窗。
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener
import com.alibaba.sdk.android.push.popup.PopupNotifyClick
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener
class PopupPushActivity : Activity(), PopupNotifyClickListener,
OnPushParseFailedListener {
private val mPopupNotifyClick = PopupNotifyClick(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mPopupNotifyClick.onCreate(this, intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
mPopupNotifyClick.onNewIntent(intent)
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
override fun onSysNoticeOpened(title: String, summary: String, extMap: Map<String, String>) {
//TODO 获取推送参数,根据业务需求处理
finish()
}
/**
* 不是推送数据的回调
*
* @param intent
*/
override fun onNotPushData(intent: Intent) {
//TODO 没有推送数据,可能是异常调用,需要异常处理
}
/**
* 是推送数据,但是又解密失败时的回调
*
* @param intent
*/
override fun onParseFailed(intent: Intent) {
//TODO 推送数据解密异常,需要异常处理
}
}
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.alibaba.sdk.android.push.popup.OnPushParseFailedListener;
import com.alibaba.sdk.android.push.popup.PopupNotifyClick;
import com.alibaba.sdk.android.push.popup.PopupNotifyClickListener;
import java.util.Map;
public class PopupPushActivity extends Activity implements PopupNotifyClickListener, OnPushParseFailedListener {
private final PopupNotifyClick mPopupNotifyClick = new PopupNotifyClick(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPopupNotifyClick.onCreate(this, getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
mPopupNotifyClick.onNewIntent(intent);
}
/**
* 实现通知打开回调方法,获取通知相关信息
* @param title 标题
* @param summary 内容
* @param extMap 额外参数
*/
@Override
public void onSysNoticeOpened(String title, String summary, Map<String, String> extMap) {
//TODO 获取推送参数,根据业务需求处理
finish();
}
/**
* 不是推送数据的回调
*
* @param intent
*/
@Override
public void onNotPushData(Intent intent) {
//TODO 没有推送数据,可能是异常调用,需要异常处理
}
/**
* 是推送数据,但是又解密失败时的回调
*
* @param intent
*/
@Override
public void onParseFailed(Intent intent) {
//TODO 推送数据解密异常,需要异常处理
}
}
2 注册辅助弹窗Activity
在AndroidManifest.xml
文件中注册您自定义实现的辅助弹窗Activity,在application
节点下添加。
<activity
android:name="辅助弹窗Activity的全限定类名"
android:exported="true">
<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:host="${applicationId}"
android:path="/thirdpush"
android:scheme="agoo" />
</intent-filter>
</activity>
android:exported=true
必须配置。
服务端配置
服务端可以使用OpenAPI,也可以使用阿里云控制台。
使用移动推送进行厂商通道推送时,服务端必须进行以下配置,服务端参数不设置,不会给厂商通道进行推送。
1、OpenAPI推送配置
OpenAPI 2.0的推送高级接口提供了
AndroidPopupActivity
、AndroidPopupTitle
和AndroidPopupBody
三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:StoreOffline
参数也需要设置为true);辅助弹窗仅在当前厂商通道设备的应用后台进程被清理时生效,对非接入厂商通道设备和在线的设备不生效。
当辅助弹窗生效时,推送接口的Title、Body、AndroidActivity以及额外参数设置中的功能性设置(如声音、震动等)都不起作用;
服务端配置示例:
PushRequest pushRequest = new PushRequest();
// 其余设置省略
// 通知
pushRequest.setPushType("NOTICE");
// 标题
pushRequest.setTitle(dateFormat.format(new Date()));
// 内容
pushRequest.setBody("PushRequest body");
// 额外参数
pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
// 设置辅助弹窗打开Activity,填写Activity类名,需包名+类名
pushRequest.setAndroidPopupActivity("*****");
// 设置辅助弹窗通知标题
pushRequest.setAndroidPopupTitle("*****");
// 设置辅助弹窗通知内容
pushRequest.setAndroidPopupBody("*****");
// 72小时后消息失效, 不会再发送
String expireTime = ParameterHelper.getISO8601Time(new Date(System.currentTimeMillis() + 72 * 3600 * 1000));
pushRequest.setExpireTime(expireTime);
// 离线消息是否保存,若保存, 在推送时候,用户即使不在线,下一次上线则会收到
pushRequest.setStoreOffline(true);
//推送消息类型时,设置true,设备离线时会自动把消息转成辅助通道的通知
pushRequest.setAndroidRemind(true);
2、阿里云控制台推送配置
登录移动研发平台EMAS,选择移动推送后选择对应的应用,在左侧导航栏选择创建消息>推送通知,在高级设置(选填)中,设置厂商通道必要参数,如下图所示。