如何像微信那样具有长效的后台消息通知 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fhj
V2EX    Android

如何像微信那样具有长效的后台消息通知

  •  
  •   fhj 2022 年 6 月 26 日 14193 次点击
    这是一个创建于 1316 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 我首先在 MainActivity 的 oncreate 里调用了 val intent =Intent(this,MyService::class.java) startForegroundService(intent) 启动了服务
    • 又在 MyService 里的 onStartCommand 中调用了以下函数
     val job = Job() al mCoroutineScope = CoroutineScope(job) val notification = NotificationCompat.Builder(service, "1") .setContentTitle("test") .setSmallIcon(R.drawable.ic_action_name) .setAutoCancel(true) startForeground(1,notification.setContentText("") .build()) stopForeground(true) 

    最后创建了一个协程,在协程中从服务器获取最新消息并通知 具体过程如下:

    mCoroutineScope.launch{ while(true) { val cOntent= 从网络中获取消息 val notfi = notification.setContentText(content) .setContentIntent(pending) .build() notificationManager.notify(id, notfi) } } 

    我的问题是: 启动服务后,把 app 拉到了后台,当服务运行一会后,消息就不会再弹出,就需要再次进入 app 界面,消息又开始弹出,如此往复。并不能像微信那样拉到后台后,后台服务不会暂停,消息会及时的弹出。

    14 条回复    2022-06-27 19:11:38 +08:00
    Muniesa
        1
    Muniesa  
       2022 年 6 月 26 日 via Android
    微信是手机厂商加了白名单
    Buges
        2
    Buges  
       2022 年 6 月 26 日   1
    添加到电池优化白名单
    fhj
        3
    fhj  
    OP
       2022 年 6 月 26 日
    @Muniesa 我擦,大佬,我这个代码写的有问题吗
    fhj
        4
    fhj  
    OP
       2022 年 6 月 26 日
    @Buges 我试试
    fhj
        5
    fhj  
    OP
       2022 年 6 月 26 日
    @Buges 解决了,谢谢
    cheng6563
        6
    cheng6563  
       2022 年 6 月 26 日
    依系统不同,引导用户操作增加后台白名单,电池优化白名单,自启白名单等。
    不然代码里基本玩啥都没用
    微信一般系统默认加白。
    fhj
        7
    fhj  
    OP
       2022 年 6 月 26 日
    @cheng6563 谢谢解答
    bruce0
        8
    bruce0  
       2022 年 6 月 26 日
    以前的 Android 有个规则, 好多年不弄 Android 了 不知道现在还是这样吗, 前台服务的优先级 > 后台服务, 也就是在通知栏里显示一个通知的服务, 不会被优先杀死, 以前这样弄过, 确实一般不会被杀了.

    其实还是看系统的策略, 有的系统不会杀,有的系统还是杀, 就像楼上说的那样, 加入优化,电池,后台, 自启等等白名单, 这个在业务层没法实现靠谱保活
    fhj
        9
    fhj  
    OP
       2022 年 6 月 26 日
    现在好像也是这样,谢谢解答
    fhj
        10
    fhj  
    OP
       2022 年 6 月 26 日
    @bruce0 现在好像也是这样,谢谢解答
    ysc3839
        11
    ysc3839  
       2022 年 6 月 26 日 via Android
    参考 Telegram Android 的代码,有个 Keep-Alive Service 的功能,在 MIUI 上允许自启动后,后台服务被杀死后可以立即重启,如果再把“省电策略”设置成“无限制”的话,系统内存充足的情况下后台服务可以长时间运行不被杀死。但是有个例外,如果用户在最近任务中划掉则一定会被杀死,即使有前台服务也会被杀,但仍然可以通过前面所说的“自启动”重新启动。
    em70
        12
    em70  
       2022 年 6 月 26 日
    除了微信,所有的即时通讯 APP 在后台都会被杀而收不到消息
    fox0001
        13
    fox0001  
       2022 年 6 月 27 日 via Android
    记得以前看过文章,介绍微信怎么保活。这是个感觉简单常用,但实现起来很麻烦的事情。

    简单总结:
    1 )后台运行
    2 )消息推送拉起
    3 )全家桶的其它 App 拉起
    4 )系统默认设置白名单,就是安装后默认设置不杀进程
    IGJacklove
        14
    IGJacklove  
       2022 年 6 月 27 日 via iPhone
    推送不就行了吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2141 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 12:43 PVG 20:43 LAX 04:43 JFK 07:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86