本章節介紹接入廠商通道后如何使用輔助彈窗。
前言
在廠商通道收到推送通知消息并展示到系統通知欄后,輔助彈窗會協助開發者處理推送的數據,包括:
解密推送數據
將推送的明文數據傳給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,選擇移動推送后選擇對應的應用,在左側導航欄選擇創建消息>推送通知,在高級設置(選填)中,設置廠商通道必要參數,如下圖所示。