移动端sse连接切后台时大概率被系统挂起或强制中断,需主动管理生命周期:后台时冻结ui但保持eventsource实例存活,前台时验证连接并探测健康状态,服务端配合心跳与断点续传,客户端通过本地缓存+快照比对兜底。

移动端切到后台时,SSE 连接大概率被系统挂起或强制中断,并非“暂停”,而是不可靠断连。浏览器(尤其是 iOS Safari 和 Android Chrome)会限制后台标签页的 JS 执行、降低心跳频率,甚至回收内存导致 EventSource 实例彻底丢失。不能依赖自动恢复,需主动管理连接生命周期。
切后台时保留实例但暂停 UI 更新
不同于桌面端建议主动 close,移动端更推荐在 visibilitychange 监听中暂不关闭连接,而是冻结 UI 响应:
- 当
document.hidden === true时,停止更新 DOM、暂停通知弹窗、冻结计时器等副作用 - 保持 EventSource 实例存活(不调用
.close()),给浏览器留出“可能恢复”的机会 - 避免频繁重建连接带来的重连风暴和资源开销
切回前台后立即验证连接状态
用户切回前台时,不能假设连接仍有效,需快速判断并干预:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 检查
eventSource.readyState:若为0(CLOSED)或0且长时间未变,说明已断开 - 触发一次轻量 HTTP 探测(如
/health?ts=xxx),3–5 秒内失败则暂缓重建 - 若探测成功但
readyState未在 8 秒内变为1(OPEN),降级为低频轮询(如每 30 秒查一次状态)
服务端配合心跳 + Last-Event-ID 断点续传
仅靠前端无法解决后台断连问题,必须和服务端协同:
- 服务端每 20–25 秒发送一次
event: heartbeat\ndata: {}\n\n,防止连接因超时被中间代理断开 - 所有真实消息必须带严格单调递增的
id:字段(如毫秒时间戳或数据库自增 ID) - 断线重连时,浏览器自动携带
Last-Event-ID请求头,服务端据此只推送 ID 之后的消息
兜底策略:本地缓存 + 快照比对
后台期间可能丢失若干事件,业务层必须做状态兜底:
- 每次收到 SSE 消息,将关键字段(如
unreadCount、orderStatus)存入localStorage - 切回前台后,立刻发起一次
GET /api/snapshot拉取最新服务端快照 - 对比本地缓存与快照,对不一致项做覆盖或合并,确保 UI 显示最终一致结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










