消息推送(华为)

关于「进程保活」的需求总是很多,以往的解决办法也是层出不穷,但是随着Android系统的更新,99%的方法已经无效

  • 三方SDK唤醒(不现实)
  • 系统白名单(不靠谱)
  • 应用全家桶(不现实)
  • 系统广播唤醒(不可控)
  • 两个Service互相唤醒(凉了)
  • 使用Timer定时器(凉了)
  • 两个相同id的前台Service(凉了)

现在普遍的做法是集成多个手机厂商的推送(小米,华为,魅族等),再加上一个第三方推送(个推,极光等),然后再添加白名单

  • 我的「个推接入」博客

####注册华为开发者
进入华为开发者联盟注册并实名认证,没啥可说的
####创建应用并点亮服务

  1. 在「会员中心」创建应用
  2. 在「产品服务」中申请「PUSH服务」
  3. 在「移动应用详情」中获取服务参数
    消息推送(华为)_第1张图片
    查看签名文件详细信息的指令:
keytool -list -v -keystore 

####集成SDK
配置maven仓库

maven {
    url 'http://developer.huawei.com/repo/'
}

配置项目依赖

implementation 'com.huawei.android.hms:push:{version-code}' //当日版本 2.6.0.301

####集成Agent并配置Manifest

  1. 进入Agent获取地址下载压缩包并解压
  2. 执行GetHMSAgent.bat,生成copysrc文件夹
  3. 复制需要的代码到工程项目中
  4. 配置Manifest文件(复制生成xml文件中的内容)
    消息推送(华为)_第2张图片
    拷贝代码时注意路径,建议复制整个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);
	}
});

####相关文档

  • 创建应用相关
  • 项目配置相关
  • 官方开发指南

第一次启动应用会下载华为服务,剩余的工作就只有收到推送的处理了。

你可能感兴趣的:(Android开发)