Android 黑屏后怎么保持网络通信?

2018-02-18 20:02:20 +08:00
 boywhp

测试发现黑屏后, 创建的后台服务通信线程基本上被冻结了, 直接不执行了!!! 很好奇微信和 QQ 是怎么做到黑屏后正常通信的? [华为荣耀 9 Android7 WIFI 环境下测试的]

我的程序使用了一个主通信循环, 自定义心跳机制(30s 无心跳服务端认为断线), 黑屏后直接没法用了, 网上找了一些资料:

  1. AlarmManager 但是好像也是各种坑
  2. PowerManager.PARTIAL_WAKE_LOCK, 但是我看微信好像没有申请这个权限啊?

Android 新手, 求大虾指点

14493 次点击
所在节点    Android
23 条回复
yexm0
2018-02-18 20:09:34 +08:00
因为有白名单嘛,你的程序要保留后台得进相关设置里加
YaTTL
2018-02-18 20:22:16 +08:00
微信是靠的随机唤醒锁。
现在主要是靠第三方 Push 方案,各大定制系统后台管理都很严格的。
fangchang
2018-02-18 20:24:14 +08:00
首先当系统进入休息状态是时,你需要唤醒系统。
其次,如果你是 30s 一次的话,你可以用一个 alarm manager 做一个 30s 循环的 alarm,在 receiver 里创建一个 service, 接着由 service 唤醒系统。 当你数据通讯完后,关闭 service。 就是这样一个 30 秒循环。
Cavolo
2018-02-18 20:51:49 +08:00
看到后台权限这么紧就放心了
boywhp
2018-02-18 21:20:19 +08:00
@yexm0 还真是华为后台白名单导致的, 我把我的程序加到白名单里, 终于可以正常工作了
winterbells
2018-02-18 21:22:20 +08:00
国产系统都是默认把部分应用加白名单的
sysdump deviceidle whitelist
18583826786
2018-02-18 21:22:23 +08:00
后台锁住
jinyang656
2018-02-18 21:35:08 +08:00
楼主,Doze 模式和 App Standby 了解一下
lfzyx
2018-02-18 21:39:53 +08:00
evagreenworking
2018-02-18 22:51:21 +08:00
JobScheduler/Firebase JobDispatcher 但这不是设计用来实时通信的 原生 8.0 以后用户不给你后台权限要后台即时通信只有走 FCM 或者你作为前台服务一直趴在用户通知栏上
nekoyaki
2018-02-19 08:09:41 +08:00
楼主都说了华为,你们都答的什么啊。
华为就这样,华而不实为所欲为。即使你在原生安卓能做到的,在华为上也高概率不行。
新手建议换个手机先把程序跑通,再上华为调,这样你才能知道哪些代码是需要专门针对华为做的。
gamexg
2018-02-19 10:05:48 +08:00
原来可行的方案,现在不知道是否可行:
长连接由客户端建立,但是心跳包由服务器定时主动发出,一般手机收到数据后会唤醒对应的程序,这样就避开了 AlarmManager 频率问题,AlarmManager 只做低频率检查长连接是否正常。
gamexg
2018-02-19 10:06:18 +08:00
@gamexg 另外别忘了添加到白名单。
zj299792458
2018-02-19 10:28:45 +08:00
@gamexg 只再 iOS 上听过长链接能唤醒应用的说法,而且需要在应用退出的时候把 tcp socket 交给系统托管,iOS 10 就用不了了,安卓更是不存在的
boywhp
2018-02-19 11:51:55 +08:00
@gamexg @zj299792458 我昨天测试也发现了这个现象, TCP 服务端 KEEPALIVE 报文可以立即唤醒 Android 黑屏下的客户端!!! 不过我没进一步测试能持续多长时间.
gamexg
2018-02-19 12:21:28 +08:00
@boywhp #15
@zj299792458 #14

3、4 年前做长连接推送时是可行的,不过当时是做的行业软件,特定型号手机,没广泛测试各个手机型号。
基本是 1 秒推送到位,长连接可以维持全天。
why1
2018-02-19 14:41:49 +08:00
@boywhp 怎么加,华为的
realpg
2018-02-20 08:43:27 +08:00
杀进程系省电 ROM 华为就是代表 一定要加不杀白名单
boywhp
2018-02-20 10:16:22 +08:00
@why1 设置->电池->锁屏清理应用
why1
2018-02-20 12:18:49 +08:00
@boywhp 我这机子要插充电器或是一直亮屏应用才不会被冻结 emui 5.0.1 Android 7.0,原来 emui 4,Android6 只要放着音乐就没事

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

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

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

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

© 2021 V2EX