在使用信鸽推送时,自定义接收器发送广播,在自定义application中处理广播时重复处理的
程序员文章站
2022-07-15 15:53:56
...
信鸽推送,在自定义receiver中发送广播,application中处理广播,会重复的问题
前言:最近的一个项目中需要使用到推送,考虑到送达率的问题,经大牛介绍,使用了腾讯公司的信鸽推送,项目大概的需求是,另一个硬件设备推送一条语音消息到我们服务器,我们服务器然后推送一条通知给我,我再去下载那条语音消息,其实很简单,我的思路就是:首先自定义一个receiver,在onNotifactionShowedResult()方法中拦截一下推送通知,自定义处理,发送一个广播给我app的application中处理,但是在处理过程中发现,download后的回调方法会被执行两次,通过lag发现,两次的执行的进程不在一起,第一次是在主线程中执行的,而第二次确是在信鸽的线程中执行,信鸽官方文档也确实说明了,推送所需要的service是另起了一个进程运行的:
如果不做任何处理,运行时,就会出现如下问题:
上边的红色框里边为信鸽进程的执行,下边为主线程的执行;
解决办法:
需要在电泳下载的位置做一下判断:如果不是主线程则不执行下载,具体方法如下:
/**
* 获取当前进程名
*/
private String getCurrentProcessName() {
int pid = android.os.Process.myPid();
String processName = "";
ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) {
if (process.pid == pid) {
processName = process.processName;
}
}
return processName;
}
/**
* 包名判断是否为主进程
*
* @param
* @return
*/
public boolean isMainProcess() {
return getApplicationContext().getPackageName().equals(getCurrentProcessName());
}
使用isMainProcess()判断是否在主线程即可。
水平有限,有错误的地方还请指正。
上一篇: IIS并发优化.md
下一篇: tomcat漏洞利用