今天又同事反应本人负责的应用在Android4.3系统的通知栏里会显示2个提示。拿来一看,除了一个应用正常的Notification外,多了一个含有本应用标题的“XX正在运行”的提示。一些主流的应用也大多如此,如:微博、手机管家。
这个问题一来影响了用户使用体验,二是会让用户怀疑应用是否在后台偷偷摸摸做一些“坏事”,需要马上解决才行。
第一反应是上网查查资料,看看同行是否已经有了对策,不过发现大家似乎也在摸索当中。与几位同事交流后,大家有以下几个猜测:
1、开机自启动的权限导致的问题。
2、使用Notification对象数量超出允许范围导致的问题。
3、多进程运行时架构导致的问题——本应用与一些主流应用同样使用了多个进程。
有了猜测,就可以验证了,于是分头行动去了。不过我对以上3个猜测持保留态度,因为这些猜测都只是凭印象,并没有什么依据,于是继续在网上找线索。不久在一个论坛看到个谷歌开发人员对这个新特性的说明(http://tieba.baidu.com/p/2490091314#frs_nav)。说明中提到这个新特性的加入是为了防止开发者滥用startForeground这个API而加入的,特别是针对“制作了一个异常的通知对象,使得通知管理器不显示该通知”这种情况。这个描述直接指向了应用中一段很常用的代码:
Notification nf = new Notification();
startForeground(Integer.MAX_VALUE, nf);
将空的Notification换成有正常内容——即可显示的Notification后,问题解决了。4.3这个新特性可以使Android系统更加安全,挺不错的。如果大家是想在不显示Notification的情况下解决这个问题,我劝大家还是不要费劲了,官方已经明确提出禁止此类行为了。