一句话总结
在SystemUI进程中通过INotificationManager将要休眠的通知传递给SystemServer进程,SystemServer进程中通过AlarmManager定时发送一条广播让NotificationManagerService发送通知。
1.SystemUI进程中处理点击事件
点击通知休眠按钮,由NotificationSnooze的handleCloseControls处理
NotificationSnooze.java
if (mSnoozeListener != null && mSelectedOption != null) {
// Snooze option selected so commit it
mSnoozing = true;
mSnoozeListener.snooze(mSbn, mSelectedOption);
}
经过一系列的转发,最终会调用到StatusBar的setNotificationSnoozed
NotificationStackScrollLayout.java
@Override
public void snooze(StatusBarNotification sbn, SnoozeOption snoozeOption) {
mStatusBar.setNotificationSnoozed(sbn, snoozeOption);
}
StatusBar中有一个NotificationListenserService实例mNotificationListener。负责和NotificationManagerService跨进程(SystemServer)通信。NotificationListenserService中有一个内部类NotificationListernerWrapper实现了INotificationListener接口,这个才是具体实现。
StatusBar.java
//一般为null
if (snoozeOption.getSnoozeCriterion() != null) {
mNotificationListener.snoozeNotification(sbn.getKey(),
snoozeOption.getSnoozeCriterion().getId());
} else