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

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

  •  
  •   zinwalin · 2022-06-22 11:45:37 +08:00 · 6538 次点击
    这是一个创建于 646 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2022-06-22 21:45:17 +08:00
    网上看到 Foreground service 的文章,大家可以参考下。

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

    写个 APP 承载服务,然后让用户去系统里设置,该 APP 在后台能一直存活,不被限制。
    passerby233
        38
    passerby233  
       2022-06-23 02:41:24 +08:00 via Android
    参考这个库 https://github.com/hannesa2/paho.mqtt.android 然后在客户端的权限管理里开启自启动,电池省电策略更改为无限制就行了。
    nothingistrue
        40
    nothingistrue  
       2022-06-23 09:27:25 +08:00   ❤️ 1
    @PowerDi #23 高频激活——被杀——再激活这个循环,相比于单纯的常驻后台,CPU 消耗量可以多成百上千倍。Android 最大的问题不是常驻后台,而是自动唤醒方式多如牛毛。正常的常驻后台服务是消耗非常少的资源的(谷歌自带框架就是典型,几十个后台服务但是耗电量几乎无感)
    shanghai1998
        41
    shanghai1998  
       2022-06-23 09:44:45 +08:00
    1 开启悬浮权限
    2 挂到 push 的 sdk 里面
    zinwalin
        42
    zinwalin  
    OP
       2022-06-23 09:45:43 +08:00
    @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  
       2022-06-23 10:03:28 +08:00 via Android
    @zinwalin 是的,就是基于 eclipse 版本的 mqtt 库改的,改成 kotlin 版本的了,提供的功能都一致的。
    zinwalin
        44
    zinwalin  
    OP
       2022-06-23 10:06:12 +08:00
    @passerby233 多谢。
    zinwalin
        45
    zinwalin  
    OP
       2022-06-23 10:06:44 +08:00
    @shanghai1998 方便给下相关的文章或资料吗? 多谢
    passerby233
        46
    passerby233  
       2022-06-23 11:22:16 +08:00
    zinwalin
        47
    zinwalin  
    OP
       2022-06-24 09:56:00 +08:00
    @passerby233 感谢分享
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2864 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:03 · PVG 21:03 · LAX 06:03 · JFK 09:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.