android 花式保活正确姿势求指教

2019-03-04 11:23:36 +08:00
 banixc

需求:需要开发一个 android app, 长时间保持后台,并建立 /保持 websocket 连接,服务端不定时从 ws 向客户端推送消息,客户端收到消息后进行语音播报(soundpool)。

目前实现:

  1. 开启一个进程整一个 service 并保持 foreground notification(通知栏可以持续看到)。
  2. 让用户设置省电优化白名单
  3. 让用户将进程锁定防止被清理(任务切换界面加小锁)

然而存在的问题:

  1. 部分手机如此设置后等一段时间就被 kill
  2. 部分手机锁屏后没有网络,ws 不通,断线或者延迟播报(十几秒,一分钟)。
  3. 部分手机锁屏后代码执行速度会下降,表现为定时 sleep1 分钟后打 log 到后面就变成几分钟打一次了(貌似是 doze 模式), 甚至到最后一条语音播报都会断断续续。

已知的一些应用的解决方案及优化点:

  1. 各大主流国产 OS 内置对一些应用增加白名单如微信等,无需手动设置
  2. 多进程保活后相互拉起(5.0 后失效,系统直接杀死进程组)
  3. 原生进程实现,降低内存占用,可以有效防止被杀
    • 目前新开的进程没有 UI,后台内存占用大概在 30-50M 左右
    • 原生进程能在 20M 以内。
    • 由于 soodpool 预先加载资源到内存,这部分看是否可以优化
  4. 设置 alarm/注册广播

另外还需要实现开机自启动,自动连接,无需每次开机都要打开 app 这样的功能。

如上所述,考虑 3,4 优化点,每个点的收益如何?或者诸位大佬有无更好的解决方案?

PS: 不要说应用流氓,用户的需求就是要常驻进程,但是应用总是被系统各种限制导致播报不及时,国产 OS 和应用的相爱相杀-。-,没有 GMS 或者类似统一推送平台的东西,最后就是是双输的局面。

10929 次点击
所在节点    Android
43 条回复
lfzyx
2019-03-04 11:30:00 +08:00
用 FCM 推送不就行了
TomVista
2019-03-04 11:38:52 +08:00
同纠结这个,我用的 ajax 轮询~,插眼看结果.
我现在就是提示用户加入白名单,但是我的用户大部分不会这个操作(年龄段),很尴尬.

平常内存占用 6m 左右,4g 运存手机,基本不杀,除非用户打游戏,手机自带游戏模式,或者用户开了大量大厂应用导致内存不足.
MetalCore
2019-03-04 11:48:24 +08:00
1.监听息屏,息屏时是尽量保持应用能置顶(不能置顶,应用很快就 gg )
2.建议用户使用爱国牌手机,使用爱国牌推送唤醒
3.有些手机未阉割小部件,能用小部件 30 分钟唤醒一次
codehz
2019-03-04 14:19:25 +08:00
可以考虑阻止屏幕关闭,显示一个全屏黑色悬浮窗代替关闭屏幕
HongJay
2019-03-04 14:29:06 +08:00
当 ws 检测到连接断开后,通过厂商通道拉起 app
torchmu
2019-03-04 15:03:49 +08:00
这个不会是支付平台的收款到账语音播报吧。
目前支付宝都没法代码层面解决,详情可以参考支付宝设置到账提醒里的引导手册 doge
yukiww233
2019-03-04 15:49:21 +08:00
基本没办法,现在还有完美保活方案的话卖给国内互联网公司都可以财富自由了
gam2046
2019-03-04 15:59:22 +08:00
把自己的应用包名改成白名单内的?(比如支付宝、微信、QQ ?)副作用就是当用户安装这些应用的时候,你的应用与被顶包的应用,后安装的将无法安装,原因是签名校验失败。
bertsir
2019-03-04 17:27:23 +08:00
考虑一下厂商通道的推送
shenhb
2019-03-04 17:32:45 +08:00
每个手机的厂商,集成一套推送
GTim
2019-03-04 18:11:40 +08:00
我也是 3 和 4,4 通过监听所有的通知 ( 爱用不用 ) 3. 开启一个单独的进程,很小很小
snowspace
2019-03-04 20:19:27 +08:00
推必达
NotificationListenerService 坚持长连接
JobService
等等
不过在高版本上基本无效
接厂商通道吧
hanbing135
2019-03-04 20:25:15 +08:00
可以短信推送吧
lerp
2019-03-04 20:26:30 +08:00
后台循环播放无声音频
sampeng
2019-03-04 22:51:59 +08:00
虽然我是研发…但真的特别反感这个需求…始终让 cpu 无法休息。。产品是爽了。
HongJay
2019-03-05 00:12:48 +08:00
@sampeng 开始考虑 cpu 的感受了?
nanaw
2019-03-05 01:49:18 +08:00
可以如楼上所说,使用“特殊手段”保持手机唤醒状态,会很大的影响待机,需要用户允许,否则算是流氓了。
别的不说,开机自启对用户来说也算很流氓的了。
被 kill 的问题,一般是内存不足,不运行其他应用保持前台应该不会出现
luckylo
2019-03-05 08:02:42 +08:00
给引导,让用户自己去添加白名单。别替用户做选择。
ksssdh123
2019-03-05 10:28:53 +08:00
最好的方式,还是引导用户,主动去开启,一般都是在电池这设置里去开启
banixc
2019-03-05 10:37:23 +08:00
@HongJay @bertsir @shenhb @snowspace
上面几位说到厂商通道可以试试,目前我们是非专业开发 android 的,手里没有那么多测试手机,因此接入估计也没办法测试。如果其他办法搞不定的话应该是最后的手段。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/540767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX