当手动向上滑掉下拉的消息推送下拉框的时候,再次接收消息,在控制台打出这样的Log:
...............D/StatusBar: updateNotification...............
...............D/StatusBar: No peeking: snoozed package:...............
查找StatusBar.java源码,找到
protected boolean shouldPeek(Entry entry, StatusBarNotification sbn){
..........
if (isSnoozedPackage(sbn)) {
if (DEBUG) Log.d(TAG, "No peeking: snoozed package: " + sbn.getKey());
return false;
}
..........
}
protected boolean isSnoozedPackage(StatusBarNotification sbn) {
return mHeadsUpManager.isSnoozed(sbn.getPackageName());
}
转到HeadsUpManager.java源码:
public boolean isSnoozed(String packageName) {
final String key = snoozeKey(packageName, mUser);
Long snoozedUntil = mSnoozedPackages.get(key);
if (snoozedUntil != null) {
if (snoozedUntil > SystemClock.elapsedRealtime()) {
if (DEBUG) Log.v(TAG, key + " snoozed");
return true;
}
mSnoozedPackages.remove(packageName);
}
return false;
}
mSnoozedPackages 是 ArrayMap<String, Long> ,在往下寻找给它设置值的地方
public void snooze() {
for (String key : mHeadsUpEntries.keySet()) {
HeadsUpEntry entry = mHeadsUpEntries.get(key);
String packageName = entry.entry.notification.getPackageName();
mSnoozedPackages.put(snoozeKey(packageName, mUser),
SystemClock.elapsedRealtime() + mSnoozeLengthMs);
}
mReleaseOnExpandFinish = true;
}
mSnoozeLengthMs赋值的地方在HeadsUpManager的构造方法中:
mDefaultSnoozeLengthMs = resources.getInteger(R.integer.heads_up_default_snooze_length_ms);
mSnoozeLengthMs = mDefaultSnoozeLengthMs;
mMinimumDisplayTime = resources.getInteger(R.integer.heads_up_notification_minimum_time);
mHeadsUpNotificationDecay = resources.getInteger(R.integer.heads_up_notification_decay);
mSnoozeLengthMs = Settings.Global.getInt(context.getContentResolver(),
SETTING_HEADS_UP_SNOOZE_LENGTH_MS, mDefaultSnoozeLengthMs);
翻阅FrameWork:
D:\google_sample\platform_frameworks_base-master\packages\SystemUI\res\values\config.xml
<!-- milliseconds after a heads up notification is pushed back
before the app can interrupt again. -->
<integer name="heads_up_default_snooze_length_ms">60000</integer> //1分钟
所以当我们手动上滑掉消息推送下拉框的时候,会延迟1分钟后,再接收消息才会弹出推送下拉框
我们也可从另外一个角度分析:
查看下拉框:
查看NotificationPanelView.java源码,很明显可以看到这个方法:
@Override
protected void flingToHeight(float vel, boolean expand, float target,
float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) {
mHeadsUpTouchHelper.notifyFling(!expand);
setClosingWithAlphaFadeout(!expand && getFadeoutAlpha() == 1.0f);
super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing);
}
public void notifyFling(boolean collapse) {
if (collapse && mCollapseSnoozes) {
mHeadsUpManager.snooze();
}
mCollapseSnoozes = false;
}
public void snooze() {
for (String key : mHeadsUpEntries.keySet()) {
HeadsUpEntry entry = mHeadsUpEntries.get(key);
String packageName = entry.entry.notification.getPackageName();
mSnoozedPackages.put(snoozeKey(packageName, mUser),
SystemClock.elapsedRealtime() + mSnoozeLengthMs);
}
mReleaseOnExpandFinish = true;
}