关于「进程保活」的需求总是很多,以往的解决办法也是层出不穷,但是随着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. 进入Agent获取地址下载压缩包并解压
  2. 执行GetHMSAgent.bat,生成copysrc文件夹
  3. 复制需要的代码到工程项目中
  4. 配置Manifest文件(复制生成xml文件中的内容)
    消息推送(华为)-编程之家
    拷贝代码时注意路径,建议复制整个huawei文件夹到项目的com文件夹下

####代码编写
#####自定义广播接收者

public class MyHMSReceiver extends PushReceiver {@Overridepublic void onToken(Context context, String token, Bundle extras) {Log.e(" =R= onToken:", "token:" + token);}@Overridepublic 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);}@Overridepublic 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() {@Overridepublic void onConnect(int rst) {Log.e("onConnect:", "rst:" + rst);}
});

#####连接后申请token

HMSAgent.Push.getToken(new GetTokenHandler() {@Overridepublic void onResult(int rst) {Log.e("getToken:", "rst:" + rst);}
});

获取token后会调用MyHMSReceiver的onToken()方法
#####注销token

HMSAgent.Push.deleteToken("token", new DeleteTokenHandler() {@Overridepublic void onResult(int rst) {Log.e("deleteToken:", "rst:" + rst);}
});

注销后,客户端将不会接收推送消息
#####查询Push连接状态

HMSAgent.Push.getPushState(new GetPushStateHandler() {@Overridepublic void onResult(int rst) {Log.e("getPushState:", "rst:" + rst);}
});

查询后会调用MyHMSReceiver的onPushState()方法
#####是否允许接收Push透传消息

HMSAgent.Push.enableReceiveNormalMsg(enable, new EnableReceiveNormalMsgHandler() {@Overridepublic void onResult(int rst) {Log.e("enableReceiveNormalMsg:", "rst:" + rst);}
});

#####是否接收Push通知栏消息

HMSAgent.Push.enableReceiveNotifyMsg(true, new EnableReceiveNotifyMsgHandler() {@Overridepublic void onResult(int rst) {Log.e("enableReceiveNotifyMsg:", "rst:" + rst);}
});

#####查询华为Push用户协议

HMSAgent.Push.queryAgreement(new QueryAgreementHandler() {@Overridepublic void onResult(int rst) {Log.e("queryAgreement:", "rst:" + rst);}
});

####相关文档

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

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