维持长连接方案

长连接断开原因

1.所在进程被杀
内存回收机制,客户端进程优先级:foreground process,visible process,service proces,cached process

2.NAT超时
运营商分配给手机的 IP是内网 IP,手机内网 IP 转换、映射到外网的过程,运营商维护一张网关映射表,随着用户增多,网关链路负荷增加。运营商设置 NAT 超时规则,在一段时间内无发生通信(移动/联通5分钟,电信及其它大于28分钟),则会中断网络连接。

3.网络切换
移动网络状态发生变化时如(移动网络 & Wifi切换、断开、重连)

4.网络状态、DHCP的租期等其它因素
DHCP的租期到期:对于 Android系统, DHCP租期到了不会主动续约并且会继续使用过期IP,在超过租期的某个时间点(没有规律)会导致IP过期,老的TCP连接不能正常收发数据。并且系统没有网络变化事件,只有等应用判断主动建立新的TCP连接才引起安卓设备重新向DHCP Server申请IP租用。

解决方案

进程保活

· 进程隔离

1.单独维护长连接进程。

why?
单个进程被回收不影响其他的进程。 隔离长连接进程,保证使用少量内存,尽量的减少被杀的可能。

方案 Service

2.进程间通信
技术方案:AIDL/手搓 Binder,广播,Socket

Android 内核 IPC方案:Zygote进程的IPC采用的是Socket,Android中的Kill Process采用的signal机制。Binder更多则用在system_server进程与上层App层的IPC交互。

开放性问题:为什么Android的Zygote与SystemServer通信采用Socket,而不是Binder?

· 提高进程优先级

常规方案: setPriority();
非常规方案:
1.Notification bug,通过绑定 Notification, Service 设置为前台进程。优先级提为2
2.一个单位像素前台 activity

· 进程拉起

利用系统广播拉活 利用第三方应用广播拉活 利用系统Service机制拉活 利用Native进程拉活 利用 JobScheduler 机制拉活 利用账号同步机制拉活 AlarmReceiver
connectReceiver
BootReceiver

断线重连

1.检测网络状态
获得ConnectivityManager对象,获取ConnectivityManager对象对应的NetworkInfo对象,根据需要从NetworkInfo对象取出关于网络连接的信息

2.监听网络变化
使用BroadcastReceiver广播接收器来接收网络状态(采用系统广播)

心跳机制

张鹏宇

继续阅读此作者的更多文章