关于「进程保活」的需求总是很多,以往的解决办法也是层出不穷,但是随着Android系统的更新,99%的方法已经无效
- 三方SDK唤醒(不现实)
- 系统白名单(不靠谱)
- 应用全家桶(不现实)
- 系统广播唤醒(不可控)
- 两个Service互相唤醒(凉了)
- 使用Timer定时器(凉了)
- 两个相同id的前台Service(凉了)
现在普遍的做法是集成多个手机厂商的推送(小米,华为,魅族等),再加上一个第三方推送(个推,极光等),然后再添加白名单
- 我的「个推接入」博客
####注册华为开发者
进入华为开发者联盟注册并实名认证,没啥可说的
####创建应用并点亮服务
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
- 进入Agent获取地址下载压缩包并解压
- 执行GetHMSAgent.bat,生成copysrc文件夹
- 复制需要的代码到工程项目中
- 配置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);}
});
####相关文档
- 创建应用相关
- 项目配置相关
- 官方开发指南
第一次启动应用会下载华为服务,剩余的工作就只有收到推送的处理了。