zinwalin
V2EX  ›  Android

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

  •  
  •   zinwalin · Jun 22, 2022 · 16966 views
    This topic created in 1595 days ago, the information mentioned may be changed or developed.

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

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

    Supplement 1  ·  Jun 22, 2022
    网上看到 Foreground service 的文章,大家可以参考下。

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

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