本章节介绍接入厂商通道后如何使用辅助弹窗。
前言
在厂商通道收到推送通知消息并展示到系统通知栏后,辅助弹窗会协助开发者处理推送的数据,包括:
- 解密推送数据 
- 将推送的明文数据传给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,也可以使用阿里云控制台。
使用移动推送进行厂商通道推送时,服务端必须进行以下配置,服务端参数不设置,不会给厂商通道进行推送。
- OpenAPI推送配置 - OpenAPI 2.0的推送高级接口提供了 - AndroidPopupActivity、- AndroidPopupTitle和- AndroidPopupBody三个参数,分别用于设置辅助弹窗通知打开时跳转的Activity、通知标题以及通知内容(注意:- StoreOffline参数也需要设置为true)。
 说明- 辅助弹窗仅在设备通过当前厂商通道进行离线推送,且App后台进程被清理时生效。对于未接入厂商通道的设备,或当前处于在线状态的设备,该功能不生效。 
- 当辅助弹窗生效时,推送接口的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);
- 阿里云控制台推送配置 - 登录移动研发平台EMAS,选择移动推送后选择对应的应用,在左侧导航栏选择创建任务>推送通知,在厂商设置中,设置厂商通道必要参数,如下图所示。 