目錄
1.framework層中發送通知流程
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:震動、響鈴或閃光燈。
2.狀態欄中通知的顯示流程
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)