V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
boywhp
V2EX  ›  Android

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

  •  
  •   boywhp · 2018-02-18 20:02:20 +08:00 · 9912 次点击
    这是一个创建于 2220 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    Android 新手, 求大虾指点

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

    3、4 年前做长连接推送时是可行的,不过当时是做的行业软件,特定型号手机,没广泛测试各个手机型号。
    基本是 1 秒推送到位,长连接可以维持全天。
    why1
        17
    why1  
       2018-02-19 14:41:49 +08:00 via Android
    @boywhp 怎么加,华为的
    realpg
        18
    realpg  
       2018-02-20 08:43:27 +08:00
    杀进程系省电 ROM 华为就是代表 一定要加不杀白名单
    boywhp
        19
    boywhp  
    OP
       2018-02-20 10:16:22 +08:00
    @why1 设置->电池->锁屏清理应用
    why1
        20
    why1  
       2018-02-20 12:18:49 +08:00 via Android
    @boywhp 我这机子要插充电器或是一直亮屏应用才不会被冻结 emui 5.0.1 Android 7.0,原来 emui 4,Android6 只要放着音乐就没事
    boywhp
        21
    boywhp  
    OP
       2018-02-20 16:56:10 +08:00
    @why1 后台服务冻结感觉无解了, 只要不杀就好了, 我现在的策略是冻结后唤醒立即执行通信重连
    fengleidongxi
        22
    fengleidongxi  
       2018-02-21 10:13:59 +08:00
    @boywhp 楼主通信的传输的是什么?
    boywhp
        23
    boywhp  
    OP
       2018-02-21 10:43:09 +08:00
    @fengleidongxi 加密二进制数据报文, 不是 HTTP 哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5375 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:07 · PVG 17:07 · LAX 02:07 · JFK 05:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.