
val intent =Intent(this,MyService::class.java) startForegroundService(intent) 启动了服务 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 界面,消息又开始弹出,如此往复。并不能像微信那样拉到后台后,后台服务不会暂停,消息会及时的弹出。
1 Muniesa 2022 年 6 月 26 日 via Android 微信是手机厂商加了白名单 |
2 Buges 2022 年 6 月 26 日 添加到电池优化白名单 |
6 cheng6563 2022 年 6 月 26 日 依系统不同,引导用户操作增加后台白名单,电池优化白名单,自启白名单等。 不然代码里基本玩啥都没用 微信一般系统默认加白。 |
8 bruce0 2022 年 6 月 26 日 以前的 Android 有个规则, 好多年不弄 Android 了 不知道现在还是这样吗, 前台服务的优先级 > 后台服务, 也就是在通知栏里显示一个通知的服务, 不会被优先杀死, 以前这样弄过, 确实一般不会被杀了. 其实还是看系统的策略, 有的系统不会杀,有的系统还是杀, 就像楼上说的那样, 加入优化,电池,后台, 自启等等白名单, 这个在业务层没法实现靠谱保活 |
9 fhj OP 现在好像也是这样,谢谢解答 |
11 ysc3839 2022 年 6 月 26 日 via Android 参考 Telegram Android 的代码,有个 Keep-Alive Service 的功能,在 MIUI 上允许自启动后,后台服务被杀死后可以立即重启,如果再把“省电策略”设置成“无限制”的话,系统内存充足的情况下后台服务可以长时间运行不被杀死。但是有个例外,如果用户在最近任务中划掉则一定会被杀死,即使有前台服务也会被杀,但仍然可以通过前面所说的“自启动”重新启动。 |
12 em70 2022 年 6 月 26 日 除了微信,所有的即时通讯 APP 在后台都会被杀而收不到消息 |
13 fox0001 2022 年 6 月 27 日 via Android 记得以前看过文章,介绍微信怎么保活。这是个感觉简单常用,但实现起来很麻烦的事情。 简单总结: 1 )后台运行 2 )消息推送拉起 3 )全家桶的其它 App 拉起 4 )系统默认设置白名单,就是安装后默认设置不杀进程 |
14 IGJacklove 2022 年 6 月 27 日 via iPhone 推送不就行了吗? |