StatusBar状态栏部分功能记录——Android8.0

目录

核心类:

部分界面布局文件

滑动和点击事件:

通知的通知显示过程


 

核心类:

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)


 

发布了14 篇原创文章 · 获赞 4 · 访问量 6611
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章