怎么保证能实时收到推送消息?
- 应用需要有一个常驻的后台进程,能够实时处理服务器发过来的推送消息。
- 通过系统级推送服务来推送消息,这种做法应用不需要实现一个常驻的后台进程
现状
按理说如果有一个统一的系统级推送,大家都接入该服务那么就能解决推送问题了。其实google也提供了这样的服务GCM,但是因为国内无法使用google的原因GCM在国内是行不通的,所以外国人在使用android手机时正常不会有推送问题,而且手机运行也会比较流畅,主要原因就是国内软件开发商为了保证自己的推送消息能够即时收到都会实现一个常驻后台进程,过多的后台进程自然会占用系统资源拖慢手机速度。 不过,工信部已经联合了国内多家厂商要做统一推送服务,如果那一天真的到来那么对于广大国内开发者将会受益巨大。解决方案
目前解决推送问题通用的解决办法是采用混合推送机制,对于有提供系统推送的厂商走厂商推送,其余的走三方推送。
提供系统级推送的厂商有小米,华为,魅族,不过厂商的推送正常只有在各自厂商的手机有效,所以sdk需要同时接入多个厂商的推送,然后根据机型去判断要走哪个厂商的推送。
对于没有提供系统级推送的厂商那么只能自己通过保活机制维持一个常驻后台进程来实现。不过厂商为了系统纯净对后台进程做了严格限制,导致目前的进程保活机制面临几乎无解的问题。
问题所在
进程保活受到厂商或者系统限制。
进程保活实现原理
进程保活原理基本可以概括为两点:
- 尽量让进程不被杀掉
- 进程杀掉后能够重启
如何进行进程保活我就不细说了,大家可以自己去了解,我这里只说实现进程保活面临的问题。
进程保活机制的问题
进程被杀后被唤醒有几种实现机制:
-
设置自启动的Service。当Service被杀后会立马重启。
-
通过应用进程间互相唤醒。接入同一个推送sdk的所有应用只要有一个应用启动就会唤起其他应用。
在实际开发中会发现进程唤醒机制在大部分情况下都不起作用了。主要有几个原因:
-
即使设置了自启动Service,目前在大部分手机上应用被杀后是没办法重启的,原因是自启动权限被禁。所以解决办法就是引导用户对本应用开启自启动权限,不过大部分用户估计不会这样做。可能大家会纳闷为什么手动杀掉微信后还可以收到推送消息,那是因为微信与各个厂商合作,会给微信默认开启自启动权限,微信被杀后它的后台Service会立马重启,如果你把微信的自启动权限关了,那么微信也同样收不到推送消息的。
-
应用程序是通过广播的形式互相唤醒的,目前有个问题就是你的进程被杀了怎么接收广播?
首先,动态注册的广播在应用被杀后是收不到消息的,所以广播需要静态注册。
其次,即使静态注册广播在大部分情况下也收不到消息,这是为什么呢?
因为在在android3.1以后系统给Intent定义了两个新的Flag,分别为FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES,用来控制Intent是否对处于停止状态的App起作用。所以在android3.1之后想通过监听系统广播换起app基本是无效的。
但是可以通过其他应用发的广播来唤醒app,只不过需要在发送广播时flag设置为FLAG_INCLUDE_STOPPED_PACKAGES并且指定广播接收器的android:exported=“true”。