测试发现黑屏后, 创建的后台服务通信线程基本上被冻结了, 直接不执行了!!! 很好奇微信和 QQ 是怎么做到黑屏后正常通信的? [华为荣耀 9 Android7 WIFI 环境下测试的]
我的程序使用了一个主通信循环, 自定义心跳机制(30s 无心跳服务端认为断线), 黑屏后直接没法用了, 网上找了一些资料:
Android 新手, 求大虾指点
1
yexm0 2018-02-18 20:09:34 +08:00 via iPhone
因为有白名单嘛,你的程序要保留后台得进相关设置里加
|
2
YaTTL 2018-02-18 20:22:16 +08:00 via Android
微信是靠的随机唤醒锁。
现在主要是靠第三方 Push 方案,各大定制系统后台管理都很严格的。 |
3
fangchang 2018-02-18 20:24:14 +08:00
首先当系统进入休息状态是时,你需要唤醒系统。
其次,如果你是 30s 一次的话,你可以用一个 alarm manager 做一个 30s 循环的 alarm,在 receiver 里创建一个 service, 接着由 service 唤醒系统。 当你数据通讯完后,关闭 service。 就是这样一个 30 秒循环。 |
4
Cavolo 2018-02-18 20:51:49 +08:00 via iPhone 1
看到后台权限这么紧就放心了
|
6
winterbells 2018-02-18 21:22:20 +08:00
国产系统都是默认把部分应用加白名单的
sysdump deviceidle whitelist |
7
18583826786 2018-02-18 21:22:23 +08:00 via Android
后台锁住
|
8
jinyang656 2018-02-18 21:35:08 +08:00 via Android
楼主,Doze 模式和 App Standby 了解一下
|
9
lfzyx 2018-02-18 21:39:53 +08:00
|
10
evagreenworking 2018-02-18 22:51:21 +08:00
JobScheduler/Firebase JobDispatcher 但这不是设计用来实时通信的 原生 8.0 以后用户不给你后台权限要后台即时通信只有走 FCM 或者你作为前台服务一直趴在用户通知栏上
|
11
nekoyaki 2018-02-19 08:09:41 +08:00
楼主都说了华为,你们都答的什么啊。
华为就这样,华而不实为所欲为。即使你在原生安卓能做到的,在华为上也高概率不行。 新手建议换个手机先把程序跑通,再上华为调,这样你才能知道哪些代码是需要专门针对华为做的。 |
12
gamexg 2018-02-19 10:05:48 +08:00 via Android
原来可行的方案,现在不知道是否可行:
长连接由客户端建立,但是心跳包由服务器定时主动发出,一般手机收到数据后会唤醒对应的程序,这样就避开了 AlarmManager 频率问题,AlarmManager 只做低频率检查长连接是否正常。 |
14
zj299792458 2018-02-19 10:28:45 +08:00 via iPhone
@gamexg 只再 iOS 上听过长链接能唤醒应用的说法,而且需要在应用退出的时候把 tcp socket 交给系统托管,iOS 10 就用不了了,安卓更是不存在的
|
15
boywhp OP @gamexg @zj299792458 我昨天测试也发现了这个现象, TCP 服务端 KEEPALIVE 报文可以立即唤醒 Android 黑屏下的客户端!!! 不过我没进一步测试能持续多长时间.
|
16
gamexg 2018-02-19 12:21:28 +08:00 1
@boywhp #15
@zj299792458 #14 3、4 年前做长连接推送时是可行的,不过当时是做的行业软件,特定型号手机,没广泛测试各个手机型号。 基本是 1 秒推送到位,长连接可以维持全天。 |
18
realpg 2018-02-20 08:43:27 +08:00
杀进程系省电 ROM 华为就是代表 一定要加不杀白名单
|
20
why1 2018-02-20 12:18:49 +08:00 via Android
@boywhp 我这机子要插充电器或是一直亮屏应用才不会被冻结 emui 5.0.1 Android 7.0,原来 emui 4,Android6 只要放着音乐就没事
|
22
fengleidongxi 2018-02-21 10:13:59 +08:00
@boywhp 楼主通信的传输的是什么?
|
23
boywhp OP @fengleidongxi 加密二进制数据报文, 不是 HTTP 哈
|