需求:需要开发一个 android app, 长时间保持后台,并建立 /保持 websocket 连接,服务端不定时从 ws 向客户端推送消息,客户端收到消息后进行语音播报(soundpool)。
目前实现:
- 开启一个进程整一个 service 并保持 foreground notification(通知栏可以持续看到)。
- 让用户设置省电优化白名单
- 让用户将进程锁定防止被清理(任务切换界面加小锁)
然而存在的问题:
- 部分手机如此设置后等一段时间就被 kill
- 部分手机锁屏后没有网络,ws 不通,断线或者延迟播报(十几秒,一分钟)。
- 部分手机锁屏后代码执行速度会下降,表现为定时 sleep1 分钟后打 log 到后面就变成几分钟打一次了(貌似是 doze 模式), 甚至到最后一条语音播报都会断断续续。
已知的一些应用的解决方案及优化点:
- 各大主流国产 OS 内置对一些应用增加白名单如微信等,无需手动设置
- 多进程保活后相互拉起(5.0 后失效,系统直接杀死进程组)
- 原生进程实现,降低内存占用,可以有效防止被杀
- 目前新开的进程没有 UI,后台内存占用大概在 30-50M 左右
- 原生进程能在 20M 以内。
- 由于 soodpool 预先加载资源到内存,这部分看是否可以优化
- 设置 alarm/注册广播
另外还需要实现开机自启动,自动连接,无需每次开机都要打开 app 这样的功能。
如上所述,考虑 3,4 优化点,每个点的收益如何?或者诸位大佬有无更好的解决方案?
PS: 不要说应用流氓,用户的需求就是要常驻进程,但是应用总是被系统各种限制导致播报不及时,国产 OS 和应用的相爱相杀-。-,没有 GMS 或者类似统一推送平台的东西,最后就是是双输的局面。