【Bug】Android中Notification的前台service导致app过一会就闪退
描述
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
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