1.问题:打开应用,通知栏提示“xx应用”正在运行,且应用只要在运行,此通知一直显示,不会消失,手动也不能删除,除非杀死应用,如新浪财经的提示:
2.此通知弹出逻辑
关于前台服务:
在系统内存资源不足的情况下,会优先杀掉低优先级的进程。对于只有service的进程,有些情况对于用户来说是可感知的app。往往不希望被系统所杀,比如正在听音乐。
系统默认service都是后台的,可以通过startForeground()把该service提升到foreground优先级,那么adj便会成为PERCEPTIBLE_APP_ADJ(可感知的级别),这个级别的app一般不会轻易被杀。当用户不再听歌时,应该主动调用stopForeground(),将其优先级还原到后台,为用户提供更好的体验,相关API位于文件Service.java :
startForeground(int id, Notification notification)
stopForeground(boolean removeNotification)
以上两个方法进入AMS都是调用setServiceForeground();对于startForeground(),往往通过postNotification()来展示 一个通知;对于stopForeground(),当removeNotification=true,则通过 cancelNotification()来取消通知。
作为前台service,必须要有一个status bar的通知,并且通知不会消失直到service停止或许主动移除前台优先级。
3.如果不想要这种通知显示出来,要怎么做?
目前我们的做法是在ServiceRecord.java的postNotification()方法中,根据notification的channelId进队列前进行拦截:
目前没有找到比较合适的过滤方式,如过滤出音乐类应用的channelId不进行拦截从而正常显示,但是可以拦截掉市面上的大多数应用,如新浪财经等。