推送 / 长连接 / 保活
☆ 推送、长连接和保活经常和 Android 后台限制、厂商策略、功耗合规一起考。你的风控/对抗经验可以讲“知道边界、尊重系统、用监控验证“。
一、三类实时方案
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 轮询 | 简单 | 耗电、实时性差 | 低频状态刷新 |
| 长轮询 | 兼顾兼容性 | 服务端连接占用 | 简单实时通知 |
| WebSocket/TCP 长连接 | 实时、双向 | 心跳、重连、保活复杂 | IM、协作、行情 |
二、WebSocket 心跳与重连
心跳不是越频繁越好。移动端要在实时性、功耗、网络切换、后台限制之间取舍。
sealed class SocketState {
object Disconnected : SocketState()
object Connecting : SocketState()
object Connected : SocketState()
data class Backoff(val retryAfterMs: Long) : SocketState()
}
重连策略:指数退避 + 网络恢复触发 + 前后台状态感知 + 最大重试保护。
三、系统推送:FCM 与国内厂商通道
- 海外优先 FCM。
- 国内通常接入小米/华为/OPPO/vivo/荣耀等厂商推送。
- 应用内长连接适合前台实时,系统推送适合后台触达。
四、Android 后台限制与保活边界
Android 8.0 以后后台 Service、隐式广播、后台执行都有严格限制。面试要强调合规策略:前台服务、WorkManager、厂商推送、用户可见任务,而不是无限拉活。
五、进程保活与拉活的现实策略
历史方案包括双进程守护、1 像素 Activity、JobScheduler、账号同步、厂商白名单等,很多已被系统或厂商限制。中级面试更看重你能否说明风险:耗电、合规、用户体验、应用商店审核。
六、排障与监控
关注连接成功率、平均在线时长、心跳超时、重连次数、消息到达率、厂商通道回执。
高频面试题
Q1:IM 为什么不能只靠推送? 答:推送适合后台触达,不保证强实时和完整双向通信;前台聊天通常需要长连接保证低延迟、顺序和 ACK。
Q2:心跳间隔怎么定? 答:根据 NAT 超时、服务端成本、功耗和业务实时性实验确定,并区分前后台/网络类型,不能拍脑袋固定 5 秒。
Q3:怎么回答保活问题才安全? 答:讲系统允许的前台服务、WorkManager、厂商推送和业务必要性;历史黑科技可以说明了解但不建议作为长期方案。
易错点 / 追问
- 不要承诺后台永远在线。
- 不要忽略厂商 ROM 差异。
- 不要把推送到达率问题全归因于客户端。