最近开发过程中有消息实时推送需求,针对这个需求进行了一些学习,此篇用于总结记录学习所得。
之前有做过消息推送,那次以轮询方式实现,使用AlarmManager的setRepleat方法实现每15分钟向服务器查询是否有新的待办事项,但是当进程被杀死的时候,与进程相关的AlarmManager也会被销毁,尝试使用了包括Service的startForeground方法创建存活优先级较高的前台服务、onStartCommand方法返回START_STICKY、注册文件中设置android:persistent="true"等多种方法尝试保活Service,然而都没什么卵用,各种被杀。
Android手机的推送关键点就在于进程保活(实际上是Service保活和拉活),由于国内屏蔽了谷歌的GCM服务,不能像IOS一样利用系统服务器进行推送,因此实现实时推送的关键就是实现手机端和服务端的长链接,进程一旦被杀,链接便会中断。
关于进程保活目前找到的靠谱点的方案是在Native层用C语言编写双进程守护,不过貌似也不能完美适配所有机型,学习链接:http://blog.csdn.net/marswin89/article/details/50917098
关于推送的实现方式,目前靠谱的方案就是接入多个第三方推送,比如小米推送号称在小米手机上能受到系统级保护,学习链接:https://juejin.im/post/57a19c012e958a0066715d0c
我个人觉得可行的方案就是接入多个第三方推送,然后找出第三方推送的核心服务,然后收听可以静态注册的系统广播,在收听到广播时对第三方推送的核心服务进行拉活,关于自己拉活这点目前还不知道靠不靠谱,因为推送时还需要一些信息,比如本机唯一标识码之类的,有待测试。