Android系统通知处理流程

最近在分析Android系统的通知处理机制,觉得有必要梳理个笔记出来,供日后参考。

应用层使用NotificationManager系统服务进行通知显示,大体经过了NotificationManagerService -> StatusBarManagerService  -> SystemUI 这么几个阶段,之前使用Binder进行相互通讯。相关模块组织结构如下图所示,一目了然:

Android系统通知处理流程_第1张图片


ServiceManager、SystemSerer和SystemUI是android系统三个非常重要的进程,相信熟悉Android系统框架的亲们已经比较了解了。所有的系统服务都是运行在SystemServer这个进程中,并且将自身注册到ServiceManager中。应用层通过Framework API发送通知时,会通过Binder驱动相应地调用NotificationManagerService的enqueueNotification方法。enqueueNotification方法记录通知内容,调用StatusBarManangerService的updateNotifcation接口,并且执行响铃、震动和呼吸灯效果,最后,如果有注册相应的辅助服务(AccessibilityService),则给辅助服务发送通知事件。StatusBarManagerService会将通知事件再次转发给SystemUI中负责通知栏显示的StatusBar。注意到Android系统内建有两个通知栏,一个是PhoneStatusBar,一个是TabletStatusBar,根据系统配置的类型决定用哪一种。

然后附带聊一下通知拦截的问题吧。根据上面的流程可以看到,有三个地方可以作为通知拦截的切入点。但是注意到响铃、震动和呼吸灯是由NotificationManagerService控制的,所以直接在第一环节切掉是最干净的。至于具体怎么切,root后你懂的。


你可能感兴趣的:(技术为王)