訊息推送(華為)
阿新 • • 發佈:2019-01-06
關於「程序保活」的需求總是很多,以往的解決辦法也是層出不窮,但是隨著Android系統的更新,99%的方法已經無效
- 三方SDK喚醒(不現實)
- 系統白名單(不靠譜)
- 應用全家桶(不現實)
- 系統廣播喚醒(不可控)
- 兩個Service互相喚醒(涼了)
- 使用Timer定時器(涼了)
- 兩個相同id的前臺Service(涼了)
現在普遍的做法是整合多個手機廠商的推送(小米,華為,魅族等),再加上一個第三方推送(個推,極光等),然後再新增白名單
####註冊華為開發者
進入華為開發者聯盟註冊並實名認證,沒啥可說的
####建立應用並點亮服務
- 在「會員中心」建立應用
- 在「產品服務」中申請「PUSH服務」
- 在「移動應用詳情」中獲取服務引數
檢視簽名檔案詳細資訊的指令:
keytool -list -v -keystore <keystore-file>
####整合SDK
配置maven倉庫
maven {
url 'http://developer.huawei.com/repo/'
}
配置專案依賴
implementation 'com.huawei.android.hms:push:{version-code}' //當日版本 2.6.0.301
####整合Agent並配置Manifest
- 執行GetHMSAgent.bat,生成copysrc資料夾
- 複製需要的程式碼到工程專案中
- 配置Manifest檔案(複製生成xml檔案中的內容)
拷貝程式碼時注意路徑,建議複製整個huawei資料夾到專案的com資料夾下
####程式碼編寫
#####自定義廣播接收者
public class MyHMSReceiver extends PushReceiver { @Override public void onToken(Context context, String token, Bundle extras) { Log.e(" =R= onToken:", "token:" + token); } @Override public boolean onPushMsg(Context context, byte[] msg, Bundle bundle) { //收到透傳 try { String content = new String(msg, "UTF-8"); Log.e(" =R= onPushMsg:", "content:" + content); } catch (Exception e) { e.printStackTrace(); } return false; } public void onEvent(Context context, Event event, Bundle extras) { //通知欄事件,可自定義 if (Event.NOTIFICATION_OPENED.equals(event) || Event.NOTIFICATION_CLICK_BTN.equals(event)) { int notifyId = extras.getInt(BOUND_KEY.pushNotifyId, 0); Log.e(" =R= onEvent:", "notifyId:" + notifyId); if (0 != notifyId) { NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); manager.cancel(notifyId); } } String message = extras.getString(BOUND_KEY.pushMsgKey); Log.e(" =R= onEvent:", "message:" + message); super.onEvent(context, event, extras); } @Override public void onPushState(Context context, boolean pushState) { Log.e(" =R= onPushState:", "pushState:" + pushState); } }
別忘了替換AndroidManifest.xml檔案中配置的Receiver的name屬性
#####application檔案中初始化HMSAgent
HMSAgent.init(this);
別忘了在AndroidManifest.xml檔案中替換application的name屬性
#####應用啟動時呼叫Connect
HMSAgent.connect(this, new ConnectHandler() {
@Override
public void onConnect(int rst) {
Log.e("onConnect:", "rst:" + rst);
}
});
#####連線後申請token
HMSAgent.Push.getToken(new GetTokenHandler() {
@Override
public void onResult(int rst) {
Log.e("getToken:", "rst:" + rst);
}
});
獲取token後會呼叫MyHMSReceiver的onToken()方法
#####登出token
HMSAgent.Push.deleteToken("token", new DeleteTokenHandler() {
@Override
public void onResult(int rst) {
Log.e("deleteToken:", "rst:" + rst);
}
});
登出後,客戶端將不會接收推送訊息
#####查詢Push連線狀態
HMSAgent.Push.getPushState(new GetPushStateHandler() {
@Override
public void onResult(int rst) {
Log.e("getPushState:", "rst:" + rst);
}
});
查詢後會呼叫MyHMSReceiver的onPushState()方法
#####是否允許接收Push透傳訊息
HMSAgent.Push.enableReceiveNormalMsg(enable, new EnableReceiveNormalMsgHandler() {
@Override
public void onResult(int rst) {
Log.e("enableReceiveNormalMsg:", "rst:" + rst);
}
});
#####是否接收Push通知欄訊息
HMSAgent.Push.enableReceiveNotifyMsg(true, new EnableReceiveNotifyMsgHandler() {
@Override
public void onResult(int rst) {
Log.e("enableReceiveNotifyMsg:", "rst:" + rst);
}
});
#####查詢華為Push使用者協議
HMSAgent.Push.queryAgreement(new QueryAgreementHandler() {
@Override
public void onResult(int rst) {
Log.e("queryAgreement:", "rst:" + rst);
}
});
####相關文件
第一次啟動應用會下載華為服務,剩餘的工作就只有收到推送的處理了。