1. 程式人生 > >訊息推送(華為)

訊息推送(華為)

關於「程序保活」的需求總是很多,以往的解決辦法也是層出不窮,但是隨著Android系統的更新,99%的方法已經無效

  • 三方SDK喚醒(不現實)
  • 系統白名單(不靠譜)
  • 應用全家桶(不現實)
  • 系統廣播喚醒(不可控)
  • 兩個Service互相喚醒(涼了)
  • 使用Timer定時器(涼了)
  • 兩個相同id的前臺Service(涼了)

現在普遍的做法是整合多個手機廠商的推送(小米,華為,魅族等),再加上一個第三方推送(個推,極光等),然後再新增白名單

####註冊華為開發者
進入華為開發者聯盟註冊並實名認證,沒啥可說的
####建立應用並點亮服務

  1. 在「會員中心」建立應用
  2. 在「產品服務」中申請「PUSH服務」
  3. 在「移動應用詳情」中獲取服務引數
    引數說明
    檢視簽名檔案詳細資訊的指令:
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

  1. 執行GetHMSAgent.bat,生成copysrc資料夾
  2. 複製需要的程式碼到工程專案中
  3. 配置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);
	}
});

####相關文件

第一次啟動應用會下載華為服務,剩餘的工作就只有收到推送的處理了。