目录
核心类:
StatusBar.java 状态栏整体控制
StatusBarWindowView.java 状态栏未扩展时的跟布局
PhoneStatusBarView.java 继承PanelBar.java
NotificationPanelView.java 状态栏下拉后的控制类,继承自PanelView.java
QSFragment.java 状态栏下拉后状态栏部分的控制类;
NotificationStackScrollLayout.java 下拉通知的相关显示
部分界面布局文件
根布局:super_status_bar.xml,
顶上状态栏: status_bar.xml, 通过CollapsedStatusBarFragment.java加载;PhoneStatusBarView(FrameLayout,)是里面的父控件; 对应 R.id.status_bar_container 。
下拉状态栏(包括通知为status_bar_expanded.xml),最外层布局NotificationPanelView。qs_frame.xml 为下拉后的状态栏部分(用QSFragment管理,布局控件为QSContainerImpl),其高度更新在QSContainerImpl.java中,
NotificationStackScrollLayout 用于下拉的通知的相关问题(占满全屏,包括导航栏,会处理点击状态栏空白区的逻辑)
quick_status_bar_expanded_header.xml中的QuickQSPanel 是状态栏未扩展时的布局。
滑动和点击事件:
滑动要注意:flingSettings 函数可以做切入口;
状态栏完全隐藏时是如何滑出来的?PhoneWindowManager.java中.onSwipeFromTop(PhoneWindowManager.java:2067) 通过PointerEventListener.onPointerEvent 监听,并不在SystemUI里面。
点击空白区域时,取消扩展的状态栏: 见mPostCollapseRunnable;
NotificationPanelView.java 中的handleQsTouch 在直接处理QS布局中子view的点击滑动时,不会被调用。
handleQsDown 在下拉和上滑过程未被调用,处理点击事件。
QSFragment.java 中的setExpanded 传入的expanded在扩展向完全扩展时值会变为true
setOverscrolling 首次下拉时,扩展状态到完全扩展状态会调用。
事件QS部分是否拦截,可参考onQsIntercept;onQsIntercept:完全扩展,按在QS向上滑动时 会返回true
通知的通知显示过程
NotificationManager.notify(notifyAsUser):
checkFileUriExposed检查是否把音频文件的路径暴露出去了。
fixLegacySmallIcon如果通知没有小图标,就创建一个,紧接着将图标大小裁剪到限制大小以内。
maybeCloneStrippedForDelivery:如果内存太低,就不使用用户自定义的界面。
过滤完后调用NotificationManagerService.enqueueNotificationWithTag
NotificationManagerService.enqueueNotificationWithTag
checkCallerIsSystemOrSameApp:判断调用者app id是否和调用进程一致;
resolveNotificationUid:解析通知的UID
Notification.addFieldsFromContext:添加应用信息
PackageManagerClient.checkPermission:检查是否有着色权限
UsageStats.registerEnqueuedByApp:在NotificationUsageStats中记录通知的状态等
RankingHelper.getNotificationChannel:创建通知信道
RankingHelper.updateNotificationChannel: 根据需要调用,更新通知信道
checkDisqualifyingFeatures:检查是否有不合格的特征
setPendingIntentWhitelistDuration:
EnqueueNotificationRunnable:在工作线程调用实际处理通知内容
EnqueuedNotifications:添加NotificationRecord记录;
scheduleTimeoutLocked:超时处理
handleGroupedNotificationLocked:处理分组通知
RankingHelper.extractSignals:通知排名
Assistants.onNotificationEnqueued: 根据条件调用,通知通知助手有通知加入队列
PostNotificationRunnable:继续处理
处理前台服务的flag;
applyZenModeLocked:判断勿扰模式是否拦截
Listeners.notifyPostedLocked:通知NotificationListeners处理(实现了NotificationListenerService的onNotificationPosted方法,)
GroupHelper.onNotificationPosted:
buzzBeepBlinkLocked:震动、响铃或闪光灯。
StatusBar.NotificationListenerWithPlugins.onNotificationPosted---addNotification/updateNotification--createNotificationViews---inflateViews(entry.row创建时应该是为null,更新时不为null。都通过updateNotification更新,Entry在NotificationData.java里面,记录了通知的数据,包括界面数据等;row是ExpandableNotificationRow,本质是个FrameLayout)---updateNotification--ExpandableNotificationRow.updateNotification---NotificationInflater.inflateNotificationViews(在子线程填充通知界面的数据等)---createRemoteViews(构建出所有的view)---apply(相当于使能view)