目录
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)