欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在使用信鸽推送时,自定义接收器发送广播,在自定义application中处理广播时重复处理的

程序员文章站 2022-07-15 15:53:56
...

信鸽推送,在自定义receiver中发送广播,application中处理广播,会重复的问题

前言:最近的一个项目中需要使用到推送,考虑到送达率的问题,经大牛介绍,使用了腾讯公司的信鸽推送,项目大概的需求是,另一个硬件设备推送一条语音消息到我们服务器,我们服务器然后推送一条通知给我,我再去下载那条语音消息,其实很简单,我的思路就是:首先自定义一个receiver,在onNotifactionShowedResult()方法中拦截一下推送通知,自定义处理,发送一个广播给我app的application中处理,但是在处理过程中发现,download后的回调方法会被执行两次,通过lag发现,两次的执行的进程不在一起,第一次是在主线程中执行的,而第二次确是在信鸽的线程中执行,信鸽官方文档也确实说明了,推送所需要的service是另起了一个进程运行的:

在使用信鸽推送时,自定义接收器发送广播,在自定义application中处理广播时重复处理的

如果不做任何处理,运行时,就会出现如下问题:
在使用信鸽推送时,自定义接收器发送广播,在自定义application中处理广播时重复处理的

上边的红色框里边为信鸽进程的执行,下边为主线程的执行;

解决办法:

    需要在电泳下载的位置做一下判断:如果不是主线程则不执行下载,具体方法如下:
  /**
     * 获取当前进程名
     */
    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()判断是否在主线程即可。

水平有限,有错误的地方还请指正。