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

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

  •  
  •   fhj · 2022-06-26 14:58:48 +08:00 · 10987 次点击
    这是一个创建于 912 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 我首先在 MainActivity 的 oncreate 里调用了 val intent =Intent(this,MyService::class.java) startForegroundService(intent) 启动了服务
    • 又在 MyService 里的 onStartCommand 中调用了以下函数
            val job = Job()
            val 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-06-26 15:03:54 +08:00 via Android
    微信是手机厂商加了白名单
    Buges
        2
    Buges  
       2022-06-26 15:06:44 +08:00   ❤️ 1
    添加到电池优化白名单
    fhj
        3
    fhj  
    OP
       2022-06-26 15:07:59 +08:00
    @Muniesa 我擦,大佬,我这个代码写的有问题吗
    fhj
        4
    fhj  
    OP
       2022-06-26 15:08:16 +08:00
    @Buges 我试试
    fhj
        5
    fhj  
    OP
       2022-06-26 16:10:08 +08:00
    @Buges 解决了,谢谢
    cheng6563
        6
    cheng6563  
       2022-06-26 16:10:35 +08:00
    依系统不同,引导用户操作增加后台白名单,电池优化白名单,自启白名单等。
    不然代码里基本玩啥都没用
    微信一般系统默认加白。
    fhj
        7
    fhj  
    OP
       2022-06-26 16:19:47 +08:00
    @cheng6563 谢谢解答
    bruce0
        8
    bruce0  
       2022-06-26 16:20:31 +08:00
    以前的 Android 有个规则, 好多年不弄 Android 了 不知道现在还是这样吗, 前台服务的优先级 > 后台服务, 也就是在通知栏里显示一个通知的服务, 不会被优先杀死, 以前这样弄过, 确实一般不会被杀了.

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

    简单总结:
    1 )后台运行
    2 )消息推送拉起
    3 )全家桶的其它 App 拉起
    4 )系统默认设置白名单,就是安装后默认设置不杀进程
    IGJacklove
        14
    IGJacklove  
       2022-06-27 19:11:38 +08:00 via iPhone
    推送不就行了吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5736 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 06:24 · PVG 14:24 · LAX 22:24 · JFK 01:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.