鸿蒙学习实战之路-STG系列(5/11)-守护策略管理-添加与修改策略
守护策略(Guard Strategy)是 Screen Time Guard Kit 的核心功能,用于定义屏幕时间管控的规则。守护策略是 Screen Time Guard Kit 的核心功能,通过添加和修改策略,可以灵活地管控用户的应用使用行为。守护策略包含策略名称、时间策略、应用信息、限制类型等有三种时间策略类型:起止时间、总时长、共享时长修改策略时,策略名称必须和已存在的策略名称一致策略添
鸿蒙学习实战之路-STG系列(5/11)-守护策略管理-添加与修改策略
朋友们,前四篇我们学习了 Screen Time Guard Kit 的基本概念、开发准备、用户授权管理和应用选择页。今天这篇我们就来学习守护策略管理的核心功能 - 添加和修改策略 o(╯□╰)o
守护策略就像"家长的家规",规定孩子在什么时间可以使用哪些应用、使用多长时间等。有了策略,系统就能自动执行这些规则了~
今天这篇,我会手把手带你实现守护策略的添加和修改功能,全程不超过5分钟(不含你测试的时间)~
一、什么是守护策略?
守护策略(Guard Strategy)是 Screen Time Guard Kit 的核心功能,用于定义屏幕时间管控的规则。
1. 策略的组成部分
一个完整的守护策略包含以下几个部分:
| 组成部分 | 说明 | 示例 |
|---|---|---|
| 策略名称 | 策略的唯一标识 | “游戏管控”、“学习时段” |
| 时间策略 | 定义时间规则 | 起止时间、总时长、共享时长 |
| 应用信息 | 要管控的应用列表 | 游戏应用、娱乐应用 |
| 限制类型 | 限制的方式 | 禁止清单、允许清单 |
| 重复规则 | 周期性执行 | 周一到周五 |
2. 三种时间策略类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 起止时间策略 | 在指定时间段内生效 | 工作日 9:00-18:00 禁止游戏 |
| 总时长策略 | 从当前开始的总时长限制 | 每天游戏不超过 2 小时 |
| 共享时长策略 | 多个应用共享总时长 | 游戏和视频总共不超过 3 小时 |
🥦 西兰花小贴士:
起止时间策略就像"营业时间",总时长策略就像"额度限制",共享时长策略就像"家庭共享预算"~
二、添加守护策略
添加守护策略就像制定家规,一旦制定好,系统就会自动执行。
1. 业务流程
添加守护策略的流程就像这样:
应用调用添加策略接口
↓
系统检查应用是否有权限、用户是否授权
↓
如果没有权限 → 抛出错误码
如果有权限 → 解析策略参数
↓
检查策略是否有效、是否重复、数量是否超限
↓
如果策略无效 → 抛出错误码
如果策略有效 → 保存到本地数据库
↓
策略添加成功
2. 核心接口
添加策略的接口:
| 接口名 | 说明 |
|---|---|
addGuardStrategy(guardStrategy) |
添加屏幕时间管控策略 |
3. 策略参数详解
GuardStrategy 参数说明
interface GuardStrategy {
name: string; // 策略名称,唯一标识
timeStrategy: TimeStrategy; // 时间策略
appInfo: AppInfo; // 应用信息
appRestrictionType: RestrictionType; // 限制类型
}
TimeStrategy 参数说明
interface TimeStrategy {
type: TimeStrategyType; // 时间策略类型
startTime?: string; // 开始时间,格式 "HH:mm"
endTime?: string; // 结束时间,格式 "HH:mm"
duration?: number; // 总时长,单位秒
repeat?: number[]; // 重复规则,[1-7] 表示周一到周日
}
TimeStrategyType 枚举值
| 枚举值 | 说明 |
|---|---|
START_END_TIME_TYPE |
起止时间策略 |
TOTAL_DURATION_TYPE |
总时长策略 |
SHARED_DURATION_TYPE |
共享时长策略 |
RestrictionType 枚举值
| 枚举值 | 说明 |
|---|---|
BLOCKLIST_TYPE |
禁止清单,对选中的应用进行限制 |
ALLOWLIST_TYPE |
允许清单,对选中的应用以外的应用进行限制 |
🥦 西兰花小贴士:
禁止清单就像"黑名单",允许清单就像"白名单"。黑名单里的人不能进,白名单里的人才能进,其他人都不能进~
4. 开发步骤
步骤 1: 导入相关模块
import { guardService, appPicker } from '@kit.ScreenTimeGuardKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
步骤 2: 添加起止时间策略
@Entry
@Component
struct AddStrategyDemo {
@State selectedTokens: string[] = [];
build() {
Column() {
Text('添加守护策略演示')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 40 })
Button('1. 选择要管控的应用')
.onClick(async () => {
try {
const tokens = await appPicker.startAppPicker(
this.getUIContext().getHostContext() as common.UIAbilityContext,
{ appTokens: [] }
);
this.selectedTokens = tokens;
hilog.info(0x0000, 'AddStrategyDemo',
`selected tokens: ${JSON.stringify(tokens)}`);
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'AddStrategyDemo',
`startAppPicker failed with error code: ${code}, message: ${message}`);
}
})
.margin({ top: 30 })
.width('80%')
Button('2. 添加起止时间策略')
.onClick(async () => {
if (this.selectedTokens.length === 0) {
hilog.warn(0x0000, 'AddStrategyDemo', '请先选择应用');
return;
}
try {
// 创建起止时间策略
const time: guardService.TimeStrategy = {
type: guardService.TimeStrategyType.START_END_TIME_TYPE,
startTime: '09:00', // 早上 9 点
endTime: '18:00', // 下午 6 点
repeat: [1, 2, 3, 4, 5] // 周一到周五
};
const appInfo: guardService.AppInfo = {
appTokens: this.selectedTokens
};
const strategy: guardService.GuardStrategy = {
name: '工作日游戏管控', // 策略名称
timeStrategy: time,
appInfo: appInfo,
appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
};
await guardService.addGuardStrategy(strategy);
hilog.info(0x0000, 'AddStrategyDemo', 'addGuardStrategy succeeded');
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'AddStrategyDemo',
`addGuardStrategy failed with error code: ${code}, message: ${message}`);
}
})
.margin({ top: 10 })
.width('80%')
Button('3. 添加总时长策略')
.onClick(async () => {
if (this.selectedTokens.length === 0) {
hilog.warn(0x0000, 'AddStrategyDemo', '请先选择应用');
return;
}
try {
// 创建总时长策略
const time: guardService.TimeStrategy = {
type: guardService.TimeStrategyType.TOTAL_DURATION_TYPE,
duration: 7200 // 2 小时 = 7200 秒
};
const appInfo: guardService.AppInfo = {
appTokens: this.selectedTokens
};
const strategy: guardService.GuardStrategy = {
name: '每天游戏2小时', // 策略名称
timeStrategy: time,
appInfo: appInfo,
appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
};
await guardService.addGuardStrategy(strategy);
hilog.info(0x0000, 'AddStrategyDemo', 'addGuardStrategy succeeded');
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'AddStrategyDemo',
`addGuardStrategy failed with error code: ${code}, message: ${message}`);
}
})
.margin({ top: 10 })
.width('80%')
}
.width('100%')
.height('100%')
.padding(20)
}
}
🥦 西兰花小贴士:
重复规则使用数字数组,[1,2,3,4,5] 表示周一到周五,[1,2,3,4,5,6,7] 表示每天~
三、修改守护策略
修改守护策略就像修改家规,规则变了,系统也会跟着变。
1. 业务流程
修改守护策略的流程就像这样:
应用调用修改策略接口
↓
系统检查应用是否有权限、用户是否授权
↓
如果没有权限 → 抛出错误码
如果有权限 → 解析策略参数
↓
检查策略是否有效、是否存在
↓
如果策略不存在 → 抛出错误码
如果策略存在 → 更新到本地数据库
↓
策略修改成功
2. 核心接口
修改策略的接口:
| 接口名 | 说明 |
|---|---|
updateGuardStrategy(strategyName, guardStrategy) |
修改屏幕时间管控策略 |
🥦 西兰花警告:
修改策略时,策略名称必须和已存在的策略名称一致,否则会抛出"策略不存在"的错误~
3. 开发步骤
@Entry
@Component
struct UpdateStrategyDemo {
@State selectedTokens: string[] = [];
build() {
Column() {
Text('修改守护策略演示')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 40 })
Button('1. 选择要管控的应用')
.onClick(async () => {
try {
const tokens = await appPicker.startAppPicker(
this.getUIContext().getHostContext() as common.UIAbilityContext,
{ appTokens: [] }
);
this.selectedTokens = tokens;
hilog.info(0x0000, 'UpdateStrategyDemo',
`selected tokens: ${JSON.stringify(tokens)}`);
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'UpdateStrategyDemo',
`startAppPicker failed with error code: ${code}, message: ${message}`);
}
})
.margin({ top: 30 })
.width('80%')
Button('2. 修改起止时间策略')
.onClick(async () => {
if (this.selectedTokens.length === 0) {
hilog.warn(0x0000, 'UpdateStrategyDemo', '请先选择应用');
return;
}
try {
// 创建新的时间策略
const time: guardService.TimeStrategy = {
type: guardService.TimeStrategyType.START_END_TIME_TYPE,
startTime: '08:00', // 改为早上 8 点
endTime: '20:00', // 改为晚上 8 点
repeat: [1, 2, 3, 4, 5, 6, 7] // 改为每天
};
const appInfo: guardService.AppInfo = {
appTokens: this.selectedTokens
};
const strategy: guardService.GuardStrategy = {
name: '工作日游戏管控', // 策略名称必须和已存在的一致
timeStrategy: time,
appInfo: appInfo,
appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
};
await guardService.updateGuardStrategy('工作日游戏管控', strategy);
hilog.info(0x0000, 'UpdateStrategyDemo', 'updateGuardStrategy succeeded');
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'UpdateStrategyDemo',
`updateGuardStrategy failed with error code: ${code}, message: ${message}`);
}
})
.margin({ top: 10 })
.width('80%')
}
.width('100%')
.height('100%')
.padding(20)
}
}
四、完整示例代码
下面是一个完整的示例,展示了如何实现守护策略的添加和修改功能:
import { guardService, appPicker } from '@kit.ScreenTimeGuardKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import { preferences } from '@kit.ArkData';
@Entry
@Component
struct StrategyManagerDemo {
@State selectedTokens: string[] = [];
@State strategyName: string = '';
@State strategyType: string = '';
@State strategyDesc: string = '';
async selectApps() {
try {
const tokens = await appPicker.startAppPicker(
this.getUIContext().getHostContext() as common.UIAbilityContext,
{ appTokens: [] }
);
this.selectedTokens = tokens;
hilog.info(0x0000, 'StrategyManagerDemo',
`selected tokens: ${JSON.stringify(tokens)}`);
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'StrategyManagerDemo',
`startAppPicker failed with error code: ${code}, message: ${message}`);
}
}
async addStartEndTimeStrategy() {
if (this.selectedTokens.length === 0) {
hilog.warn(0x0000, 'StrategyManagerDemo', '请先选择应用');
return;
}
try {
const time: guardService.TimeStrategy = {
type: guardService.TimeStrategyType.START_END_TIME_TYPE,
startTime: '09:00',
endTime: '18:00',
repeat: [1, 2, 3, 4, 5]
};
const appInfo: guardService.AppInfo = {
appTokens: this.selectedTokens
};
const strategy: guardService.GuardStrategy = {
name: '工作日游戏管控',
timeStrategy: time,
appInfo: appInfo,
appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
};
await guardService.addGuardStrategy(strategy);
this.strategyName = '工作日游戏管控';
this.strategyType = '起止时间策略';
this.strategyDesc = '周一到周五 9:00-18:00';
hilog.info(0x0000, 'StrategyManagerDemo', 'addGuardStrategy succeeded');
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'StrategyManagerDemo',
`addGuardStrategy failed with error code: ${code}, message: ${message}`);
}
}
async addTotalDurationStrategy() {
if (this.selectedTokens.length === 0) {
hilog.warn(0x0000, 'StrategyManagerDemo', '请先选择应用');
return;
}
try {
const time: guardService.TimeStrategy = {
type: guardService.TimeStrategyType.TOTAL_DURATION_TYPE,
duration: 7200 // 2 小时
};
const appInfo: guardService.AppInfo = {
appTokens: this.selectedTokens
};
const strategy: guardService.GuardStrategy = {
name: '每天游戏2小时',
timeStrategy: time,
appInfo: appInfo,
appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
};
await guardService.addGuardStrategy(strategy);
this.strategyName = '每天游戏2小时';
this.strategyType = '总时长策略';
this.strategyDesc = '每天最多 2 小时';
hilog.info(0x0000, 'StrategyManagerDemo', 'addGuardStrategy succeeded');
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'StrategyManagerDemo',
`addGuardStrategy failed with error code: ${code}, message: ${message}`);
}
}
async updateStrategy() {
if (this.selectedTokens.length === 0 || !this.strategyName) {
hilog.warn(0x0000, 'StrategyManagerDemo', '请先选择应用或策略');
return;
}
try {
const time: guardService.TimeStrategy = {
type: guardService.TimeStrategyType.START_END_TIME_TYPE,
startTime: '08:00',
endTime: '20:00',
repeat: [1, 2, 3, 4, 5, 6, 7]
};
const appInfo: guardService.AppInfo = {
appTokens: this.selectedTokens
};
const strategy: guardService.GuardStrategy = {
name: this.strategyName,
timeStrategy: time,
appInfo: appInfo,
appRestrictionType: guardService.RestrictionType.BLOCKLIST_TYPE
};
await guardService.updateGuardStrategy(this.strategyName, strategy);
this.strategyDesc = '每天 8:00-20:00';
hilog.info(0x0000, 'StrategyManagerDemo', 'updateGuardStrategy succeeded');
} catch (err) {
const message = (err as BusinessError).message;
const code = (err as BusinessError).code;
hilog.error(0x0000, 'StrategyManagerDemo',
`updateGuardStrategy failed with error code: ${code}, message: ${message}`);
}
}
build() {
Column() {
Text('守护策略管理演示')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 40 })
Text('当前策略: ' + this.strategyName)
.fontSize(16)
.margin({ top: 20 })
Text('策略类型: ' + this.strategyType)
.fontSize(14)
.margin({ top: 5 })
Text('策略描述: ' + this.strategyDesc)
.fontSize(14)
.margin({ top: 5 })
Button('1. 选择要管控的应用')
.onClick(() => this.selectApps())
.margin({ top: 30 })
.width('80%')
Button('2. 添加起止时间策略')
.onClick(() => this.addStartEndTimeStrategy())
.margin({ top: 10 })
.width('80%')
Button('3. 添加总时长策略')
.onClick(() => this.addTotalDurationStrategy())
.margin({ top: 10 })
.width('80%')
Button('4. 修改当前策略')
.onClick(() => this.updateStrategy())
.margin({ top: 10 })
.width('80%')
}
.width('100%')
.height('100%')
.padding(20)
}
}
五、注意事项
🥦 西兰花警告:
- 必须先获得用户授权: 添加和修改策略之前,必须先请求用户授权,否则会报错
- 策略名称必须唯一: 不能有两个同名的策略,否则会报错
- 修改策略名称要一致: 修改策略时,策略名称必须和已存在的策略名称一致
- 时间格式要正确: 起止时间格式必须是 “HH:mm”,比如 “09:00”、“18:00”
- 重复规则要合理: 重复规则使用 [1-7] 的数字数组,代表周一到周日
- 策略数量有限制: 每个应用的策略数量有限制,不能无限添加
- 策略需要启动才能生效: 添加或修改策略后,需要调用启动策略接口才能生效
六、文档资源
官方文档链接:
七、总结
守护策略是 Screen Time Guard Kit 的核心功能,通过添加和修改策略,可以灵活地管控用户的应用使用行为。
核心要点:
- 守护策略包含策略名称、时间策略、应用信息、限制类型等
- 有三种时间策略类型:起止时间、总时长、共享时长
- 修改策略时,策略名称必须和已存在的策略名称一致
- 策略添加或修改后,需要启动才能生效
- 每个应用的策略数量有限制
守护策略就像"家长的家规",制定好了,系统就会自动执行。修改家规,系统也会跟着变 o(╯□╰)o
下一步行动
建议你:
- 先实现基本的应用选择功能
- 实现起止时间策略的添加功能
- 实现总时长策略的添加功能
- 实现策略修改功能
- 结合查询和启动功能,实现完整的策略管理流程
记住,不教理论,只给你能跑的代码和避坑指南! _
我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦
更多推荐



所有评论(0)