求助安卓开发大佬, App 崩溃,提示启动前台服务失败,问题是我并没有启动前台服务

3 天前
 yafoo

日志如下:

Time: 2025-05-12 23:41:07
Brand: Xiaomi
Model: 2211133C
Android Version: 13 (SDK 33)
Exception: 
Message:Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{5105f70 u0 com.android.app/.MQTTService}
Stack Trace:
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{5105f70 u0 com.android.app/.MQTTService}
at android.app.ActivityThread.generateForegroundServiceDidNotStartInTimeException(ActivityThread.java:2078)	
at android.app.ActivityThread.throwRemoteServiceException(ActivityThread.java:2052)
at android.app.ActivityThread.-$$Nest$mthrowRemoteServiceException(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2314)
at android.os.Handler.dispatchMessage(Handler.java:106)	at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)	
at android.app.ActivityThread.main(ActivityThread.java:8240)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)

从日志看,大概意思是启动前台服务失败,问题时,我程序里根本没有启动前台服务,引用的第三方库,也不会启动前台服务。

这个问题,仅在这个用户出现。

而且诡异的是,正常情况下,app 连续崩溃几次,安卓就会禁止自启动,而这个用户的手机,居然可以一直在自启动,启动后后崩溃,然后继续自启动。

有没有安卓开发的大佬,这是属于什么问题?

1683 次点击
所在节点    Android
33 条回复
dingwen07
3 天前
让用户把你的 App 禁用后台优化试试看
Musong
2 天前
“引用的第三方库,也不会启动前台服务。”,感觉是这的问题,可能有推送之类的。
纯猜测阿
wuruxu
2 天前
应该先问 AI ,一般问题都能搞定的
yafoo
2 天前
@dingwen07 哦,我看看能不能复现
yafoo
2 天前
@Musong 我这个 app 本身是做推送的,引用的第三方库,只有简单的几个,一个 http 请求库,一个谷歌的 json 解析库,一个开源的 mqty 客户端,一个 markdown 解析库,所以说不会是第三方库引起的。

app 虽然没几个用户,不过已经迭代了 2 年了,目前只有这一个用户出现这情况。
yafoo
2 天前
@Musong mqtt 客户端
yafoo
2 天前
@wuruxu 问过 AI 了,AI 的意思是,让检查第三方库
yafoo
2 天前
忘了说了,我自身代码里是启动的后台服务
nightlight9
2 天前
@yafoo #6 日志里都写了 MQTTService 是前台服务....
maokg
2 天前
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{5105f70 u0 com.android.app/.MQTTServic
rumengzhenxing
2 天前
@yafoo #8
~~~java
@Override
public void onCreate() {
super.onCreate();
// 创建通知渠道( Android 8.0+必需)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"MQTT_CHANNEL_ID",
"MQTT Service",
NotificationManager.IMPORTANCE_LOW
);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(channel);
}
// 构建通知并启动前台服务
Notification notification = new NotificationCompat.Builder(this, "MQTT_CHANNEL_ID")
.setContentTitle("MQTT 服务运行中")
.setContentText("正在连接服务器...")
.setSmallIcon(R.drawable.ic_notification)
.build();
startForeground(1, notification); // ID 必须非 0 ,通知不可为 null
}
~~~
winterbells
2 天前
全局搜 MQTTService ,ctrl + shift + f 搜,切换到 scope all place
capric
2 天前
mqtt clientl 连接 broker 超时了?
debuggeeker
2 天前
启动的后台服务,那就对了,启动后台服务,高版本需要 startForeground ,还需要带个通知显示,查一查官方 api 吧,需要配置权限和服务通知。
Bichat
2 天前
以前接过 android 版本的 mqtt 库,他会创建一个前台 service 的
DeweyReed
2 天前
我的 Crahlytics 中全是这个。试过很多方案都无法根治。
Context.startForegroundService 启动一个 Service ,然后在 Service 中要调用 startForeground ,这是一个从后台启动前台服务的一种方法。没在规定时间内调用 startForeground ,就会触发这种崩溃。这种崩溃几乎必定会有用户遇到。
逆向自己的应用,查找 startForegroundService ,可以定位到哪个 Library 触发的。
a1210968738
2 天前
可以 hook 对 ams 的 binder 调用,这样可以拿到发起启动服务的具体堆栈和参数,可以排查出是否有三方库以你意想不到的方式启动前台服务;或者 app 确实没有主动启动前台服务。
joywan
2 天前
启动后台服务必须同时启动前台服务,而你没有启动。
yafoo
2 天前
@nightlight9 MQTTService 是我自己写的,我写的启动方式是后台启动
yafoo
2 天前
@rumengzhenxing 你这段代码是用来启动前台服务的,我用的是后台服务

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1131299

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX