目錄
核心類:
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)