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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章