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