因为目前正处于实习阶段,所以公司安排了解一下华为,小米,魅族,友盟的推送,并将其集成在一个APP上。为此特地写一篇博客记录集成过程中需要注意的一些事项(如果想进行集成,建议还是先了解一下华为,小米,魅族它们自己厂商的推送服务及文档,毕竟集成还是需要使用到它们的基础知识,不然友盟集成文档你可能会有些地方看不明白)。因为安卓的开源的原因,很多厂商都自己定制了自己的系统,以至于安卓的碎片化特别严重。在开始集成前先了解一下厂商推送和第三方平台推送。
1.手机厂商推送
记住一个规则:手机操作系统是不会杀死属于自己品牌的推送服务。
1.手机厂商的推送服务在自家的手机上属于系统级别服务,这意味着系统不会杀死自己家的推送服务。
2.比如说,Android原生系统是不会杀死C2DM消息推送服务,MIUI系统是不会杀死小米的推送服务。
2.第三方平台推送
记住一个规则:推送系统会共享一条推送消息通道
1.假如你的APP接入了友盟推送,而其他APP也恰好接入了友盟推送。
2.有一天你的APP被杀死了,当这时用户启动了接入友盟的其他APP,那么推送系统也就会通过共享的推送通道顺便把你的消息送达到手机上,然后还可能把你的进程也唤醒(被“保活”了)。
3.第三方平台推送有个大的缺点就是由于Android系统的机制,后台推送 Service 会被各种主动的或是被动的行为给杀死,而服务一旦被杀死,意味着就接收不到推送消息,所以需要集成其他厂商推送,尽可能提高推送送达率。
下面就开始讲一下如何集成友盟推送。
一、准备工作:
1、友盟集成需要先实现友盟自己的推送服务,在友盟开发者平台注册一个开发者账号,然后按照友盟提供的接入文档实现友盟自己的推送服务,关于这个部分友盟的文档介绍的很清楚,按它的步骤应该不会遇到什么问题。接入后可以尝试一下是否可以实现推送效果。当然也可以继续实现文档介绍下面的高级功能集成。
二、友盟推送实现后,我们先集成小米的Push通道。官方提供的厂商通道集成文档。具体步骤和操作图片我就不发了,集成文档写的很详细,我讲一下操作时需要注意的一些东西。
1、在导入小米Push通道的时候,按照官方提供的依赖:
//小米Push通道
implementation 'com.umeng.umsdk:xiaomi-push:3.6.9'
implementation 'com.umeng.umsdk:xiaomi-umengaccs:1.0.9'
在添加的时候如果出现以下报错
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute application@allowBackup value=(true) from AndroidManifest.xml:18:9-35
is also present at [com.umeng.umsdk:xiaomi-umengaccs:1.0.9] AndroidManifest.xml:23:18-45 value=(false).
Suggestion: add 'tools:replace="android:allowBackup"' to <application> element at AndroidManifest.xml:16:5-99:19 to override.
提示你清单合并失败,你只需要在在 Manifest.xml 的 application 标签下添加 tools:replace=“android:allowBackup”,再重新Sync Now 即可。或者你也可以不使用官方的依赖,添加如下依赖也行:
implementation 'com.umeng.sdk:push-xiaomi:1.0.0'
2、然后进行小米 Push 的初始化:
在Application类的onCreate方法中添加:
MiPushRegistar.register(final Context context, final String XIAOMI_ID, final String XIAOMI_KEY); // 小米开放平台申请到的 APPID 和 APPKEY
注册成功后会在tag:MiPushBroadcastReceiver下面打印log: onCommandResult is called. regid= xxxxxxxxxxxxxxxxxxxxxxx接收到小米消息则会打印log: onReceiveMessage,msg= xxxxxxxxxxxxxxxxxxxxxxx。
注意:
1、仅在小米MIUI设备上生效,如果你使用其他设备是无法看到该log的。
2、集成小米push的版本暂不支持多包名。
3、使用小米弹窗功能:
小米对后台进程做了诸多限制。若使用一键清理,应用的channel进程被清除,将接收不到推送。通过接入小米托管弹窗功能,可有效防止以上情况,增加推送消息的送达率。通知将由小米系统托管弹出,点击通知栏将跳转到指定的Activity。该Activity需继承自UmengNotifyClickActivity,同时实现父类的onMessage方法,对该方法的intent参数进一步解析即可,该方法异步调用,不阻塞主线程。(这是官方原话,可能我的理解能力有问题,理解为假入你点击了通知栏,是要跳转到 B,那么 B 需要继承自UmengNotifyClickActivity。后面经过我实践发现并非这样,同样跳转到 B ,你需要新建一个 A(activity),让A继承自UmengNotifyClickActivity,然后在 A 的onMessage方法里面处理intent参数,通过对参数的解析然后再跳转到 B。相当于 A(上面官方的Activity)是一个中转站接收intent,解析参数,根据参数内容再执行下步。下面我通过一个简单的例子有介绍)示例如下:
新建一个 MipushTestActivity 继承自 UmengNotifyClickActivity,然后在AndroidManifest.xml中配置该Activity,并设置launchMode=”singleTask”和exported=”true”:
<activity
android:name=".MipushTestActivity"
android