有的时候我们不断的发一个通知,如果次数达到定后可能会导致通知栏消失(3.0以下的Android system),这个问题其实是Android内部的一个Bug,下面我来分析一下造成这个问题的原因
当這个问题出现的时候,我们通过分析Log后得知com.android.systemui进行中出现在ANR,原因就是处理广播消息时超时而这个ANR会导致com.android.systemui进程死掉。通常状态栏会维護通知信息,并会保持所有通知的remote
views如果当一个客户端程序不断的发送通知的话,系统就不地断的使用内存来创建这些remote
view因此,就会导致垃圾回收器(GC)开始回收内存UI开始变慢(通俗一点说就是变卡),如果此时客户端程序还不断的发通知那么UI会变得越来越慢,最后ANR錯误出现了。我们可以写一个DEMO来重现这个问题起一个timer,不断的发送通知可能状态栏就会消失,此时的LOG如下:
从这个LOG中可以看见GC不断嘚释放内存,这会导致UI响应延迟这种现象可以Android 2.1, 2.2, 2.3上面重现,3.0以上的我没有试过不知道是不是存在同样的问题。当Notification bar中的RemoteView增长到一定数量之後也就是说它超过了IBinder.transcat()所能处理的范围,RemoteException异常就会抛出有时候,如果起过了VM的限制APP都可能会挂掉。
关于这个问题原因我们是知道了,如何解决我们不要去每次发送通知,我们可以用相同的消息ID去更新通知而不是重新创建。
这个问题其实已经在Google的论坛上提出来了,可以参考: