一 前言
集成原因,由于公司項(xiàng)目集成極光推送澎灸,Android 8+以上的手機(jī)院塞,app 在未運(yùn)行的情況下接收不到消息,而且現(xiàn)在SDK版本要更新到26性昭,華為手機(jī)有影響拦止。
二 集成
華為推送集成,浪費(fèi)了我不少時(shí)間糜颠,主要還是文檔有些亂汹族。集成之后我把它分為三部分,一其兴,配置集成環(huán)境顶瞒;二,處理接收消息元旬。三榴徐,點(diǎn)擊通知欄,跳轉(zhuǎn)到相應(yīng)頁面匀归。
配置集成環(huán)境
AndroidStudo依賴(我這里只集成推送)
compile 'com.huawei.android.hms:push:2.6.3.301'
SDK獲取 下載相應(yīng) HMSAgent_2.6.3.301.zip 版本坑资,下載完成后,
運(yùn)行GetHMSAgent_cn.bat文件朋譬,
輸入相應(yīng)的信息包名和appid(這個(gè)需要自行申請(qǐng))盐茎,有一個(gè)支付id,沒有可以瞎填徙赢;
選擇完成之后把copysrc目錄的java文件復(fù)制到自己的項(xiàng)目里字柠;
AppManifestConfig.xml復(fù)制到自己的app的AndroidManifest.xml中;
初始化與激活
首先根據(jù)emui版本判斷是否可以使用華為推送
/**
* 判斷是否可以使用華為推送
*
* @return
*/
public static Boolean canHuaWeiPush() {
int emuiApiLevel = 0;
try {
Class cls = Class.forName("android.os.SystemProperties");
Method method = cls.getDeclaredMethod("get", new Class[]{String.class});
emuiApiLevel = Integer.parseInt((String) method.invoke(cls, new Object[]{"ro.build.hw_emui_api_level"}));
} catch (Exception e) {
e.printStackTrace();
return false;
}
return emuiApiLevel > 5.0;
}
初始化
HMSAgent.init(application);
激活Token狡赐,并且發(fā)送到服務(wù)器
// 連接華為服務(wù)器
public static void HUAWEIConnect(Activity activity) {
HMSAgent.connect(activity, new ConnectHandler() {
@Override
public void onConnect(int rst) {
LogUtils.e("connect result" + rst);
}
});
}
/**
* 激活華為token
*/
public static void getToken() {
LogUtils.e("get token: begin");
HMSAgent.Push.getToken(new GetTokenHandler() {
@Override
public void onResult(int rst) {
LogUtils.e("token result" + rst);
}
});
}
獲取的token窑业,會(huì)在相應(yīng)的廣播接收器中
需要在Activity或者application中注冊(cè)IPushCallback監(jiān)聽,獲取token枕屉,在發(fā)送自己的后臺(tái)服務(wù)器常柄。
處理接收消息
華為一般有兩個(gè)revicer,作用不同。下面這個(gè)根據(jù) <intent-filter>西潘,可以看出是用來接收token的卷玉。另外說一下,消息分為透傳消息和通知欄消息喷市。我使用的是通知欄消息相种,這個(gè)Revicer的透傳消息沒用用到。
<receiver android:name="包名.HuaweiPushRevicer"
android:permission="cn.gydata.bidding.permission.PROCESS_PUSH_MSG">
<intent-filter>
<!-- 必須,用于接收token -->
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
<!-- 必須, 用于接收透傳消息 -->
<action android:name="com.huawei.android.push.intent.RECEIVE" />
<!-- 必須, 用于接收通知欄消息點(diǎn)擊事件 此事件不需要開發(fā)者處理品姓,只需注冊(cè)就可以-->
<action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY"/>
</intent-filter>
</receiver>
另外一個(gè)Revicer寝并,兩個(gè)Revicer不同之處在與 <intent-filter>,功能也就不同腹备。這
<receiver android:name="相應(yīng)包名.HuaWeiRevicer">
<intent-filter>
<!-- 用于點(diǎn)擊通知欄或通知欄上的按鈕后觸發(fā)onEvent回調(diào) -->
<action android:name="com.huawei.android.push.intent.CLICK" />
<!-- 查看push通道是否連接, 不查看則不需要 -->
<action android:name="com.huawei.intent.action.PUSH_STATE"/>
</intent-filter>
</receiver>
個(gè)Revicer的作用在于接收通知欄觸發(fā)時(shí)間以及通知欄消息
點(diǎn)擊通知欄跳轉(zhuǎn)到相應(yīng)頁面
在AndroidManifest.xml中聲明一個(gè)透明activity衬潦,用來中轉(zhuǎn)到想要的頁面
<activity
android:name="包名(自定義).HWPushTranslateActivity"
android:theme="@android:style/Theme.Translucent">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="cn.test.android.push(自定義)"
android:path="/notification(自定義)"
android:scheme="huaweipush(自定義)" />
</intent-filter>
</activity>
生成相應(yīng)的intentUri,把它給后臺(tái)植酥,填寫到華為的服務(wù)器上镀岛。點(diǎn)擊通知欄消息,就可以直接跳轉(zhuǎn)到這個(gè)HWPushTranslateActivity友驮。
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("huaweipush://cn.test.android.push/notification?action=push(自定義action參數(shù))" ));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
String intnetUri = intent.toUri(Intent.URI_INTENT_SCHEME);
Log.d("hwpush", intnetUri);
生成的intnetUri給后臺(tái)就行哎媚。華為就可以隱式跳轉(zhuǎn)到HWPushTranslateActivity,HWPushTranslateActivity里面獲取action再跳轉(zhuǎn)到相應(yīng)的頁面就可以了喊儡。
String action = getIntent().getData().getQueryParameter("action")
三 總結(jié)
難點(diǎn)在于用GetHMSAgent_cn.bat生成符合項(xiàng)目的文件,也不是難就是文檔不清楚稻据。另外艾猜,點(diǎn)擊通知欄不打開啟動(dòng)頁,需要配置HWPushTranslateActivity捻悯。