(系统的推送)友盟推送

2023-11-11

今年再次负责这个模块,最大亮点就是支持了系统的推送,也就是说你设备退出后台应用了,发推送还可以收到推送
https://info.umeng.com/detail?id=169&&cateId=1

在这里插入图片描述
测试方案

选择测试模式,可以无限制的发送数量
公司测试手机设备 token

  • 下发路径
    com.niaoyun.nycloud.AppStarActvitiy

集成文章 https://developer.umeng.com/docs/66632/detail/98581
后台控制台 https://message.umeng.com/app/5d6f846e4ca357d57f000866/messages/push

消息通知可以

umeng_push_notification_default_small_icon

测试模式需要第一步添加测试设备

集成其它厂商的注意点

使用弹窗功能

在这里插入图片描述

一定要指定某个activity,继承自UmengNotifyClickActivity 2 launchMode=”singleTask”和exported=”true” ,注意提醒后台也要此功能

1 现在的android手机对后台进程做了诸多限制。若使用一键清理,应用的channel进程被清除,将接收不到推送。通过接入小米托管弹窗功能,可有效防止以上情况,增加推送消息的送达率。通知将由小米系统托管弹出,点击通知栏将跳转到指定的Activity。该Activity需继承自UmengNotifyClickActivity,同时实现父类的onMessage方法,对该方法的intent参数进一步解析即可,该方法异步调用,不阻塞主线程.
2 如果不指定exported=”true”,进行一键清理后台所有应用(仅仅清楚指定的应用无影响),还是不能离线推送成功

缺陷

自测用通知模式可以收到离线后的消息
自定义的不行
不知是哪里错了吗

使用exported=”true”

发现每次进去那个页面老是显示出来,比如我以启动页设置了这个属性后
解决方式

Activity aty = AppManager.getActivity(MainActivity.class);
if ((aty != null && !aty.isFinishing())) {
        finish();
 }

百度查了exported

android:exported这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。

检查app是否已注册到系统通道

调试设备,看logcat日志,在搜索框填入以下筛选条件 device token|MiPushBroadcastReceiver|HuaWeiReceiver|MeizuPushReceiver


其它内容都可以在这里找到配置方法
https://developer.umeng.com/docs/66632/detail/98589

  • 小米
//小米Push通道
implementation 'com.umeng.umsdk:xiaomi-push:3.6.17
implementation 'com.umeng.umsdk:xiaomi-umengaccs:1.1.0’

MiPushRegistar.register(final Context context, final String XIAOMI_ID, final String XIAOMI_KEY);
"mipush":true
"mi_activity":"com.umeng.message.example.MipushTestActivity" //此处请填写Activity完整包路径

{
"appkey": "",
"mi_activity": "com.umeng.message.example.MipushTestActivity"
"mipush": true,
"timestamp": 1473225266373,
"production_mode": "true",
"type": "unicast",
"device_tokens": "",
"payload":
    {"body":
       {"text": "from pa36a",
        "after_open": "go_app",
        "ticker": "Hello World",
        "title": "listcastpa43"
       }, 
     "display_type": "notification",
    }
}
  • 华为
//华为Push通道
    api 'com.umeng.umsdk:huawei-basetb:2.6.3.305'
    api 'com.umeng.umsdk:huawei-pushtb:2.6.3.305'
    api 'com.umeng.umsdk:huawei-umengaccs:1.2.1'

 HuaWeiRegister.register(context); // 华为appid 需要去另外配置 TODO
 <!--配置华为AppID,无法通过代码设置-->
        <meta-data
            android:name="com.huawei.hms.client.appid"
            android:value="appid=xxxxxx" />

处理方式和小米一样

但是需要额外配置些

  • 魅族
    3、配置系统通知图标
    请在drawable目录下添加一个图标,命名为stat_sys_third_app_notify.png,建议尺寸64px * 64px,图标四周留有透明。若不添加此图标,可能在部分魅族手机上无法弹出通知。

需要处理方式和华为差不多

  • vivo 和 oppo

貌似得上线才具有push 能力
找他们的建立的app,太绕了


/**
 * 友盟push 帮助类
 * @author bingley
 * @date 2019/9/4.
 */
public class UmPushHelper {


    /**
     * 初始化友盟推送信息
     * @param context
     */
    public static void initUmengSDK(Application context) {
        UMConfigure.setLogEnabled(false);
        // 参数一:当前上下文context;
        // 参数二:应用申请的Appkey(需替换);
        // 参数三:渠道名称;
        // 参数四:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机;
        // 参数五:Push推送业务的secret 填充Umeng Message Secret对应信息(需替换)
        UMConfigure.init(context, UmConfig.UM_APP_KEY, "umeng", UMConfigure.DEVICE_TYPE_PHONE,
                UmConfig.UM_MESSAGE_SECRET);

        initPush(context);
    }

    private static void initPush(final Application context) {
        PushAgent pushAgent = PushAgent.getInstance(context);

        /**
         * 自定义行为的回调处理,参考文档:高级功能-通知的展示及提醒-自定义通知打开动作
         * UmengNotificationClickHandler是在BroadcastReceiver中被调用,故
         * 如果需启动Activity,需添加Intent.FLAG_ACTIVITY_NEW_TASK
         * */
        UmengMessageHandler messageHandler = new UmengMessageHandler() {

            /**
             * 通知的回调方法(通知送达时会回调)
             */
            @Override
            public void dealWithNotificationMessage(Context context, UMessage msg) {
                //调用super,会展示通知,不调用super,则不展示通知。
                super.dealWithNotificationMessage(context, msg);
                LogUtil.e("UmPushHelper---dealWithNotificationMessage");

                handlerUmessage(msg);
            }

            /**
             * 自定义消息的回调方法
             */
            @Override
            public void dealWithCustomMessage(final Context context, final UMessage msg) {
                LogUtil.e("UmPushHelper---dealWithCustomMessage");
                handlerUmessage(msg);
            }

            /**
             * 自定义通知栏样式的回调方法
             */
            @Override
            public Notification getNotification(Context context, UMessage msg) {
                LogUtil.e("UmPushHelper---getNotification");
                /*switch (msg.builder_id) {
                    case 1:
                        Notification.Builder builder = new Notification.Builder(context);
                        RemoteViews myNotificationView = new RemoteViews(context.getPackageName(),
                                R.layout.notification_view);
                        myNotificationView.setTextViewText(R.id.notification_title, msg.title);
                        myNotificationView.setTextViewText(R.id.notification_text, msg.text);
                        myNotificationView.setImageViewBitmap(R.id.notification_large_icon, getLargeIcon(context, msg));
                        myNotificationView.setImageViewResource(R.id.notification_small_icon,
                                getSmallIconId(context, msg));
                        builder.setContent(myNotificationView)
                                .setSmallIcon(getSmallIconId(context, msg))
                                .setTicker(msg.ticker)
                                .setAutoCancel(true);

                        return builder.getNotification();
                    default:
                        //默认为0,若填写的builder_id并不存在,也使用默认。
                        return super.getNotification(context, msg);
                }*/
                return super.getNotification(context, msg);
            }
        };
        pushAgent.setMessageHandler(messageHandler);

        /**
         * 自定义行为的回调处理,参考文档:高级功能-通知的展示及提醒-自定义通知打开动作
         * UmengNotificationClickHandler是在BroadcastReceiver中被调用,故
         * 如果需启动Activity,需添加Intent.FLAG_ACTIVITY_NEW_TASK
         * */
        UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {

            @Override
            public void launchApp(Context context, UMessage msg) {
                super.launchApp(context, msg);
                LogUtil.e("UmPushHelper---launchApp");

                hanlderEventUI(context);
            }

            @Override
            public void openUrl(Context context, UMessage msg) {
                super.openUrl(context, msg);
                LogUtil.e("UmPushHelper---openUrl");

                hanlderEventUI(context);
            }

            @Override
            public void openActivity(Context context, UMessage msg) {
                super.openActivity(context, msg);
                LogUtil.e("UmPushHelper---openActivity");

                hanlderEventUI(context);
            }

            @Override
            public void dealWithCustomAction(Context context, UMessage msg) {
                LogUtil.e("UmPushHelper---dealWithCustomAction");

                hanlderEventUI(context);
            }
        };
        //使用自定义的NotificationHandler
        pushAgent.setNotificationClickHandler(notificationClickHandler);
        // //使用完全自定义处理
        //pushAgent.setPushIntentServiceClass(UmengNotificationService.class);


        //注册推送服务 每次调用register都会回调该接口
        pushAgent.register(new IUmengRegisterCallback() {

            @Override
            public void onSuccess(String deviceToken) {
                LogUtil.e("initUmengSDK", "--->>> onSuccess, deviceToken is " + deviceToken);
                SPUtils.put(context, CacheKey.SP_DEVICE_TOKEN, deviceToken);

            }

            @Override
            public void onFailure(String s, String s1) {
                LogUtil.e("initUmengSDK", "--->>> onFailure, s is " + s + ", s1 is " + s1);
            }
        });

        //https://developer.umeng.com/docs/66632/detail/98589
        // 小米平台注册
        MiPushRegistar.register(context, UmConfig.XIAOMI_APP_ID, UmConfig.XIAOMI_KEY);
        // 华为Push初始化
        HuaWeiRegister.register(context); // 华为appid 需要去另外配置 TODO
        // 魅族Push通道
        MeizuRegister.register(context, UmConfig.MZ_APP_ID, UmConfig.MZ_APP_KEY);
        // oppo
        OppoRegister.register(context, UmConfig.OPPO_APP_KEY, UmConfig.OPPO_APP_SECRET);
        //vivo 通道  // vivo appid 需要去另外配置 TODO
        VivoRegister.register(context);
        // 如果还有其它平台…… TODO
    }


    /**
     * 处理和后台交接的数据
     * @param uMessage
     */
    public static void handlerUmessage(UMessage uMessage) {
        try {
            String custom = uMessage.custom;
            if (StringUtils.isEmpty(custom)) {
                CustomBean customBean = GsonUtil.createGson().fromJson(custom, CustomBean.class);
                if (customBean == null) {
                    return;
                }

                uMessage.title = customBean.getTitle();
                uMessage.text = customBean.getText();


                String msgType = customBean.getMsgType();
                String bodyType = customBean.getBodyType();
                String msg = customBean.getMsg();
                String msgId = customBean.getMsgId();

                Packet packet = new Packet();
                Header header = new Header();
                Body body = new Body();


                if (!StringUtils.isEmpty(msgType)) {
                    header.setMsgType(Short.valueOf(msgType));
                }
                if (!StringUtils.isEmpty(bodyType)) {
                    body.setType(Short.valueOf(bodyType));
                }
                if (!StringUtils.isEmpty(msg)) {
                    byte[] secretContent = ApiUtil.getSecretContent(AppConfig.PUSH_KEY, msg);
                    body.setMsg(secretContent);
                }

                if (!StringUtils.isEmpty(msgId)) {

                }

                packet.setHeader(header);
                packet.setBody(body);

                PushMsgHelper.handler(packet);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 跳转UI处理
     * @param context
     */
    public static void hanlderEventUI(Context context) {
        boolean isLogin = (boolean) SPUtils.get(context, CacheKey.KEY_IS_LOGIN, false);
        if (isLogin) {
            //打开主页
            Intent i = new Intent(context, MainActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
            EventBus.getDefault().post(new MainUIEvent());
        } else {
            Intent i = new Intent(context, AppStarActvitiy.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }


}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(系统的推送)友盟推送 的相关文章

随机推荐

  • 颜色空间YCrCb

    YCrCb即YUV 主要用于优化彩色视频信号的传输 使其向后相容老式黑白电视 与RGB视频信号传输相比 它最大的优点在于只需占用极少的频宽 RGB要求三个独立的视频信号同时传输 其中 Y 表示明亮度 Luminance或Luma 也就是灰阶
  • 深度学习网络__tensorflow__第四讲__神经网络优化

    本文为转载北京大学 人工智能实践 Tensorflow笔记 课程 链接 https www icourse163 org course PKU 1002536002 Tensorflow 笔记 第四讲 神经网络优化 4 1 神经元模型 用数
  • VirtualBox的下载与安装

    文章来源 http sh qihoo com pc 91c30d12ff6bd60e9 cota 4 tj url xz sign 360 e39369d1 refer scene so 1 1 下载VirtualBox VirtualBo
  • 2.4.10 Profile HEA参数

    最后更新2021 07 23 HEA有两种使用方式 第一种是独立作为虚拟以太网支持卡使用 第二种是作为普通网卡 性能更高 无论哪一种方式都需要对HEA做一些特殊的初始化设置 并且是互斥的 我们先来看看系统中HEA的状态 操作如 lt 图 2
  • vulhub安装时的问题

    在安装vulhub时 出现cannot import transport或者是无法导入其他的模块 从网上找到的方法都尝试之后均不行 这个文件夹明明存在 但是他就是说找不到 解决方法 在使用pip进行安装的时候 网上找的他们都是直接默认安装的
  • python __doc__方法

    doc 方法是python的内置方法之一 该方法通常会输出指定对象中的注释部分 NB 注意 后面的部分表示输出结果 代码如下 class Debug This is a class for debugging def init self T
  • ESP32-C3入门教程 基础篇(一、ADC采样)

    经过前面的折腾 设计好了自己的测试开发板 搭建好了开发环境 然后正式开始进行功能测试了 测试顺序先从简单的开始吧 一步一步来 目录 前言 1 ADC采样示例测试 1 1 DMA连续采样 1 2 单次采样 1 3 测试源码 2 ESP32 C
  • linux之perf(2)list事件

    Linux之perf 2 list事件 Author Onceday Date 2023年9月3日 漫漫长路 才刚刚开始 参考文档 Tutorial Perf Wiki kernel org perf list 1 Linux manual
  • DevOps理念:开发与运维的融合

    在现代软件开发领域 DevOps 不仅仅是一个流行的词汇 更是一种文化 一种哲学和一种方法论 DevOps 的核心理念是通过开发和运维之间的紧密合作 实现快速交付 高质量和持续创新 本文将深入探讨 DevOps 文化的重要性 原则以及如何在
  • C语言 - 整形在内存中的存储方式

    一 以补码的形式存储在内存当中 1 有符号型的整数二进制首位0表示正 1表示负数 2 正数的原码 反码 补码都相同 如 3 负数的反码为原码的首位数不变 其他位按位取反所得 补码为反码 1 如 当然 要得到负数的原码 可以反过来 即补码 1
  • 基于SpringCloud的Microservices架构实战案例-在线API管理

    simplemall项目前几篇回顾 1基于SpringCloud的Microservices架构实战案例 序篇 2基于SpringCloud的Microservices架构实战案例 架构拆解 3基于SpringCloud的Microserv
  • C语言读取load格式文件,求指导,如何用c语言实现读取*.raw格式图像

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这个程序是读取jpg图像的 后续加上jpg图像打开和存放 include include include include include define SOI 0xD8 文件头 define E
  • 【Redis篇】Redis缓存之双写一致性

    1 引言 redis做为缓存 mysql的数据如何与redis进行同步呢 本质上问的就是双写一致性 注意 回答这个问题前一定要结合自己的业务背景 分两种情况 一个是你的业务一致性要求高 另一个是你的业务允许延迟一致 2 双写一致性 2 1
  • 大数据技术之数据质量管理

    一 数据质量概述 1 数据质量简介 数据质量的高低代表了该数据满足数据消费者期望的程度 这种程度基于他们对数据的使用预期 只有达到数据的使用预期才能给予管理层正确的决策参考 数据质量管理作为数据仓库的一个重要模块 主要可以分为数据的健康标准
  • 前端实现导出excel表格(单行表头)

    需求 实现勾选行导出为表格 一 安装插件 npm install save file saver xlsx 运行项目报如下警告的话 运行npm install xlsx 0 16 0 save 来降低版本号 最初我安装的版本号是0 18 1
  • android天气预报开题报告,开题报告-基于Android手机移动天气预报系统.doc

    毕业设计 论文 开题报告 题目 基于Android手机移动天气预报系统 一 选题依据 目的和意义 天气预报就是对未来时期内天气变化的预先估计和报告 它是根据大气科学的基本理论和技术对每一地区的未来天气做出分析和预测 这是大气科学为国民经济建
  • 比尔盖茨现身西雅图SAS 2007“治疗失眠”

    结束了4月18 21号的访华活动 比尔盖茨又现身在了西雅图5月8号开始的为时两天的第八届微软战略合作伙伴高峰会议上 Strategic Account Summit Conference 这次会议请来了众多重量级的大腕嘉宾 包括负责微软网络
  • Springboot 接口方式硬通知实现ConfigurationProperties 、@Value 动态刷新

    前言 看到这个文章标题 也许有的看官就觉得很多余 因为Nacos 可以设置 NacosValue value XXX autoRefreshed true 实现动态刷新 又因为cloud config的 RefreshScope 实现动态刷
  • 基于Warshall算法的连通图及欧拉图判定方法

    1736年欧拉解决了哥尼斯堡七桥问题 他在这一具体问题的基础上进一步研究 最终找到了一个简便的原则可以鉴别一个图 多重图 能否一笔画成 本文中 笔者使用布尔矩阵来存储一个无向图 并结合集合论中 传递闭包 的概念给出了一种欧拉图的判定方法 本
  • (系统的推送)友盟推送

    今年再次负责这个模块 最大亮点就是支持了系统的推送 也就是说你设备退出后台应用了 发推送还可以收到推送 https info umeng com detail id 169 cateId 1 测试方案 选择测试模式 可以无限制的发送数量 公