Android 消息推送

1.实现原理

  • 1.消息推送的实质

    实际上,是当服务器有新消息需推送给用户时,先发送给应用App,应用App再发送给用户

    推送的消息一般是用户需要的或app希望用户知道的消息

  • 2.原理

2.现今有哪些推送方式

  • Cloud to Device Messaging,云端推送,是Android系统级别的消息推送服务(Google出品)
  • 基于Pull方式,应用程序隔固定时间主动与服务器进行连接并查询是否有新的消息
  • SMS信令推送
  • XMPP协议

以上是现今的推送方式,基于以上方式国内形成了一系列的推送应用:

手机厂商类:小米推送、华为推送。
第三方平台类:友盟推送、极光推送、云巴(基于MQTT)
BAT大厂的平台推送:阿里云移动推送、腾讯信鸽推送、百度云推送

我在使用过程中发现了一个有意思的开源项目OnePush

3.OnePush

1. 添加OnePush主要依赖(必须添加)

项目project的build.gradle

allprojects {repositories {jcenter()maven { url 'https://jitpack.io' }//由于魅族个推等第三方库使用了不同的仓库,需要加上这个maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/" }maven { url 'http://developer.huawei.com/repo/' }}
}

工程module的build.gradle

dependencies {compile 'com.peng.library:one-push-core:lastVersion'
}
2. 添加第三方推送依赖(根据自己的需求进行添加,当然也可以全部添加)
dependencies {//华为推送和HMS服务只能选择其中的一个//compile 'com.peng.library:one-push-huawei:lastVersion'compile 'com.peng.library:one-push-huawei-hms:lastVersion'compile 'com.peng.library:one-push-xiaomi:lastVersion'compile 'com.peng.library:one-push-umeng:lastVersion'compile 'com.peng.library:one-push-getui:lastVersion'compile 'com.peng.library:one-push-meizu:lastVersion'compile 'com.peng.library:one-push-jpush:lastVersion'}
3. 继承BaseOnePushReceiver重写里面的方法,并在AndroidManifest.xml中注册
<receiver android:name="com.peng.openpush.TestPushReceiver"><intent-filter><action android:name="com.peng.one.push.ACTION_RECEIVE_NOTIFICATION" /><action android:name="com.peng.one.push.ACTION_RECEIVE_NOTIFICATION_CLICK" /><action android:name="com.peng.one.push.ACTION_RECEIVE_MESSAGE" /><action android:name="com.peng.one.push.ACTION_RECEIVE_COMMAND_RESULT" /><category android:name="${applicationId}" /></intent-filter>
</receiver>
4. 在AndroidManifest.xml的application标签下,添加第三方推送实现类
    <!--如果引入了one-push-xiaomi库--><meta-dataandroid:name="OnePush_XiaoMi_101"android:value="com.peng.one.push.xiaomi.XiaomiPushClient"/><!--如果引入了one-push-huawei类库-->
<!--        <meta-dataandroid:name="OnePush_HuaWei_102"android:value="com.peng.one.push.huawei.HuaweiPushClient"/>--><!--如果引入了one-push-meizu库--><meta-dataandroid:name="OnePush_MeiZu_103"android:value="com.peng.one.push.meizu.MeizuPushClient"/><!--如果引入了one-push-umeng类库--><meta-dataandroid:name="OnePush_UMENG_104"android:value="com.peng.one.push.umeng.UMengPushClient"/><!--如果引入了one-push-getui库--><meta-dataandroid:name="OnePush_GeTui_105"android:value="com.peng.one.push.getui.GeTuiPushClient"/><!--如果引入了one-push-库--><meta-dataandroid:name="OnePush_JPush_106"android:value="com.peng.one.push.jpush.JPushClient"/><!--如果引入了one-push-huawei-hms库--><meta-dataandroid:name="OnePush_HMSPush_107"android:value="com.peng.one.push.huawei.hms.HMSPushClient"/>

关于标签书写规则:

  • android:name 必须是以“ OnePush ”开头,并且以“_“进行分割(OnePush_平台名称_平台标识码),在初始化OnePush 的时候,根据标识码和当前手机系统,动态的使用不同平台消息推送。
  • android:value 这个是继承IPushClient实现类,全类名路径。
5. 添加第三方AppKey和AppSecret

如果使用了one-push-xiaomi,那么需要在AndroidManifest.xml添加小米的AppKey和AppSecret(注意下面的“\ ”必须加上,否则获取到的是float而不是String,就会导致id和key获取不到正确的数据)

    <!--友盟推送静态注册--><meta-dataandroid:name="UMENG_APPKEY"android:value="59c87440734be47b6700001b"/><meta-dataandroid:name="UMENG_MESSAGE_SECRET"android:value="b856987f2ca836a784698e150d36ff2a"/><!--小米推送静态注册--><meta-dataandroid:name="MI_PUSH_APP_ID"android:value="\ 2882303761517577233"/><meta-dataandroid:name="MI_PUSH_APP_KEY"android:value="\ 5701757717233"/><!--个推推送静态注册--><meta-dataandroid:name="PUSH_APPID"android:value="edX56uUoQ7ASr4ru4c3rVA"/><meta-dataandroid:name="PUSH_APPKEY"android:value="Crl1UEA5Fd8tooEDmS5aA3"/><meta-dataandroid:name="PUSH_APPSECRET"android:value="D9hcD0r6Ec5ANGSLY92XP3"/><!--魅族推送静态注册--><meta-dataandroid:name="MEIZU_PUSH_APP_ID"android:value="111338"/><meta-dataandroid:name="MEIZU_PUSH_APP_KEY"android:value="db1659369a85459abe5384814123ab5a"/><!--极光推送静态注册--><meta-dataandroid:name="JPUSH_CHANNEL"android:value="developer"/><meta-dataandroid:name="JPUSH_APPKEY"android:value="41bb9f84d2158a7be9de3b47"/><!--华为HMS推送静态注册--><meta-dataandroid:name="com.huawei.hms.client.appid"android:value="100099491"/><!--华为老版本推送不需要静态注册,在app上不需要配置appkey和secret,需要在华为开发者平台,申请华为推送,并配置包名和证书指纹-->
6. 初始化OnePush
//初始化的时候,回调该方法,可以根据platformCode和当前系统的类型,进行注册
//返回true,则使用该平台的推送,否者就不使用
//只在主进程中注册(注意:umeng推送,除了在主进程中注册,还需要在channel中注册)if (BuildConfig.APPLICATION_ID.equals(currentProcessName) || BuildConfig.APPLICATION_ID.concat(":channel").equals(currentProcessName)) {OnePush.init(this, ((platformCode, platformName) -> {//platformCode和platformName就是在<meta/>标签中,对应的"平台标识码"和平台名称if (RomUtils.isMiuiRom()) {return platformCode == 101;} else if (RomUtils.isHuaweiRom()) {return platformCode == 102;} else if (RomUtils.isFlymeRom()) {return platformCode == 105;}else {return platformCode == 104;}}));OnePush.register();
}

7. 后台推送动作说明:

  • 注册友盟推送除了在主进程中,还需要在channel进程中进行注册,具体操作见DEMO(UMeng官方推送就是这样要求的)
  • 友盟推送:后台配置后续动作,为“自定义行为”。
  • 小米推送:后台配置点击后续动作,为“由应用客户端自定义”。
  • 魅族推送:后台配置点击动作,为“应用客户端自定义”
  • 个推推送:后台配置后续动作为打开应用,如果你发送的通知,为了保证你点击通知栏能收到在NotificationClick的回调,每一个通知必须都带有one-push规定格式的透传消息,如果你只发送透传,那就不必按照下面的格式。
个推通知中透传消息json:{"onePush":true,"title":"通知标题","content":"通知内容","extraMsg":"额外信息","keyValue":{"key1":"value1","key2":"value2","key3":"value3"}}
  • 华为推送和华为HMS服务:后台配置后续行为,为“自定义动作”,具体内容,可由OnePushService包:com.peng.one.push.service.huawei.intent.HWPushIntent生成,如果后台不是java开发的,参照HWPushIntent重新写。
8. 集成 友盟推送 的童鞋注意啦
  • OnePush拓展的友盟推送是[版本v3.1.1a]。
  • 关于utdid重复引入的问题,可以通过下面的方案解决
//如果utdid和你工程项目里面发生冲突了,请修改成这个依赖compile ('com.peng.library:one-push-umeng:lastVersion' ){exclude group: 'com.peng.library',module:'one-push-umeng-utdid4all'}
  • 关于友盟推送so文件处理,OnePush拓展的友盟推送,默认将所有的so文件引入了,这样就导致友盟推送aar文件大小达到2.25M左右,所以下面提供一个裁剪so文件的方法 第一步:在工程根目录的gradle.properties文件中,添加 android.useDeprecatedNdk=true 第二步:在项目(app)的build.gradle节点defaultConfig下添加
 ndk {// 设置支持的SO库abiFilters 'armeabi'//,'armeabi-v7a', 'x86', 'x86_64', 'arm64-v8a','mips','mips64'}

根据自己工程的需要,配置不同的so编译,然后Rebuild Project。

  • 最后啰嗦几句,其实只要添加armeabi,就可以了,armeabi在每个平台都是可以用的,俗称万能油。只是在其他CPU平台上,使用armeabi,效率不是很高而已,其实微信也是只使用了armeabi,只不过它为了提高效率,他将v7a也放在了armeabi里面,最后根据具体安装的手机CPU,动态加载而已。
9. 集成 华为推送 的童鞋注意啦
  • BaseOnePushReceiver中的onReceiveNotification()方法,在使用的华为推送的时候,该方法不会被调用,因为华为推送没有提供这样的支持。
  • BaseOnePushReceiver中的onReceiveNotificationClick()方法,在使用华为推送的时候,虽然华为支持,但是如果app被华为一键清理掉后,收到通知,那么点击通知是不会调用华为推送的onEvent()方法,那么如果我们这里转发,onReceiveNotificationClick()是不会收到的。
  • 为了解决华为推送,在手机上被清理掉后,onReceiveNotificationClick()不被调用的情况,OnePush在华为推送上,使用跳转到指定Activity的推送通知,那么服务端必须提供一个Intent序列化的uri,OnePush提供的Java服务端消息推送示例中,已经提供了服务端序列化Intent的uri的实现(详见:com.peng.one.push.service.huawei.intent.HWPushIntent)。
10. 关于将来拓展其他平台消息推送说明
  • 个人感觉,除了厂商的推送,其他的第三方推送只需要集成一个就可以了,假如你想使用OnePush,但是目前OnePush拓展的消息推送平台,没有你目前使用的怎么办呢,可以参照OnePush拓展详细说明,进行集成。
  • 如果你已经拓展其他平台的消息推送,并且测试通过,可以将代码Push过来,我检查过后,合并进来,这样可以方便大家。
11. 拓展其他平台说明

关于添加其他消息推送SDK具体操作(如果你不满足OnePush提供的小米、华为推送,可根据下面步骤,将其他厂商提供的推送,添加到OnePush里面)

  • 创建XXXClient 实现IPushClient接口,并且重写对应的方法,initContext(Context),会在初始化的使用进行调用,可以在这里进行获取第三方推送注册需要的ID,KEY或者其他操作,第三方推送ID、KEY,建议在AndroidManifest.xml中的Application标签下添加,然后在initContext(Context)中进行获取。
  • 创建和重写三方消息推送的Receiver或者IntentService(一般第三方会让你继承他的receiver,这里指的就是他),重写三方推送的的接收透传消息和通知的方法,调用OneRepeater的transmitXXX方法,将通知、透传消息、通知点击事件、以及其他事件,转发到OnePush。
  • 记得在OnePush注册的时候,进行消息推送平台的选择。
  • 具体操作方法:详见one-push-xiaomi
12. 代码混淆
-dontoptimize
-dontpreverify
-dontwarn com.taobao.**
-dontwarn anet.channel.**
-dontwarn anetwork.channel.**
-dontwarn org.android.**
-dontwarn org.apache.thrift.**
-dontwarn com.xiaomi.**
-dontwarn com.huawei.**
-dontwarn com.peng.one.push.**
-dontwarn com.igexin.**
-dontwarn cn.jpush.**
-dontwarn cn.jiguang.**
-keepattributes *Annotation*-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }
-keep class cn.jiguang.** { *; }
-keep class com.taobao.** {*;}
-keep class org.android.** {*;}
-keep class anet.channel.** {*;}
-keep class com.umeng.** {*;}
-keep class com.xiaomi.** {*;}
-keep class com.huawei.** {*;}
-keep class com.hianalytics.android.** {*;}
-keep class com.meizu.cloud.**{*;}
-keep class org.apache.thrift.** {*;}
-keep class com.igexin.** { *; }
-keep class org.json.** { *; }
-keep class com.alibaba.sdk.android.**{*;}
-keep class com.ut.**{*;}
-keep class com.ta.**{*;}-keep public class **.R$*{public static final int *;
}#(可选)避免Log打印输出
-assumenosideeffects class android.util.Log {public static *** v(...);public static *** d(...);public static *** i(...);public static *** w(...);}# OnePush的混淆
-keep class * extends com.peng.one.push.core.IPushClient{*

三、相关api介绍

OnePush详细api
方法名称 描述及解释
init(Context , OnOnePushRegisterListener) 初始化OnePush,建议在Application中onCreate()方法
register() 注册消息推送
unregister() 取消注册消息推送
bindAlias(String) 绑定别名
unBindAlias(String) 取消绑定别名
addTag(String) 添加标签
deleteTag(String) 删除标签
getPushPlatFormCode() 获取推送平台code(AndroidManifest.xml中注册)
getPushPlatFormName() 获取推送平台name(AndroidManifest.xml中注册)
setDebug(boolean) 设置是否为debug模式
OneRepeater详细api
方法名称 描述及解释
transmitCommandResult(Context,int,int,String,String,String) 转发操作反馈(具体type在OnePush.TYPE_XXX)
transmitMessage(Context,String,String,Map<String,String>) 转发透传消息
transmitNotification(Context,int,String,String,Sting,Map<String,String>) 转发通知
transmitNotificationClick(Context,int,String,String,Sting,Map<String,String>) 转发通知点击事件

作者:陈春 原文地址

Android 消息推送OnePush相关推荐

  1. 友盟小米收不到推送消息_一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、华为、小米推送等)...

    XPush 一个轻量级.可插拔的Android消息推送框架.一键集成推送(极光推送.友盟推送.华为.小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手! 在提iss ...

  2. Android消息推送完美解决方案全析

    Android消息推送完美解决方案全析 参考文章: (1)Android消息推送完美解决方案全析 (2)https://www.cnblogs.com/xueshui20/p/4151405.html ...

  3. Android 消息推送

    Android 消息推送 那位大哥做过啊 android是用服务做吧? pushsharp 雲推送 你要有服務器來服務 不是云推送吧 去搜這個,有server,有client,有demo 自己做的话, ...

  4. android 消息推送方法,一种基于Android系统的消息推送方法技术方案

    [技术实现步骤摘要] 本专利技术涉及一种基于Android系统的消息推送方法,属于计算机 技术介绍 推送功能在手机应用开发中越来越重要,已经成为手机开发的必选项.消息推送,就是在互联网上通过定期传送用 ...

  5. Android—消息推送机制

    知识点: 长连接与短连接 端内与端外推送 通知与透传消息 服务保活(心跳机制) 长连接和短连接 消息推送需要客户端与服务端进行连接,因此分为两种方式 长连接,在TCP层握手成功后,不立即断开连接,并在 ...

  6. Android消息推送 解决方案

    前言 鉴于现在运营需求的增强,消息推送在Android开发中应用的场景是十分常见 如电商的活动宣传.资讯类产品进行新闻推送等等 推送消息截图 今天,我将全面介绍Android中实现消息推送的7种主流解 ...

  7. WebSocket实现android消息推送

    WebSocket实现android消息推送 WebSocket是HTML5出的协议,基于TCP.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. Web ...

  8. android消息推送demo

    android消息推送demo 1.消息推送机制  服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭.  我想到了一句话:don't call me,i ...

  9. android消息推送标准,如何提升Android消息推送的到达率?

    消息推送时下已经是app日常运营的重要工具,app的消息推送与一个app的日活息息相关,好的消息推送能够有效地增强用户黏性,然而一切好的消息推送都是建立在能够到达用户终端为前提的,所以消息推送的到达率 ...

最新文章

  1. session文件无法并发操作
  2. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值
  3. python棋盘格_干货必看 | Python的turtle库之经典棋盘格
  4. 训练机器人看脸读“心”,真的靠谱吗?
  5. 图论 —— 网络流 —— 费用流 —— 基于 Dijkstra 的费用流
  6. Jumpline提供的免费3月的VDS空间,空间容量为20GB, 图文介绍
  7. 包装类 java 1615210339
  8. pyhton 从web获取json数据 保存到本地然后再读取
  9. mybatis逆向工程生成java代码和xml配置
  10. 图片垂直居中 和 float
  11. 华为端口聚合命令_华为交换机链路聚合命令
  12. DBC文件格式文档【翻译】
  13. securable的LOCKED ON,LOCKED OFF,YES,NO四个的区别
  14. 算法效率的度量--时间复杂度与空间复杂度
  15. 【数据结构与算法】试卷 1(含答案)
  16. 设计师经常面对的11种职场问题
  17. Gitee码云 操作
  18. Eclipse 新建WEB工程的WebContent目录设置默认WebRoot,和设置编译class默认输出WebRoot\WEB-INF\classes
  19. 服务器系统漏洞与补丁程序,巧打补丁保护服务器安全
  20. No.050<软考>《(高项)备考大全》【冲刺4】《软考之 119个工具 (2)》

热门文章

  1. 惠普战99 u盘启动BIOS设置教程
  2. [CF1290F] Making Shapes
  3. QCC5124与QCC5125主要功能对比
  4. 亚马逊、微软云和二度云 国外三大云服务商优劣的那些事!
  5. java多媒体播放器_Java多媒体播放器(四)
  6. 全阶滑模观测器程序_滑模观测器的构建方法与流程
  7. crc32校验的c语言实现
  8. 干涉法测微小量实验_干涉法测微小量实验教案
  9. 人民银行备案企业AAA信用评级7证包含哪些?
  10. VS2010安装本地HelpViewer