由于目前Android系统杀进程越来越厉害了,这对于应用在Push及时到达上有高要求的感到压力很大,所以前段时间在项目中考虑第三方Push服务时更多的想要有更强的保活功能。
—
目前我们常用的几大Push,小米Push,华为Push,JPush,友盟,个推,百度云推送在进行对比中我使用了小米Push,华为Push,和百度云Push。
市场上其他应用是怎么做的
—
如果Android系统级别推送GCM能在中国使用,那么这些也就没有必要讨论,我们也就能像IOS推送一样方便,实际上我们却用不了,那么同样大家都遇到一样的问题。其他人是怎么解决的呢?
以下几点是个人的大概的几点统计
- 微信
- 百度全家桶
- 小米Push/华为Push
这里只是简单的说下这三个很有代表意义的Push
- 微信的占有率极其高,并且用户对其粘性非常强,这让我想起我在中学时代手机营业厅里每部手机都会告诉你能登QQ,时代换汤不换药那么现在是如果一部手机居然收不到微信消息,肯定不是微信的原因一定是手机有问题,所有大家很快也就明白为什么每台手机即使有后台强杀也会自动把微信加入白名单,如果我的应用能被加入白名单那真是太幸福了。
- 说百度全家桶可不是说装了一个百度应用就装所有百度其他应用,但实际效果差不多只要你打开一个百度应用,那么基本上手机上的其他百度应用都会在后台被唤醒,Push自然而然的都能收到,这里也不止百度这么做,阿里也同样会,不过这种方式在以后中会被系统禁用。
- 小米Push是系统级别的Push,就像IOS和Android的GCM原理一样,在一个手机中的所有应用有同样一条Push服务,应用完全不用打开就能及时收到所有Push,加上小米手机的占有率这一点也是不可忽略的,同样华为Push也是一样,并且在我了解中大部分应用都集成了小米Push,华为Push,和其他。
说说第三方Push
JPush
—
JPush是我最早使用过的Push,但是由于他在进程保活上的做法不能满足我的要求所以被放弃了
JPush的保活在官方文档说明:<!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互 拉起的 功能。 -->
<!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
<service
android:name="cn.jpush.android.service.DaemonService"
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="cn.jpush.android.intent.DaemonService" />
<category android:name="您应用的包名"/>
</intent-filter>
</service>
也就是只要配置文件配置这一项那么其他同样集成JPush应用启动时就会把你唤醒,这种就是我们常用的`Intent` `setAction(X)`方式,通过`intent-filter` 搜索所有注册了对应`action`的应用信息 ####友盟推送 -- 官方原话:实现了同一设备多 APP共享一个长连接、智能心跳等优化方案。消息发送速度快,长连接稳定,设备能耗低。 测试也发现多个APP只要都是集成的友盟推送,那么在一台设备中只要有且有一个应用Push连接正常,那么其他所有的集成友盟Push的APP不用启动也能收到Push。 #### 百度云,个推推送 -- 百度云推送和个推推送在推送原理上基本和友盟类似,这种方式也是一种虚拟系统级别推送。百度云推送在启动的百度地图后你的应用可以做到不打开也能接受到Push,并且初步的测试发现百度唤醒对应的需要唤醒的包名对应文档保存在Sd卡中,同样集成的百度云推送的启动后会在SD文档中加入自己的包名,由于是加密的我也就没看得很明白,百度云推送接受到Push后会首先通过广播形式发送给目标应用,广播不行才会通过启动对应的`Service`。 个推说的新浪微博也集成了自己,反编译后倒是没发现。 #### 小米Push,华为Push -- 对于这两者来说也没有太多探讨,这是在他们自己系统上最好的实现方式,但是到其他系统就基本和别人没什么区别。 #### 总结 #### 1.JPush的 对JPush来说我也不知道他到底好坏,比较中庸,用了不能很好的提高保活,同时唤醒是相互(可以去揣摩是不是真的一定相互)的。 #### 2.友盟,个推,百度云 #### 好处 * 推送到达率和及时率提高 * 手机耗电会减少 #### 坏处 * 耗电会集中在打开率最高的应用上 #### 3. 小米,华为推送 #### 好处 * 最方便的实现,最高到达率 #### 坏处 * 基本只能在他们自己系统才能达到这种效果