描述

image-20230521182150265

APP的表现:正常显示一会之后自动崩溃消失了。

分析

英语翻译:

com.ixuea.courses.mymusic/.service.MusicPlayerService

这个app里面的这个地方。

没有在拉起前台service后调用什么Service.startForeground()

搜索引擎说:

这个异常是指你的服务在调用 Context.startForegroundService() 后没有及时调用 Service.startForeground() 来显示一个前台通知¹²⁴。这可能会导致系统停止你的服务并报告应用无响应(ANR)¹。为了避免这个异常,你需要在服务的 onCreate() 方法中调用 startForeground() 并传入一个有效的通知¹²⁴。如果你的服务是在后台启动的,比如通过广播接收器,你还需要注意在Android 8.0及以上版本中使用 ContextCompat.startForegroundService() 来启动服务³⁴。

我当时的onCreate()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Override
public void onCreate() {
super.onCreate();
Timber.d("onCreate");

//因为这个API是8.0才有的
//所以要这样判断版本
//不然低版本会崩溃
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//设置service为前台service
//提高应用的优先级

//获取通知
Notification notification = NotificationUtil.getServiceForeground(getApplicationContext());

//Id写0:这个通知就不会显示
//对于我们这里来说
//就需要不显示
startForeground(0, notification);
}
musicListManager = MusicListManagerImpl.getInstance(getApplicationContext());
musicPlayerManager = MusicPlayerManagerImpl.getInstance(getApplicationContext());
musicPlayerManager.addMusicPlayerListener(this);
initMediaSession();
}

实现

startForeground(0, notification)这里的==0==改为==1==

总结

原因:

那个地方是0的话,就表示你的通知没有显示在通知栏中,但是你的服务仍然需要一个有效的通知才能在前台运行。

如果你没有及时调用 startForeground() 并传入一个有效的通知,系统就会认为你的服务没有正确地启动前台模式,就会抛出那个异常 。所以,你需要把那个地方改为一个非0的值,比如1,这样你的通知就会显示在通知栏中,你的服务就可以正常地运行在前台模式了。

也就是说,我们必须有一个前台service在通知栏里躺着。

我写0,这就不是一个有效的通知。

只启动了服务但是前台没那个通知。

所以一段时间之后就会自动没了。

0还是1就是决定在通知中留不留那个通知。

启动服务 + 留下通知 = 0Bug