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

安卓 MQTT 客户端如何保证 Service 一直运行在后台?

  •  
  •   zinwalin · 13 天前 · 2989 次点击

    有个客户端集成了 MQTT 库,在前台运行时,MQTT 消息可以正常接收和发送。 但是放在后台后, 消息就收不到了。

    有办法让 MQTT service 一直运行吗?

    第 1 条附言  ·  12 天前
    网上看到 Foreground service 的文章,大家可以参考下。

    https://robertohuertas.com/2019/06/29/android_foreground_services/
    第 2 条附言  ·  12 天前
    47 条回复    2022-06-24 09:56:00 +08:00
    DrX
        1
    DrX  
       13 天前   ❤️ 1
    俗称保活,目前这是一门高精尖技术活。
    nothingistrue
        2
    nothingistrue  
       13 天前
    后台接受消息,请使用推送,除了微信之外的强行保活手段,必然被 OEM 和用户无情的杀掉。
    passon
        3
    passon  
       13 天前
    目前已经没有稳定的包活手段了。可以 App 挂了后应该走厂商推送
    crayygy
        4
    crayygy  
       12 天前
    Foreground Service
    psklf
        5
    psklf  
       12 天前
    Foreground Service 应该可以
    springz
        6
    springz  
       12 天前
    看设备是不是自己能控制的,自己定制一个 ROM 加白名单。
    springz
        7
    springz  
       12 天前
    Foreground services 不行的,还是会断。
    springz
        8
    springz  
       12 天前
    保活目前是超级技术活,有能量就厂商白名单,比如微信。没能量就老老实实推送。不过国内这推送,唉。多集成几个厂商推送吧。
    springz
        9
    springz  
       12 天前
    看什么应用,要是不是 toC 的,特定领域的,大不了一直放着音乐,霸占一个通知栏,也能活。
    springz
        10
    springz  
       12 天前
    放音乐这个要是进程被杀了,也拉不起来的。总之现在要是要求一直在线就厂商白名单吧,看自己公司有没有这个能量。
    springz
        11
    springz  
       12 天前
    用这个怼需求提出方也行,有这需求找手机厂商解决。
    leafre
        12
    leafre  
       12 天前
    无解,换种实现方式
    Buges
        13
    Buges  
       12 天前 via Android
    @springz 你自己定制的 ROM 本身就不会杀任何非显式禁止的进程。
    cczhrd
        14
    cczhrd  
       12 天前
    darkengine
        15
    darkengine  
       12 天前
    这要是做到了,国外不敢讲,国内互联网大厂随便挑哈
    aneostart173
        16
    aneostart173  
       12 天前
    挺难的,而且一年比一年难。老实用推送,或者自己定制设备。
    BlackBull19
        17
    BlackBull19  
       12 天前
    只能推荐推送了. 搞一个坚挺前后台切换的 然后走推送, 目前只能推送
    lqzhgood
        18
    lqzhgood  
       12 天前
    提示用户把 App 加入后台自启动能保活吗?
    cheng6563
        19
    cheng6563  
       12 天前
    引导客户再设置里加后台运行白名单,别无他法。
    psklf
        20
    psklf  
       12 天前
    @springz 放音乐不就是 foreground service 吗?
    basncy
        21
    basncy  
       12 天前   ❤️ 1
    包名改成 com.tencent.mobileqq
    PowerDi
        22
    PowerDi  
       12 天前
    原来现在已经那么严重了吗?保活都需要专门的思路了?
    PowerDi
        23
    PowerDi  
       12 天前
    如果保活那么困难,现在为什么那么多安卓用户还在苦于后台 CPU 在猛跑
    basncy
        24
    basncy  
       12 天前
    android 再先进的调度算法, 研究再多保活代码, 再多设置, 在这里可能就被某些国行厂商后台优化白名单一刀切了, 21 楼简单以暴制暴.
    SupperMary
        25
    SupperMary  
       12 天前
    @PowerDi 厂家和 APP 有 py 交易
    darkengine
        26
    darkengine  
       12 天前
    @basncy 如果用户先安装了 qq ,这个包名的 apk 都安装不了。。。
    zinwalin
        27
    zinwalin  
    OP
       12 天前
    @nothingistrue 如果是自己的定制安卓系统,有什么好办法保活吗? 我试了在系统级 App 里集成 MQTT Service ,放后台后,一样会收不到消息。
    zinwalin
        28
    zinwalin  
    OP
       12 天前
    @psklf 感谢,我试试。
    zinwalin
        29
    zinwalin  
    OP
       12 天前
    @springz 自己的定制系统,加白名单是啥意思? 系统级 App 放后台还是不行,我试过了。
    zinwalin
        30
    zinwalin  
    OP
       12 天前
    @cczhrd 刚好这个我也加了, 还是不行。我们是定制的安卓系统,所以加了一些系统级的 App
    springz
        31
    springz  
       12 天前
    自己定制的系统随便玩啊,找编译 ROM 的人把你 App 加进去。
    tanranran
        32
    tanranran  
       12 天前
    如果是定系统级,把 APP 放到 /system/priv-app/下即可
    zinwalin
        33
    zinwalin  
    OP
       12 天前
    @tanranran 放进去了,MQTT service 还是不能在后台长时间运行。
    winterbells
        34
    winterbells  
       12 天前 via Android
    dumpsys deviceidle whilelist +com.xxx
    你都定制系统了,怎么后台权限还搞不定…
    SteveWoo
        35
    SteveWoo  
       12 天前   ❤️ 1
    不可能了,尤其是国外的文章不适合国情。 去 android 上把微信的白名单关了,微信去后台都收不到消息的。 国产厂商默认把微信加白名单,如果你们有实力去跟厂家谈谈。
    zinwalin
        36
    zinwalin  
    OP
       12 天前
    @winterbells 感谢,dumpsys deviceidle whilelist +com.xxx 这台命令,如果不通过命令行,怎么默认加到系统里? 也就是编译时在哪里添加?
    documentzhangx66
        37
    documentzhangx66  
       12 天前
    别的系统我不知道,小米系统就可以这样:

    写个 APP 承载服务,然后让用户去系统里设置,该 APP 在后台能一直存活,不被限制。
    passerby233
        38
    passerby233  
       12 天前 via Android
    参考这个库 https://github.com/hannesa2/paho.mqtt.android 然后在客户端的权限管理里开启自启动,电池省电策略更改为无限制就行了。
    nothingistrue
        40
    nothingistrue  
       12 天前   ❤️ 1
    @PowerDi #23 高频激活——被杀——再激活这个循环,相比于单纯的常驻后台,CPU 消耗量可以多成百上千倍。Android 最大的问题不是常驻后台,而是自动唤醒方式多如牛毛。正常的常驻后台服务是消耗非常少的资源的(谷歌自带框架就是典型,几十个后台服务但是耗电量几乎无感)
    shanghai1998
        41
    shanghai1998  
       12 天前
    1 开启悬浮权限
    2 挂到 push 的 sdk 里面
    zinwalin
        42
    zinwalin  
    OP
       12 天前
    @passerby233 谢谢分享,我现在用的是
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4' // MQTT
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' // MQTT service

    你发的那个链接,是不是改过的?
    passerby233
        43
    passerby233  
       12 天前 via Android
    @zinwalin 是的,就是基于 eclipse 版本的 mqtt 库改的,改成 kotlin 版本的了,提供的功能都一致的。
    zinwalin
        44
    zinwalin  
    OP
       12 天前
    @passerby233 多谢。
    zinwalin
        45
    zinwalin  
    OP
       12 天前
    @shanghai1998 方便给下相关的文章或资料吗? 多谢
    zinwalin
        47
    zinwalin  
    OP
       11 天前
    @passerby233 感谢分享
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3902 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:00 · PVG 12:00 · LAX 21:00 · JFK 00:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.