推送的目的就是将服务器的信息即时发送给手机终端,这种数据同步的服务要求有一定的时效性,一般有两种办法解决这个问题,第一种是轮询,手机每隔一段时间向服务器发送消息,服务器查询如果有新消息则将新消息同步过去,这种方法既浪费网络流量,又费电,所以不提倡。另一种方式是维持一个长连接,就像tcp协议那样建立一个稳定的手机端和服务器端的连接,这样数据就可以即时同步了。
不过有一个问题是如何维持这样一个长连接。手机网络和我们的互联网一样,每个终端都会占有一个ip,不过ipv4的地址严重不足,所以手机也用了NAT。以我的理解,NAT就是把一个ip地址再映射成多个内部ip地址,就像我要去北京天安门,先去北京,再找天安门,这样会节约很多ip资源。不过运行商的NAT表格是动态的,如果长时间不用的话,就会失效。就像如果没人去天安门,那么北京就把天安门删去了(这是不可能的)。
JPush为了维持这样一个连接就需要不断的发送心跳包,保证不会被运营商的路由器踢掉,然而我的华为手机并不吃这一套。
1.我的手机长时间不用自动断网,是手机自身断网,唤醒屏幕后重新连接,所以断网后根本无法连接。
2.在手机查看后台运行程序时杀掉后台运行程序,经测试,运行activity的各个生命周期,但没有发现运行在后台的service运行周期,我以为并没有杀掉service,但是推送失效,查看运行的service里并没有pushservice。然后我在模拟器上运行,发现kill掉activity后service是存在的,说明华为在杀掉app后,会把相关联的service都杀掉,而且是非正常杀掉,因为并没有走onDestroy的生命周期,估计就是为了防止流氓软件互相启动吧。
3.然而经测试我的微信却能在杀掉后继续接收推送,他的service也不会被杀掉,我认为华为手机把微信加入白名单了。