| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 |
情景模式(IntelligentScene)
简介
情景模式(包名:com.ohos.intelligentscene)是 OpenHarmony 中预置的 系统应用。它按具体使用场景(免打扰、睡眠、学习等)分别维护一套「情景模式」:管理通知与来电策略、定时等自动开启条件,以及情景模式生效后与系统设置项(如深色模式)的联动,并适配手机、平板设备形态。
本应用为系统预置应用,需通过系统参数 const.intelligentscene.enable=true 开启后相关能力才会生效。用户可通过「设置 → 情景模式」或控制中心二级页进入。
核心能力
情景模式状态管理
- 支持预置情景模式:免打扰、睡眠、学习等,并支持自定义情景模式。
- 通过
StateManager完成情景模式的开启/关闭状态机,并把「当前已开启的情景模式」写入系统 SettingsData,供设置、控制中心等进程读取。
免打扰
- 管理某情景模式生效时的通知勿扰策略:允许通知的应用白名单、声音振动白名单、联系人允许/拦截、重复来电、拒接等来电策略。
- 通过
NotDisturbAdapter/NotDisturbTimerManager把勿扰(Focus)策略下发给系统通知服务,并管理勿扰定时。
设置联动
- 情景模式开启后,按该模式已配置的联动项修改系统设置(例如深色模式),并处理实况通知展示。
- 通过
SettingLinkageManager管理每项联动设置的状态机。
激活管理
- 用户在情景模式详情里配置「触发条件 → 开启哪个情景模式」。条件经
ActivationManager落库并生效后,到点或满足条件时自动开启对应情景模式。 - 条件触发典型包括:
- 时间条件:例如每天 22:00~次日 7:00 自动开启睡眠情景模式;
- 临时时间条件:例如「 1 小时」临时开启免打扰;
配置业务
- 本机当前开启状态:本应用持久化的运行态,记录「当前开启了哪个情景模式、如何开启、由哪条条件触发」。数据模型为
CurrentOpenedMode(关闭时modeId为'0'),由LocalSceneManager读写。启停流程据此做进程恢复(重启后仍知上次开启态)与冲突处理(例如开启新模式时如何处理已开启模式)。 - 允许打扰配置:某情景模式开启勿扰时,仍可正常响铃/弹通知的应用与联系人白名单;见
AllowDisturbManager。 - 联系人策略配置:来电允许/拦截名单等;见
ContactAdapter。
情景模式配置
- 为各预置情景模式提供模板配置(经
ModeConfigAdapter按modeId取对应配置类,如睡眠SleepModeConfig;自定义模式走默认BaseModeConfig):包括默认能力开关(是否支持勿扰),以及设置首页哪些设置分组默认展示(例如学习模式默认展示「开启方式」「允许打扰」等分组)。
数据管理
- 管理本应用的数据模型并落库,包括:
- 情景模式实体(名称、图标、是否可删除等,
MODE_DATA_TABLE); - 配置项(某情景模式下的勿扰策略、联动设置、触发条件等,
MODE_CONFIG_DATA_TABLE); - 联系人策略(
CONTACT_DATA)等。
- 情景模式实体(名称、图标、是否可删除等,
- 使用 本应用自有 的关系型数据库(OpenHarmony RDB)
IntelligentScene.db(加密等级 S2,见common的DbConfig/RDB_STORE_CONFIG)。跨进程共享的状态则另写系统 SettingsData。
预置情景模式说明
预置模式以 modeId 区分(见 ModeModel.ModeType):免打扰 '1'、睡眠 '2'、学习 '3'。三者均支持勿扰与设置首页「条件开启 / 允许打扰 / 关联系统功能」等通用分组;差异主要在默认模板与产品定位。
| 对比项 | 免打扰(modeId=1) |
睡眠(modeId=2) |
学习(modeId=3) |
|---|---|---|---|
| 定位 | 减少通知/来电打扰,保持专注 | 夜间安静休息 | 学习时段聚焦 |
| 能否删除 | 不可删 | 不可删 | 可删 |
| 默认定时条件 | 无默认定时 | 每日 23:00~07:00(默认关闭) | 工作日 8:00~12:00、14:00~18:00(默认关闭) |
| 默认来电策略 | 允许收藏联系人 | 禁止所有人 | 允许收藏联系人 |
| 默认通知策略 | 禁止通知(可配白名单) | 同左 | 同左 |
| 默认系统联动 | 不关联 | 关联开启深色模式 | 不关联 |
用户可配置(三模式通用,设置详情页)
- 条件开启:时间条件、临时时长等,用于自动启停。
- 允许打扰:通知应用白名单;来电策略(禁止所有人 / 允许所有人 / 已有联系人 / 收藏联系人)及指定联系人名单;重复来电等。
- 关联系统功能:如深色模式联动(关联开启 / 关联关闭 / 不关联)。
限制说明
- 同一时刻通常只生效一个情景模式;开启新模式时由
StateManager做冲突与切换。 - 情景模式本身不直接拦截来电,而是把策略同步给系统通话侧(见下节)。
来电免打扰通路
来电是否响铃/接通由系统 CallUI / 通话服务 判决;本应用负责策略配置、落库与跨进程同步。
用户配置来电策略 / 名单
→ AllowDisturbManager / ContactManager 写入 RDB
(CALL_NOT_DISTURB_POLICY、CONTACT_DATA.focus_mode_list)
→ 情景模式开启时 StateManager:
· 写 SettingsData:focus_mode_profile、focus_mode_enable、
focus_mode_call_message_policy、focus_mode_repeate_callers_enable 等
(注:repeate 为源码历史拼写,非 repeat;读写须与源码键名一致)
· 通知侧 addDoNotDisturbProfile(默认信任含 com.ohos.callui)
· ContactAdapter 发布 DataShare URI(intelligent_scene_data / intelligent_uri)
→ CallUI:
· 读 SettingsData:判断「当前是否开启勿扰 / 开启的是哪个情景模式 /
来电策略是哪种 / 是否允许重复来电响铃」
· 当策略为「指定联系人」时,再查 CONTACT_DATA:
按当前 modeId 取出号码列表,与来电号码比对后决定放行或拦截
| 步骤 | 本应用动作 | 关键类 / 键 |
|---|---|---|
| 1. 配置策略 | 策略写入 MODE_CONFIG_DATA(ConfigType.CALL_NOT_DISTURB_POLICY)及 EL1 |
AllowDisturbManager |
| 2. 配置名单 | 指定联系人号码写入 CONTACT_DATA(focus_mode_list=1/2) |
ContactManager、ContactAdapter |
| 3. 模式开启 | 写当前模式与勿扰开关;把 EL1 策略刷到 focus_mode_call_message_policy |
StateManager.updateIncomingConfig |
| 4. 系统侧生效 | CallUI 先读 SettingsData 定策略,必要时再查本应用 DataShare 名单 | SettingsData + DataExtAbility |
CallUI 侧读数含义(具象)
| 读取来源 | 典型键 / 字段 | 用来做什么 |
|---|---|---|
| SettingsData | focus_mode_enable |
当前情景模式勿扰是否开启;未开启则按正常来电处理 |
| SettingsData | focus_mode_profile |
当前生效的情景模式 modeId(关闭时常为 '0') |
| SettingsData | focus_mode_call_message_policy |
来电策略枚举(禁止所有人 / 允许收藏等),决定后续查通讯录还是查本应用名单 |
| SettingsData | focus_mode_repeate_callers_enable |
短时间内重复来电是否仍允许响铃。(注:键名中 repeate 为源码历史拼写,非 repeat,对接时须按此键读写) |
CONTACT_DATA(DataShare) |
modeId + focus_mode_list + detail_info / format_phone_number |
仅当策略为指定联系人时需要:取出该模式下允许或拦截的号码,与本次来电号码比对 |
策略取值示意:1 禁止所有人、2 允许所有人、3 仅已有联系人、4 仅收藏、5 指定联系人。策略为 1~4 时,CallUI 主要结合 SettingsData 与系统通讯录判决;策略为 5 时才依赖 CONTACT_DATA 名单。
架构说明
情景模式采用分层与模块化设计,按产品形态、业务特性与公共能力组织代码,如图:

应用层分层设计
整体划分为产品层(product)、特性层(feature)、公共层(common):
| 层次 | 主要目录 | 说明 |
|---|---|---|
| 产品层 | product/phone |
手机/平板 同一 HAP 入口:声明 Ability / UIExtension / Service;承载设置首页、情景模式详情、控制中心二级页、免打扰相关页面等 UI;实现 IPC Stub、静态订阅者。修改入口 UI 时主要改这一层。 |
| 特性层 | feature/* |
与「一种业务能力」一一对应的 HAR:情景模式启停、勿扰、联动、条件激活、配置读写、预置模板、RDB 业务表访问等。修改某条业务链路时主要改对应 feature。 |
| 公共层 | common |
多模块共用的基建,不直接表述某条用户功能:EventBus、通用列表项/弹框、本应用 RDB 封装、日志、PermissionVerifyUtil IPC 校验等。跨特性复用时修改这一层。 |
产品层模块说明(product/phone)
| 核心能力 | 模块 / 目录 | 说明 |
|---|---|---|
| 应用入口 | entryability/ |
EntryAbility 全屏入口;IntelligentSceneUIExtSettingAbility 供 设置 嵌入;SceneControlUIExtAbility 供 控制中心 拉起二级页等。 |
| 常驻服务 | serviceability/ |
IntelligentSceneServiceExtAbility 常驻服务;DataExtAbility 提供 DataShare URI。 |
| 设置首页 | pages/settinghome/ |
「设置 → 情景模式」中的列表、详情与编辑页。 |
| 控制中心 | pages/controlcenter/ |
控制中心情景模式二级页(快速开关列表、「更多设置」跳转等)。 |
| 免打扰 | pages/nodisturb/ |
允许通知应用、联系人策略、来电策略等免打扰相关页面。 |
特性层模块说明(feature/*)
| 核心能力 | 模块 / 目录 | 说明 |
|---|---|---|
| 情景模式状态管理 | StateManager(statemanage) |
开启/关闭指定 modeId 的情景模式;更新本地当前开启态;写 SettingsData(如 focus 相关键);串联勿扰与设置联动 |
| 免打扰 | NotDisturbAdapter、NotDisturbTimerManager(notdisturb) |
向通知服务同步勿扰 Profile、定时勿扰 |
| 设置联动 | SettingLinkageManager(configlinkage) |
情景模式生效后应用深色模式等系统设置,并处理实况通知 |
| 激活管理 | ActivationManager(activationmanage) |
管理用户配置的时间/应用等自动开启条件,到点或满足条件时触发情景模式启停 |
| 配置业务 | LocalSceneManager、AllowDisturbManager、ContactAdapter(configmanage) |
本机当前开启态、允许打扰白名单、联系人策略的读写与生效 |
| 情景模式配置 | ModeConfigAdapter(modeconfig) |
预置情景模式默认能力与首页分组可见性 |
| 数据管理 | ModeDataManager、ConfigDataManager(datamanage) |
情景模式实体、配置项、联系人等模型及 IntelligentScene.db 访问 |
公共层模块说明(common)
| 核心能力 | 模块 / 目录 | 说明 |
|---|---|---|
| 工具/常量 | constant/、utils/ |
业务常量:ModeConstant(情景模式 modeId、启停态)、DbConfig(IntelligentScene.db 库名与表字段)、EventBusNameConstant 等;通用工具:SettingsDataUtils、JsonUtil、设备形态判断等 |
| RDB | rdbstore/ |
本应用库访问层:RdbStoreHelper 打开 EL2 IntelligentScene.db(及备份库)执行建表、增删改查、备份恢复与损坏处理 |
| EventBus | common/EventBus |
进程内事件总线(on/emit/detach),在设置项开关、半模态关闭等场景传递状态 |
| IPC Stub | stub/ |
IPC Stub 基类 BaseServiceStub,供 product 侧具体 Service Stub 继承并做鉴权分发 |
| UI基建 | basecomponent/、framework/ |
页面级可复用控件(ConfirmDialogComponent、PromptManager Toast、链接文案与符号图标等);设置详情页基建(PageRouter/PageLoader、SettingPage/SettingItemStandard/SettingGroup/SettingSheet/SettingDialog 及状态模型) |
| 日志/权限 | utils/LogUtil、utils/PermissionVerifyUtil |
统一日志输出;IPC 调用方白名单校验 |
与其它应用的关系
允许系统侧应用通过 Want / UIExtension / Service 拉起本应用的已导出组件(EntryAbility、IntelligentSceneUIExtSettingAbility、SceneControlUIExtAbility、IntelligentSceneServiceExtAbility 等 exported=true)。前提:本应用已安装,且 const.intelligentscene.enable=true。Service / IPC 调用方须通过 PermissionVerifyUtil 白名单(例如 com.ohos.sceneboard)。
面向普通三方应用:不提供开放 Want / 业务 IPC。 系统侧拉起 UIExtension / Service / DataShare 仍按下方表格鉴权。另提供 BasicServicesKit 只读查询接口,供应用查询免打扰状态(见下表「Kit 查询 API」)。
对外接口一览
| 接口形态 | 组件 / 标识 | 适用对象 | 典型场景 | 鉴权要求 |
|---|---|---|---|---|
| UIExtension(设置嵌入) | IntelligentSceneUIExtSettingAbility |
系统应用(设置) | 「设置 → 情景模式」完整配置页 | 调用方需 ACCESS_SYSTEM_SETTINGS;通常由设置宿主拉起 |
| UIExtension(控制中心) | SceneControlUIExtAbility |
系统应用(SceneBoard) | 控制中心二级页快速开关 | 同上 |
| UIAbility 全屏入口 | EntryAbility |
系统 / 桌面入口 | 独立全屏打开情景模式 | exported=true,一般经桌面/设置跳转 |
| 系统确认弹框(UIExtension) | ModeEnableConfirmDialogUIExtAbility |
系统应用 | 开启情景模式确认框 | ACCESS_SYSTEM_SETTINGS |
| Kit 查询 API | intelligentScene.isDoNotDisturbEnabled() |
应用(含三方,需声明权限) | 查询系统免打扰是否已开启(任一情景模式开启勿扰时为 true) | ohos.permission.GET_DONOTDISTURB_STATE |
| Kit 查询 API | intelligentScene.isNotifyAllowedInDoNotDisturb() |
应用(含三方,需声明权限) | 免打扰开启时,查询当前应用是否在允许打扰名单内(未开启免打扰时返回 false) | ohos.permission.GET_DONOTDISTURB_STATE |
intelligentScene 模块从 @kit.BasicServicesKit 导入,仅提供上述只读查询,不能通过该 API 修改情景模式或免打扰配置。接口细节、错误码与示例见:
js-apis-intelligentScene(情景模式)
按场景说明:
| 场景 | 说明 |
|---|---|
| 用户进入「设置 → 情景模式」完整配置 | 设置应用在本机安装情景模式且特性开关打开时,以 UIExtension 拉起 IntelligentSceneUIExtSettingAbility(或 Want,uri: intelligent_scene_entry 等)展示设置首页/详情 |
| 用户在控制中心打开情景模式面板 | SceneBoard在满足同样安装/开关条件时,以 UIExtension 拉起 SceneControlUIExtAbility,展示快速开关列表;点「更多设置」再跳转设置入口 |
| 桌面/系统需要读写跨进程共享状态 | 设置、控制中心、桌面等通过系统 SettingsData(@ohos.settings / DataShare)读写本应用写入的键(如 focus 相关、当前情景模式状态);本应用侧封装见 SettingsDataUtils、SettingsDataKeyConstant |
| 系统受信组件访问常驻能力或 DataShare | 白名单包名绑定 Service(IntelligentSceneServiceExtAbility)或访问 DataShare(DataExtAbility);未通过校验的调用方会被拒绝 |
DataShare 配置与接入本应用 RDB
本应用通过 DataExtAbility(基于 DataShareExtensionAbility)把部分 RDB 表以 DataShare 形式对外只读暴露,供系统通话、设置等查询。接入指南见:通过 DataShareExtensionAbility 实现数据共享。配置见:
- Ability:
product/phone/src/main/module.json5(uri: datashare://com.ohos.intelligentscene.DataAbility,readPermission/writePermission为ohos.permission.MANAGE_SECURE_SETTINGS) - 表 URI:
product/phone/src/main/resources/base/profile/data_share_config.json - 实现:
product/phone/src/main/ets/serviceability/DataExtAbility.ets(当前以 query 为主)
| 表 | DataShare URI | 库位置 | 用途 |
|---|---|---|---|
MODE_DATA_TABLE |
datashare:///com.ohos.intelligentscene/phone/IntelligentScene/MODE_DATA_TABLE |
EL1 | 情景模式实体 |
MODE_CONFIG_DATA_TABLE |
.../MODE_CONFIG_DATA_TABLE |
EL2 IntelligentScene.db |
各模式配置项 |
CONTACT_DATA |
.../CONTACT_DATA |
EL2 | 指定联系人号码 |
MODE_HISTORY_DATA_TABLE |
.../MODE_HISTORY_DATA_TABLE |
EL1 | 历史数据 |
另提供 datashareproxy://com.ohos.intelligentscene/... 代理 URI(module.json5 的 proxyData),读写权限同样要求 MANAGE_SECURE_SETTINGS。
系统侧接入步骤(示意)
- 调用方为系统应用,并申请 / 被授予
ohos.permission.MANAGE_SECURE_SETTINGS。 - 使用
@ohos.data.dataShare创建 DataShareHelper,URI 指向上表(查询时 URI 常带?Proxy=true,与本应用解析约定一致)。 - 按表字段构造谓词查询,例如按
modeId、focus_mode_list查CONTACT_DATA。 - 来电名单场景也可先读 SettingsData 中的
intelligent_scene_data/intelligent_uri(由ContactAdapter.init发布),再访问对应 DataShare。
普通三方应用无法接入:缺少系统权限,且无开放业务 API。
相关概念与术语
阅读本仓说明时,下列系统模块概念可对照官方文档:
| 概念 / 术语 | 在本应用中的用途 | 参考文档 |
|---|---|---|
SettingsData / @ohos.settings |
跨进程同步当前情景模式、勿扰启停及来电策略等键 | @ohos.settings(设置数据项) |
| DataShare | 对外暴露情景模式 RDB 表(来电名单等)供系统查询 | dataShare API、DataShare 共享指南 |
| DataShareExtensionAbility | DataExtAbility 提供方实现基类 |
DataShareExtensionAbility |
| RDB / relationalStore | 本机 IntelligentScene.db 持久化情景模式与配置 |
@ohos.data.relationalStore |
| Notification / 勿扰 Profile | 情景模式开启勿扰时向通知服务下发 Profile 与白名单 | notificationManager(系统 API) |
| UIExtension | 设置 / 控制中心嵌入情景模式页面 | UIExtension 组件、UIExtensionAbility |
| UIAbility | 全屏入口 EntryAbility |
UIAbility |
| Want | 系统侧拉起本应用 Ability / Extension 的意图参数 | Want |
| ServiceExtensionAbility | 常驻服务 IntelligentSceneServiceExtAbility |
ServiceExtensionAbility |
| Stage 模型 | 本应用基于 Stage 的 Ability / Extension 运行形态 | Stage 模型开发概述 |
编译构建
本工程为多模块 HAP 应用工程,使用 Hvigor 构建,产物为 com.ohos.intelligentscene 系统应用包。
环境要求
- OpenHarmony SDK(本工程
compileSdkVersion为 "26.0.0",compatibleSdkVersion/targetSdkVersion为 23) - DevEco Studio 或命令行 Hvigor 工具链
- 系统签名证书(见
signature/)
编译命令
在工程根目录执行:
# 使用 DevEco Studio 打开工程后执行 Build,或使用 hvigor 命令行
hvigorw assembleHap
情景模式开发
情景模式采用 ArkTS 语言开发,UI 基于 ArkUI Stage 模型。应用通过 product 承载 Ability 入口与页面,通过特性层完成情景模式状态、免打扰、联动等业务,并通过 common 提供公共基建。
基于已有模块的开发
适用场景:对已有能力做功能定制,例如调整情景模式启停逻辑、扩展勿扰白名单策略、修改控制中心/设置页交互、优化联动展示等。
明确改动点:按业务边界定位到 product/phone(入口与页面)、feature/statemanage(情景模式状态管理)、feature/notdisturb(免打扰)、feature/configlinkage(设置联动)、feature/activationmanage(激活管理)、feature/configmanage(配置业务)、feature/modeconfig(情景模式配置)、feature/datamanage(数据管理)或 common(公共能力)。
以下列举一些常见的修改场景:
场景1:修改情景模式启停链路
- 控制中心入口位于
product/phone/src/main/ets/pages/controlcenter/ControlCenterPage.ets - 状态机位于
feature/statemanage/src/main/ets/manager/StateManager.ets - 勿扰策略位于
feature/notdisturb/
例如,需在情景模式开启时新增自定义前置检查,可在 StateManager.startScene() 中添加相关逻辑:
// StateManager.ets — startScene 是情景模式开启流程入口
public startScene(modeId: string, operType: number, sourceType?: number, updateTime?: number): string {
// 【新增自定义前置检查】
if (!this.customPreCheck(modeId)) {
return '';
}
// 原有流程:状态校验 → 写入 SettingsData → 联动勿扰 / 系统设置
// ...
}
场景2:修改设置联动链路
- 联动管理位于
feature/configlinkage/src/main/ets/manager/SettingLinkageManager.ets - 实况通知相关能力位于同模块的 LiveView 管理逻辑中
例如,需在情景模式开启后补充一项系统设置联动,可在 SettingLinkageManager.effectModeLinkedSettings() 中扩展:
// SettingLinkageManager.ets — effectModeLinkedSettings 在情景模式生效时应用联动设置
public async effectModeLinkedSettings(modeId: string): Promise<void> {
LogUtil.showInfo(TAG, `effectModeLinkedSettings mode:${modeId}`);
let darkModeState: SettingsLinkageState = await SystemSettingManager.getSystemSettingByType(modeId,
ConfigType.SYSTEM_SETTINGS_DARK_MODE);
this.darkModeStateMachine.convertState(darkModeState);
let eyeProtectState: SettingsLinkageState = await SystemSettingManager.getSystemSettingByType(modeId,
ConfigType.SYSTEM_SETTINGS_EYE_PROTECT_MODE);
this.eyeProtectStateMachine.convertState(eyeProtectState);
// 【新增自定义联动】例如扩展一项系统设置联动状态机转换
// let customState: SettingsLinkageState = await SystemSettingManager.getSystemSettingByType(
// modeId, ConfigType.YOUR_CUSTOM_SETTING);
// this.customStateMachine.convertState(customState);
}
场景3:修改配置 / 数据
- 预置情景模式配置位于
feature/modeconfig/ - 业务配置位于
feature/configmanage/ - 数据访问位于
feature/datamanage/
例如,若需调整预置情景模式默认可见性,可在 ModeConfigAdapter.getGroupVisible() 中修改:
// ModeConfigAdapter.ets — getGroupVisible 控制设置首页某分组是否展示
public getGroupVisible(modeId: string, groupId: HomeGroupId): boolean {
const modeConfig: BaseModeConfig = this.getConfigByModeId(modeId);
if (groupId === HomeGroupId.INTELLIGENT_EXPERIENCE) {
return false;
}
// 【修改点】按业务需要调整分组可见性,例如强制显示某分组
// if (groupId === HomeGroupId.SYSTEM_FUNCTION) {
// return true;
// }
return modeConfig.supportGroupIdSet.has(groupId);
}
场景4:修改UI组件
- 设置首页、情景模式详情位于
product/phone/src/main/ets/pages/settinghome/ - 控制中心二级页位于
product/phone/src/main/ets/pages/controlcenter/ - 免打扰相关页面位于
product/phone/src/main/ets/pages/nodisturb/ - 通用弹框、列表项等位于
common/src/main/ets/
例如,控制中心页面组合标题栏、情景模式列表与「更多设置」:
// ControlCenterPage.ets — 控制中心二级页组合
@Component
struct ControlCenterPage {
build() {
Column() {
TitleBarComponent({ /* props */ })
ModeListComponent({ /* props */ })
BottomButtonComponent({
onButtonClick: () => {
this.jumpSettings();
},
})
}
}
}
常用修改入口:
| 目标 | 路径 |
|---|---|
| 设置首页 / 情景模式列表与详情 | product/phone/src/main/ets/pages/settinghome/ |
| 控制中心二级页 | product/phone/src/main/ets/pages/controlcenter/ |
| 免打扰 / 通知白名单 / 来电策略 UI | product/phone/src/main/ets/pages/nodisturb/ |
| 情景模式状态管理 | feature/statemanage/ |
| 免打扰 | feature/notdisturb/ |
| 设置联动 | feature/configlinkage/ |
| 激活管理 | feature/activationmanage/ |
| 配置业务 | feature/configmanage/ |
| 情景模式配置 | feature/modeconfig/ |
| 数据管理 | feature/datamanage/ |
| 调用方白名单 | common/src/main/ets/utils/PermissionVerifyUtil.ets |
新特性能力的开发
场景A:复用已有 feature(示意:新增「通勤」预置模式)
下面用 「新增一种可被时间条件自动开启的预置情景模式」(示意名:通勤模式)串起完整步骤,以及前后依赖关系。
说明:工程采用
product + feature + common结构,入口在product/phone。一般新业务落在已有 feature;若新增独立产品形态 HAP,再在product/下加目录并在build-profile.json5注册。
目标业务(示例)
希望用户能:在设置里看到「通勤模式」→ 配置「工作日 8:00 自动开启」→ 到点系统自动开启该情景模式(勿扰/联动等策略随该模式配置生效)。
因此需要同时具备:业务数据与启停链路、暴露给设置/控制中心的入口、用户可操作的 UI。三步对应这三条能力链路,顺序一般是 先业务 → 再入口 → 后 UI。
步骤1:扩展业务能力(在特性层写清「这个情景模式如何工作」)
| 要解决的问题 | 说明 |
|---|---|
| 系统要认识「通勤」这个情景模式实体 | 在 feature/modeconfig / feature/datamanage 增加预置 modeId、默认名称图标与默认配置模板,否则列表与 RDB 没有该模式 |
| 用户配置的时间条件要能自动开/关 | 条件经 feature/configmanage 落库后,还需通过 ActivationManager 生效;否则只写入本机库,不会到点触发 |
| 开启时要应用勿扰、联动 | 确认 StateManager.startScene(通勤 modeId) 能串联 notdisturb、configlinkage;若通勤有差异化策略,在对应 feature 扩展 |
操作顺序建议:
- 在特性层落实体与配置(
modeconfig、datamanage、configmanage)。 - 条件生效与启停走
activationmanage、statemanage。 - 若能力足够独立,也可新建
feature/xxxHAR,在build-profile.json5与product/phone/oh-package.json5声明依赖。 - 业务未通前不要先做完整 UI,否则页面只能空绑数据。
步骤2:配置 / 确认 Ability 入口(让系统应用能「找得到」本能力)
业务逻辑若在 HAR 内,设置/控制中心进程仍只会拉起 product 里声明的 Ability / UIExtension。因此要核对 product/phone/src/main/module.json5:
- 已有导出组件是否覆盖场景:全屏
EntryAbility、设置嵌入用IntelligentSceneUIExtSettingAbility、控制中心用SceneControlUIExtAbility、后台条件触发用的IntelligentSceneServiceExtAbility等。 - 新场景若需新的 UIExtension / Service,在此 声明 name、type、permissions、exported,否则外部 Want 无法拉起。
- 权限是否足够:例如读写 SettingsData 依赖
ACCESS_SYSTEM_SETTINGS等。
现有入口示意:
{
"module": {
"name": "phone",
"type": "entry",
"mainElement": "EntryAbility",
"deviceTypes": [
"default",
"tablet"
],
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"exported": true
}
],
"extensionAbilities": [
{
"name": "IntelligentSceneUIExtSettingAbility",
"srcEntry": "./ets/entryability/IntelligentSceneUIExtSettingAbility.ets",
"type": "sys/commonUI"
},
{
"name": "SceneControlUIExtAbility",
"srcEntry": "./ets/entryability/SceneControlUIExtAbility.ets",
"type": "sys/commonUI"
},
{
"name": "IntelligentSceneServiceExtAbility",
"srcEntry": "./ets/serviceability/IntelligentSceneServiceExtAbility.ets",
"type": "service"
}
]
}
}
步骤3:定制 UI(用户看见并配置步骤1 的业务)
在业务数据与 Ability 可达之后,再改 product 页面,把通勤模式暴露给用户,例如:
| UI | 位置 | 用途 |
|---|---|---|
| 设置首页情景模式列表增加「通勤」卡片 | pages/settinghome/ |
进入详情、总开关 |
| 条件开启页可配置工作日 8:00 | 条件相关 sheet / configmanage 对接页 |
写入时间条件并使自动开启生效 |
| 控制中心列表展示通勤开关 | pages/controlcenter/ |
快速启停 |
| 若有独立勿扰白名单页 | pages/nodisturb/ |
配置允许谁打扰 |
新增独立页面时:
- 在
product/phone/src/main/ets/pages/下新增页面文件; - 若需要系统路由注册,在
resources/base/profile/main_pages.json中声明; - 由 Navigation / Want / 设置页跳转链路拉起。
三步关系小结:步骤1 决定「自动 8:00 开启」是否真能发生;步骤2 决定设置/控制中心能否进入本应用;步骤3 决定用户如何配置与查看。缺任一步都会出现「有页面无生效」「有逻辑进不去」「有入口无数据」等问题。
上例主要复用已有 feature(
modeconfig/datamanage/activationmanage/statemanage等)。若新能力无法归入现有 HAR 边界,需按下面「新增 feature」场景落地。
场景B:需要新增 feature HAR(示意:地理围栏自动开启)
适用:业务边界独立、与现有「状态 / 勿扰 / 联动 / 激活 / 配置 / 数据」职责都不贴合,或会引入新的系统 Kit、独立状态机与对外回调时。例如「进入公司/学校地理围栏自动开启某情景模式」——条件采集、围栏监听与触发形态都不同于现有时间条件,不宜硬塞进 activationmanage。
| 步骤 | 做什么 | 说明 |
|---|---|---|
| 1. 新建 HAR | 在 feature/ 下新增目录(如 feature/geofence/),编写 Index.ets、业务 Manager/Adapter |
在 build-profile.json5 注册模块;在 product/phone/oh-package.json5(及依赖方)声明 @ohos/scene.geofence |
| 2. 定义对外 API | 导出如 GeofenceManager.addFence() / onFenceTriggered() |
由 statemanage 或 activationmanage 依赖调用,避免 product 直接堆业务 |
| 3. 数据与权限 | 若需新表,在 datamanage/DbConfig 扩展或本 HAR 内封装;申请定位等相关系统权限 |
跨进程状态仍优先走 SettingsData;名单类可评估是否进 DataShare |
| 4. 接入启停 | 围栏触发后调用 StateManager.startScene(modeId, ...) |
勿扰/联动仍复用现有 feature,新 HAR 只负责「何时触发」 |
| 5. UI 与入口 | 在 product/phone 增加围栏配置页;必要时扩展 module.json5 Ability |
UI 只依赖新 HAR 的导出接口 |
与「通勤模式」示例的差异:通勤主要扩预置 modeId + 复用时间条件激活;地理围栏则是新触发源与新模块,必须新增 feature,再被现有启停链路消费。
选择建议:
- 只改某条已有链路(启停、勿扰、联动、配置、UI)→ 走上文「基于已有模块的开发」。
- 新预置模式但触发/策略仍复用现有能力 → 走「场景:通勤模式」三步。
- 新触发源、新 Kit、独立生命周期 → 新增 feature HAR。
目录
applications_intelligentscene
├─AppScope # 应用级配置与多语言资源
│ ├─app.json5 # bundleName、版本号等
│ └─resources/ # 全局字符串 / 图标等资源
├─common # 公共层(跨特性基建)
│ └─src/main/ets/
│ ├─basecomponent/ # 通用 UI 组件:确认弹框、Toast、链接文案、符号图标
│ ├─constant/ # 业务常量:ModeConstant(modeId/启停)、SettingsData键、DbConfig表字段、EventBus事件名等
│ ├─framework/ # EventBus状态分发;PageRouter导航;SettingPage/Item/Group/Sheet/Dialog设置页控件
│ ├─rdbstore/ # RdbStoreHelper(EL2 IntelligentScene.db)/El1RdbStoreHelper:打开建表、增删改查、备份恢复
│ ├─utils/ # LogUtil、PermissionVerifyUtil白名单、SettingsDataUtils等
│ └─stub/ # BaseServiceStub(IPC Stub基类,供product侧继承)
├─feature # 特性层
│ ├─statemanage/ # 情景模式开启/关闭状态机、写SettingsData
│ ├─notdisturb/ # 勿扰Profile/通知白名单、定时勿扰
│ ├─configlinkage/ # 情景模式生效后联动深色模式等系统设置、实况通知
│ ├─activationmanage/ # 时间/应用等自动开启条件管理与触发
│ ├─configmanage/ # 本机当前开启态、允许打扰白名单、联系人策略
│ ├─modeconfig/ # 预置情景模式默认能力、设置首页分组可见性
│ └─datamanage/ # 情景模式/配置项/联系人模型,访问IntelligentScene.db
├─product # 产品层
│ └─phone/ # 手机 / 平板形态 HAP
│ └─src/main/ets/
│ ├─entryability/ # UIAbility / UIExtension
│ ├─serviceability/ # Service / DataShare
│ ├─pages/ # 设置首页、控制中心、免打扰等
│ ├─stub/ # IPC Stub 实现
│ └─subscriber/ # 静态订阅者
├─docs/figures/ # 架构图
├─hvigor # 构建工具配置
├─signature # 签名证书与 profile
├─bundle.json # 部件描述文件
├─build-profile.json5 # 工程级配置
├─build.sh
├─oh-package.json5
├─OAT.xml # 开源合规审计
├─LICENSE
├─README.md # 中文说明文档
└─README_en.md # 英文说明文档
约束
-
语言版本:ArkTS
-
运行形态:系统预置应用(
com.ohos.intelligentscene),依赖 SettingsData、Notification、系统设置等系统能力 -
设备类型:
手机、平板(见product/phone/src/main/module.json5) -
特性开关:需开启
const.intelligentscene.enable -
权限:情景模式所需的主要权限如下(见
product/phone/src/main/module.json5)权限 授权方式 使用场景(具象) ohos.permission.ACCESS_SYSTEM_SETTINGS 系统授权 写入/读取 SettingsData 中当前情景模式、勿扰等相关键,用来同步当前开启哪个情景模式、是否开启勿扰,使设置首页与控制中心状态一致 ohos.permission.MANAGE_SETTINGS 系统授权 情景模式联动改系统设置时管理设置项(如与深色模式等联动) ohos.permission.MANAGE_SECURE_SETTINGS 系统授权 读写安全级 SettingsData( USER_SECURITY):开启/关闭时写入勿扰启停与当前情景模式 ID;联动深色模式等系统项;实况通知相关状态;以及 DataShare 受限访问ohos.permission.NOTIFICATION_CONTROLLER 系统授权 情景模式开启免打扰时,向通知服务设置勿扰 Profile、白名单应用列表 ohos.permission.GET_BUNDLE_INFO 系统授权 展示「允许通知的应用」列表时查询指定包名的应用信息与图标 ohos.permission.GET_BUNDLE_INFO_PRIVILEGED 系统授权 查询应用包 BundleInfo,用于应用白名单展示、来电相关包能力判断等 ohos.permission.GET_INSTALLED_BUNDLE_LIST 系统授权 打开应用白名单页时枚举本机已安装应用供用户勾选 ohos.permission.LISTEN_BUNDLE_CHANGE 系统授权 监听应用安装/更新/卸载,刷新「允许通知的应用」白名单展示 ohos.permission.GET_LOCAL_ACCOUNTS 系统授权 获取本机用户 ID,拼接 SettingsData 安全/用户域 URI ohos.permission.GET_TELEPHONY_STATE 系统授权 判断设备是否具备语音通话能力,决定是否展示来电勿扰入口 ohos.permission.READ_CONTACTS 用户授权 配置来电勿扰策略时读取通讯录联系人 ohos.permission.RUNNING_LOCK 系统授权 条件触发或定时任务执行期间持锁,避免进程被过早挂起导致启停失败 ohos.permission.START_SYSTEM_DIALOG 系统授权 弹出系统级确认框(例如开启某情景模式的确认对话框) ohos.permission.START_ABILITIES_FROM_BACKGROUND 系统授权 时间条件到点或自动开启回调时,在后台拉起 Service / Ability 完成自动开启 -
对外调用:Service / IPC 仅允许白名单内包名调用
-
形态适配:手机 / 平板布局存在差异,修改 UI 时需覆盖多形态验证
参与贡献
欢迎广大开发者贡献代码、文档等,具体的贡献流程和方式请参见参与贡献。
相关仓
- applications_settings(设置应用,情景模式设置入口宿主)
- window_scene_board(SceneBoard,控制中心宿主)
- arkui_ace_engine