Android7.1勿扰功能简析
- 屏幕开启时屏蔽:禁止在勿扰模式下被静音的通知在屏幕上短暂显示或弹出
- 屏幕关闭时屏蔽:禁止在勿扰模式下被静音的通知开启屏幕
<!-- Interruptions --><com.android.settingslib.RestrictedPreferenceandroid:key="zen_mode"android:title="@string/zen_mode_settings_title"settings:useAdminDisabledSummary="true"settings:keywords="@string/keywords_sounds_and_notifications_interruptions"android:fragment="com.android.settings.notification.ZenModeSettings" />
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"android:key="zen_mode_settings"android:title="@string/zen_mode_settings_title" ><!-- Priority only allows --><PreferenceScreenandroid:key="priority_settings"android:title="@string/zen_mode_priority_settings_title"android:fragment="com.android.settings.notification.ZenModePrioritySettings" /><!-- Automated rules --><PreferenceScreenandroid:key="automation_settings"android:title="@string/zen_mode_automation_settings_title"android:fragment="com.android.settings.notification.ZenModeAutomationSettings" /><!-- Visual interruptions --><PreferenceScreenandroid:key="visual_interruptions_settings"android:title="@string/zen_mode_visual_interruptions_settings_title"android:fragment="com.android.settings.notification.ZenModeVisualInterruptionSettings" />
</PreferenceScreen>
上面的布局文件和我们从手机上看到的勿扰设置界面一样。我们可以看出ZenModePrioritySettings 、ZenModeAutomationSettings 、ZenModeVisualInterruptionSettings分别对应着仅允许优先打扰内容、自动规则、屏蔽视觉打扰三种页面。
ZenModeSettings、ZenModePrioritySettings、ZenModeAutomationSettings 、ZenModeVisualInterruptionSettings都继承于ZenModeSettingsBase。我们来分别看一下这些类。
ZenModeSettings这个类,我们从代码中可以看出它只是三项设置界面的入口,以及对勿扰的更新做一些界面的显示工作。如下代码:
Settings/src/com/android/settings/notification/ZenModeSettings.java
@Overrideprotected void onZenModeChanged() {updateControls();}@Overrideprotected void onZenModeConfigChanged() {mPolicy = NotificationManager.from(mContext).getNotificationPolicy();updateControls();}private void updateControls() {updatePrioritySettingsSummary();updateVisualSettingsSummary();}private void updatePrioritySettingsSummary() {String s = getResources().getString(R.string.zen_mode_alarms);s = appendLowercase(s, isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_REMINDERS),R.string.zen_mode_reminders);s = appendLowercase(s, isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_EVENTS),R.string.zen_mode_events);if (isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_MESSAGES)) {if (mPolicy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) {s = appendLowercase(s, true, R.string.zen_mode_all_messages);} else {s = appendLowercase(s, true, R.string.zen_mode_selected_messages);}}if (isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_CALLS)) {if (mPolicy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) {s = appendLowercase(s, true, R.string.zen_mode_all_callers);} else {s = appendLowercase(s, true, R.string.zen_mode_selected_callers);}} else if (isCategoryEnabled(mPolicy, Policy.PRIORITY_CATEGORY_REPEAT_CALLERS)) {s = appendLowercase(s, true, R.string.zen_mode_repeat_callers);}mPrioritySettings.setSummary(s);}private void updateVisualSettingsSummary() {String s = getString(R.string.zen_mode_all_visual_interruptions);if (isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_ON)&& isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {s = getString(R.string.zen_mode_no_visual_interruptions);} else if (isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_ON)) {s = getString(R.string.zen_mode_screen_on_visual_interruptions);} else if (isEffectSuppressed(Policy.SUPPRESSED_EFFECT_SCREEN_OFF)) {s = getString(R.string.zen_mode_screen_off_visual_interruptions);}mVisualSettings.setSummary(s);}
我们再看ZenModePrioritySettings类,首先它负责自定义优先打扰的内容,其中包括闹钟、提醒、活动、消息、通话(仅限来自联系人)、重复来电者(如果同一个人在15分钟内第二次来电,则允许显示通知)。这面也仅是一些开关,将最后的更改用NotificationManager.from(mContext).setNotificationPolicy(mPolicy);进行保存,其中也只有消息和通话需要选择,我们来看一下通话的设置以及保存,其余的类似:
Settings/src/com/android/settings/notification/ZenModePrioritySettings.java
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.zen_mode_priority_settings);final PreferenceScreen root = getPreferenceScreen();mPolicy = NotificationManager.from(mContext).getNotificationPolicy();...mCalls = (DropDownPreference) root.findPreference(KEY_CALLS);addSources(mCalls);mCalls.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {if (mDisableListeners) return false;final int val = Integer.parseInt((String) newValue);final boolean allowCalls = val != SOURCE_NONE;final int allowCallsFrom = val == SOURCE_NONE ? mPolicy.priorityCallSenders : val;MetricsLogger.action(mContext, MetricsEvent.ACTION_ZEN_ALLOW_CALLS, val);if (DEBUG) Log.d(TAG, "onPrefChange allowCalls=" + allowCalls+ " allowCallsFrom=" + ZenModeConfig.sourceToString(allowCallsFrom));savePolicy(getNewPriorityCategories(allowCalls, Policy.PRIORITY_CATEGORY_CALLS),allowCallsFrom, mPolicy.priorityMessageSenders,mPolicy.suppressedVisualEffects);return true;}});...updateControls();}private void updateControls() {mDisableListeners = true;if (mCalls != null) {mCalls.setValue(Integer.toString(isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_CALLS)? mPolicy.priorityCallSenders : SOURCE_NONE));}mMessages.setValue(Integer.toString(isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_MESSAGES)? mPolicy.priorityMessageSenders : SOURCE_NONE));mReminders.setChecked(isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_REMINDERS));mEvents.setChecked(isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_EVENTS));mRepeatCallers.setChecked(isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_REPEAT_CALLERS));mRepeatCallers.setVisible(!isPriorityCategoryEnabled(Policy.PRIORITY_CATEGORY_CALLS)|| mPolicy.priorityCallSenders != Policy.PRIORITY_SENDERS_ANY);mDisableListeners = false;}private void savePolicy(int priorityCategories, int priorityCallSenders,int priorityMessageSenders, int suppressedVisualEffects) {mPolicy = new Policy(priorityCategories, priorityCallSenders, priorityMessageSenders,suppressedVisualEffects);NotificationManager.from(mContext).setNotificationPolicy(mPolicy);}
ZenModeVisualInterruptionSettings和ZenModePrioritySettings类似,只是换成了屏幕开启时屏蔽和屏幕关闭时屏蔽两个开关,所以就不分析了。我们看ZenModeAutomationSettings这个稍微不同的类。
在ZenModeSettingsBase中有一个mRules的集合,存储着用户自己定义的AutomaticZenRule,而mRules的值是NotificationManager中获取的的。也就是这里规则的维护存储也还是在NotificationManager中,如下代码。
Settings/src/com/android/settings/notification/ZenModeSettingsBase.java
abstract public class ZenModeSettingsBase extends RestrictedSettingsFragment {...protected Context mContext;protected Set<Map.Entry<String, AutomaticZenRule>> mRules;...private void updateZenMode(boolean fireChanged) {final int zenMode = Settings.Global.getInt(getContentResolver(), Global.ZEN_MODE, mZenMode);if (zenMode == mZenMode) return;mZenMode = zenMode;if (DEBUG) Log.d(TAG, "updateZenMode mZenMode=" + mZenMode);if (fireChanged) {onZenModeChanged();}}protected String addZenRule(AutomaticZenRule rule) {try {String id = NotificationManager.from(mContext).addAutomaticZenRule(rule);final AutomaticZenRule savedRule =NotificationManager.from(mContext).getAutomaticZenRule(id);maybeRefreshRules(savedRule != null, true);return id;} catch (Exception e) {return null;}}protected boolean setZenRule(String id, AutomaticZenRule rule) {final boolean success =NotificationManager.from(mContext).updateAutomaticZenRule(id, rule);maybeRefreshRules(success, true);return success;}protected boolean removeZenRule(String id) {final boolean success =NotificationManager.from(mContext).removeAutomaticZenRule(id);maybeRefreshRules(success, true);return success;}protected void maybeRefreshRules(boolean success, boolean fireChanged) {if (success) {mRules = getZenModeRules();if (DEBUG) Log.d(TAG, "Refreshed mRules=" + mRules);if (fireChanged) {onZenModeConfigChanged();}}}protected void setZenMode(int zenMode, Uri conditionId) {NotificationManager.from(mContext).setZenMode(zenMode, conditionId, TAG);}private Set<Map.Entry<String, AutomaticZenRule>> getZenModeRules() {Map<String, AutomaticZenRule> ruleMap= NotificationManager.from(mContext).getAutomaticZenRules();return ruleMap.entrySet();}...
}
知道上面的东西,ZenModeAutomationSettings就简单多了,就是mRules列表的展示,以及添加删除等操作。只是这里面添加可以选择两种模式,分别是活动规则和时间规则。分别对应的类是ZenModeEventRuleSettings和ZenModeScheduleRuleSettings,他们都继承自ZenModeRuleSettingsBase。这里ZenModeAutomationSettings虽然代码很多,但都是各种弹出框的操作,就不分析了。主要看看活动规则和时间规则这两个里面分别又有哪些操作吧。
时间规则的列表,分别有规则名称、星期几、开始时间、结束时间、勿扰、闹钟响铃时间可覆盖结束时间(在所设结束时间或下一次闹钟响铃时(两者选其先)停止)。由private ScheduleInfo mSchedule;中来存储着时间规则的一些数据。
活动规则的页面的列表,分别是名字、在以下日历活动期间、回复内容如下的活动、勿扰。由private EventInfo mEvent;中来存储着时间规则的一些数据。以上两个规则里面其余都只是进行一些修改操作。这些操作最后的修改的数据都会通过调用ZenModeRuleSettingsBase里面的updateRule()方法保存到NotificationManager里。代码如下:
Settings/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
mStart = new TimePickerPreference(getPrefContext(), mgr);mStart.setKey(KEY_START_TIME);mStart.setTitle(R.string.zen_mode_start_time);mStart.setCallback(new TimePickerPreference.Callback() {@Overridepublic boolean onSetTime(final int hour, final int minute) {if (mDisableListeners) return true;if (!ZenModeConfig.isValidHour(hour)) return false;if (!ZenModeConfig.isValidMinute(minute)) return false;if (hour == mSchedule.startHour && minute == mSchedule.startMinute) {return true;}if (DEBUG) Log.d(TAG, "onPrefChange start h=" + hour + " m=" + minute);mSchedule.startHour = hour;mSchedule.startMinute = minute;updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));return true;}});
Settings/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
protected void updateRule(Uri newConditionId) {mRule.setConditionId(newConditionId);setZenRule(mId, mRule);}protected boolean setZenRule(String id, AutomaticZenRule rule) {final boolean success =NotificationManager.from(mContext).updateAutomaticZenRule(id, rule);maybeRefreshRules(success, true);return success;}
自此所有在Setting里面的勿扰模式的代码分析结束了,综上可知,Settings模块中勿扰只是一个界面的展示,其数据都放在NotificationManager进行管理操作。
Android7.1勿扰功能简析相关推荐
- android 勿扰代码,Android7.1勿扰功能简析
Android系统在5.1系统开始增加勿扰模式,渐渐的有着取代静音模式的趋势,最新的系统已经更新到7.1.1,我们来看一下最新的原生勿扰有哪些功能. 首先在屏幕下滑出来的快捷开关界面中,我们可以看到勿 ...
- Windows Vista系统自带刻录功能简析
Windows Vista系统自带刻录功能简析 我们知道Windows XP系统自带CD刻录功能,但遗憾的是功能较简陋,且无法支持DVD刻录.在微软最新推出的Windows Vista操作系统中,自带 ...
- 钉钉新增“下班勿扰”功能:次日上班前不接受任何消息!
3月22日消息,今天,钉钉6.5版本"玉珠峰"正式对外发布,聚焦于组织需求与员工需求的共生.新版本对产品框架进行了重新设计,并推出了超过50项关注员工体验与创造的产品功能. 据悉, ...
- esp32 Flash分区与OTA功能简析
升级功能对于所有的嵌入式产品都是非常重要的.尤其是当产品量产/销售阶段,已经没有条件让厂家对产品升级,因此升级方式的设计必须防呆防错以及稳定. 乐鑫ESP32作为蓝牙WIFI合一的物联网芯片,开发成产 ...
- 记录--实时音视频功能简析(live-pusher与live-player)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 使用须知 2017年下半年,微信6.5.21版本支持在线音视频功能.开发者可以通过两个音视频组件 和 实现实时地在线直播.视频通话.语音通 ...
- OCR文字识别 证件识别功能简析
OCR技术是光学字符识别的缩写(Optical Character Recognition),是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,技术支持百度搜索OC ...
- [RK3399][Android7.1]勿扰模式的默认设置修改
需求是要求固件默认关闭优先打扰内容里边所有选项,删除自动规则里边的所有内容 开始以为是在默认设置里边修改,后面发现这个配置使用的是/data/system/notification_policy.xm ...
- android 勿扰模式代码结构简析
勿扰模式代码结构简析 标签: 勿扰模式 2017-08-08 11:05 60人阅读 评论(0) 收藏 举报 分类: android(59) 版权声明:本文为博主原创文章,未经博主允许不 ...
- 勿扰模式代码结构简析
勿扰模式是Android 7.0开始加入的功能.它的核心思想是屏蔽了通知的铃声.振动和展示. 代码分散在几部分. 1.设置代码在Settings中,ZenMode开头的一系列文件 /packages/ ...
最新文章
- sap 给集团分配一个逻辑系统
- 用友现存量和可用量_护肤品用量不对,不仅变相浪费还有可能……
- 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client
- 标准库类型String,Vector
- poj--2019 Cornfields 2维RMQ
- 求单链表结点的阶乘和
- Python基础学习8 函数
- 2021年,Web前端还好找工作吗?
- java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...
- 不要让你的不主动,耽误了你的人脉
- jmx 监控java程序_监控Java Web应用程序 – JMX是正确的选择吗?
- php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法
- 找不到所需的 Adobe Flash Player 调试器版本
- oracle打印awr报告,oracle生成awr报告
- ubuntu + gcc-linaro-交叉编译环境搭建
- 机器学习Machine Learning
- uvm event 事件机制
- 鸿蒙系统跑分,麒麟9000+8GB内存 首发鸿蒙系统华为MatePad Pro2跑分首次曝光
- 孙溟㠭篆刻作品《叶》
- 我的世界服务器武器修改伤害,我的世界改伤害指令 | 手游网游页游攻略大全