
在自助点餐机、门店收银终端、展厅查询机、工业平板这类商用场景中最核心的需求就是设备锁定让设备开机后自动运行指定应用用户无法退出、无法切换到桌面或其他 App防止误操作和恶意篡改。鸿蒙 7API 26中的Kiosk 自助锁定模式就是专门解决这类问题的系统级能力。它隶属于kit.AbilityKit程序框架套件由系统底层管控应用层只需几行代码就能实现全屏锁定安全性远高于应用层模拟的「伪全屏」。本文从核心原理、权限配置、完整实战到最佳实践带你彻底搞懂 Kiosk 模式落地商用门店级的单应用锁定方案。一、什么是 Kiosk 锁屏模式1.1 核心定义Kiosk 模式是鸿蒙系统提供的设备级单应用锁定能力开启后设备将被锁定在指定应用内用户无法返回桌面、无法切换应用、无法下拉控制中心、无法使用系统手势只能操作当前应用的功能。它不是应用自己做的全屏模拟而是系统级的管控底层由 AbilityKit 框架 系统设备管控服务共同实现普通用户无法绕过非常适合无人值守的商用终端场景。1.2 典型商用场景 连锁门店自助点餐机、自助收银终端 政企大厅政务查询机、业务办理终端 工业场景车间生产平板、设备操控终端 展览展厅互动查询屏、产品演示终端 教育场景考试专用平板、教学一体机1.3 与普通全屏的本质区别很多新手会用「隐藏状态栏 禁用返回键」模拟锁定效果和系统 Kiosk 模式完全不是一个层级对比项应用层模拟全屏系统 Kiosk 模式管控层级应用层可被绕过系统底层无法绕过系统手势只能禁用部分全部系统手势失效多任务切换仍可被切走完全无法切换应用下拉控制中心无法禁止完全禁止下拉开机自启动需要额外配置可配合实现开机直达安全性低容易被退出高系统级保障二、核心架构与 API 说明Kiosk 模式采用「管控层 应用层」的双层架构职责分离符合企业级安全规范。2.1 两层架构MDM 管控层设备管理应用负责配置允许进入 Kiosk 模式的应用白名单可远程下发锁定/解锁指令需要企业级ENTERPRISE_SET_KIOSK权限通过华为 HEM 企业设备管理平台授权适合连锁门店、企业 IT 统一管理场景业务应用层门店 App被加入白名单后可主动调用接口进入/退出 Kiosk 模式只需要关注自身业务逻辑不用处理底层管控导入kioskManager即可使用开发门槛极低 单设备调试场景可通过开发者选项或 adb 命令将测试应用加入白名单无需完整 MDM 部署。2.2 核心 API 速览所有能力统一从kit.AbilityKit导入仅支持 Stage 模型API 20 及以上可用。import{kioskManager}fromkit.AbilityKit;API作用kioskManager.enterKioskMode(context)进入 Kiosk 锁定模式kioskManager.exitKioskMode(context)退出 Kiosk 锁定模式kioskManager.getKioskStatus()获取当前 Kiosk 状态是否锁定、锁定的包名2.3 状态结构体 KioskStatusinterfaceKioskStatus{isKioskMode:boolean;// 当前是否处于 Kiosk 模式kioskBundleName:string;// 当前锁定的应用包名kioskBundleUid:number;// 锁定应用的 UID}三、前置配置与权限说明这是新手最高频的踩坑点不是随便一个应用都能调用 Kiosk 接口必须先被系统加入允许名单否则调用会直接报错。3.1 企业级正式部署商用正式环境通过企业 MDM 平台配置在华为 HEM 企业设备管理平台注册设备通过 MDM 应用调用setAllowedKioskApps接口将业务 App 加入 Kiosk 白名单设备端业务 App 即可正常调用进入/退出接口需要ohos.permission.ENTERPRISE_SET_KIOSK系统级权限仅对企业 MDM 应用开放3.2 开发调试配置开发阶段可通过 adb 命令快速将测试应用加入白名单无需部署完整 MDM# 替换为你的应用包名adb shellsetallowed_kiosk_apps com.example.storekiosk3.3 应用侧清单配置业务应用本身不需要申请特殊权限只需要确保工程为 Stage 模型compileSdkVersion≥ API 20应用已被加入 Kiosk 允许名单四、完整实战门店自助终端 Kiosk 实现下面实现一个典型的门店自助点餐终端页面包含应用启动自动进入 Kiosk 模式隐藏管理员入口输入密码可退出锁定实时显示当前锁定状态异常兜底逻辑4.1 入口 Ability 自动进入 Kiosk在应用主 Ability 的onForeground中自动进入锁定模式保证切回前台也会保持锁定。import{UIAbility,AbilityConstant,Want}fromkit.AbilityKit;import{kioskManager}fromkit.AbilityKit;import{hilog}fromkit.PerformanceAnalysisKit;import{window}fromkit.ArkUI;constTAGStoreKioskAbility;exportdefaultclassEntryAbilityextendsUIAbility{onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{hilog.info(0x0000,TAG,应用创建);}onWindowStageCreate(windowStage:window.WindowStage):void{// 开启全屏布局隐藏系统栏windowStage.getMainWindow().then(win{win.setWindowLayoutFullScreen(true);win.setWindowSystemBarProperties({statusBarBackgroundColor:#00000000,navigationBarBackgroundColor:#00000000});});windowStage.loadContent(pages/Index,(err){if(err.code){hilog.error(0x0000,TAG,页面加载失败:${JSON.stringify(err)});}});}onForeground():void{// 进入前台自动尝试进入 Kiosk 模式this.enterKioskMode();}/** * 进入 Kiosk 锁定模式 */privateasyncenterKioskMode(){try{// 先检查是否已经在 Kiosk 模式conststatuskioskManager.getKioskStatus();if(status.isKioskModestatus.kioskBundleNamethis.context.bundleName){hilog.info(0x0000,TAG,已处于Kiosk模式);return;}awaitkioskManager.enterKioskMode(this.context);hilog.info(0x0000,TAG,成功进入Kiosk锁定模式);}catch(err){hilog.error(0x0000,TAG,进入Kiosk失败:${JSON.stringify(err)});}}onDestroy():void{// 应用销毁时可选择是否退出 Kiosk门店终端一般不退出hilog.info(0x0000,TAG,应用销毁);}}4.2 主页面管理员退出入口页面上做一个隐蔽的管理员入口连续点击指定区域 5 次弹出密码输入框验证通过后可退出 Kiosk 模式。import{kioskManager}fromkit.AbilityKit;import{promptAction,TextInput}fromkit.ArkUI;import{hilog}fromkit.PerformanceAnalysisKit;constTAGStoreKioskPage;// 管理员退出密码实际项目建议加密存储或服务端验证constADMIN_PASSWORDadmin123;EntryComponentstruct StoreKioskPage{StateisKioskMode:booleanfalse;StateshowPasswordDialog:booleanfalse;StateinputPassword:string;// 连续点击计数privateclickCount:number0;privatelastClickTime:number0;privateuiContextgetContext(this)asany;aboutToAppear(){this.refreshKioskStatus();}/** * 刷新 Kiosk 状态 */refreshKioskStatus(){try{conststatuskioskManager.getKioskStatus();this.isKioskModestatus.isKioskMode;}catch(err){hilog.error(0x0000,TAG,获取状态失败:${JSON.stringify(err)});this.isKioskModefalse;}}/** * 连续点击logo 5次触发管理员入口 */onLogoClick(){constnowDate.now();if(now-this.lastClickTime2000){this.clickCount0;}this.lastClickTimenow;this.clickCount;if(this.clickCount5){this.clickCount0;this.showPasswordDialogtrue;}}/** * 验证密码并退出 Kiosk */asyncexitKioskMode(){if(this.inputPassword!ADMIN_PASSWORD){promptAction.showToast({message:密码错误});return;}try{awaitkioskManager.exitKioskMode(this.uiContext);this.isKioskModefalse;this.showPasswordDialogfalse;this.inputPassword;promptAction.showToast({message:已退出锁定模式});hilog.info(0x0000,TAG,管理员退出Kiosk模式);}catch(err){hilog.error(0x0000,TAG,退出失败:${JSON.stringify(err)});promptAction.showToast({message:退出失败请检查权限});}}build(){Stack(){// 主界面门店自助点餐首页Column({space:30}){// 顶部Logo区域连续点击5次触发管理员入口Text( 自助点餐系统).fontSize(36).fontWeight(FontWeight.Bold).fontColor(#E65100).margin({top:80}).onClick(()this.onLogoClick());Text(欢迎使用自助点餐服务).fontSize(20).fontColor(#333333);Blank();// 功能入口Grid(){GridItem(){this.buildMenuIcon(,扫码点餐);}GridItem(){this.buildMenuIcon(,我的订单);}GridItem(){this.buildMenuIcon(,优惠券);}GridItem(){this.buildMenuIcon(,呼叫服务);}}.columnsTemplate(1fr 1fr).columnsGap(24).rowsGap(24).width(80%);Blank();// 状态提示Text(this.isKioskMode? 设备已锁定:⚠️ 设备未锁定).fontSize(14).fontColor(this.isKioskMode?#00B578:#FF4D4F).margin({bottom:40});}.width(100%).height(100%).backgroundColor(#FFF8E1);// 密码输入弹窗if(this.showPasswordDialog){Column({space:20}){Text(管理员验证).fontSize(18).fontWeight(FontWeight.Medium);TextInput({placeholder:请输入管理员密码}).type(InputType.Password).width(100%).height(44).onChange((val)this.inputPasswordval);Row({space:12}){Button(取消).layoutWeight(1).height(44).backgroundColor(#F5F5F5).fontColor(#333333).onClick((){this.showPasswordDialogfalse;this.inputPassword;});Button(确认).layoutWeight(1).height(44).backgroundColor(#0A59F7).onClick(()this.exitKioskMode());}.width(100%);}.width(80%).padding(24).backgroundColor(#FFFFFF).borderRadius(16).shadow({radius:16,color:#40000000});}}.width(100%).height(100%);}BuilderbuildMenuIcon(icon:string,title:string){Column({space:12}){Text(icon).fontSize(48);Text(title).fontSize(16).fontColor(#333333);}.width(100%).height(120).backgroundColor(#FFFFFF).borderRadius(16).justifyContent(FlexAlign.Center).onClick((){promptAction.showToast({message:进入${title}});});}}五、商用落地最佳实践1. 开机自启动直达门店终端通常要求开机自动进入应用并锁定。可通过 MDM 配置开机自启动应用配合 Ability 前台自动进 Kiosk 的逻辑实现开机直达业务界面全程无需人工干预。2. 异常崩溃自动恢复Kiosk 模式下如果应用崩溃系统会自动重新拉起应用保证终端始终可用。建议在应用内增加崩溃日志上报便于运维排查问题。3. 分级权限管理普通用户完全锁定只能操作业务功能店员可执行锁屏、重启等基础操作管理员可退出 Kiosk、修改配置、进行系统维护不同级别设置不同密码或验证方式保证安全。4. 配合保活机制结合系统应用保活能力保证应用在后台不会被系统杀死7×24 小时稳定运行。六、新手高频踩坑避坑指南1. 调用 enterKioskMode 直接报错最常见原因应用未被加入 Kiosk 允许白名单解决开发环境用 adb 命令设置允许名单正式环境通过 MDM 平台配置验证先调用getKioskStatus()确认接口可用再执行进入操作2. 进入 Kiosk 后不知道怎么退出说明Kiosk 模式下系统手势全部失效普通用户无法退出方案应用内必须预留隐蔽的管理员退出入口如连续点击、密码验证也可通过 MDM 远程下发退出指令3. 以为需要申请 Kiosk 权限说明业务应用本身不需要申请权限调用权限在 MDM 管控侧误区不要在业务应用清单里加ENTERPRISE_SET_KIOSK这个权限是给 MDM 应用用的普通应用申请了也不会通过4. 模拟器无法调试 Kiosk说明Kiosk 是系统级管控能力模拟器不支持完整的锁定效果方案逻辑代码可在模拟器编译验证真实锁定效果必须用真机调试5. 页面销毁导致退出 Kiosk说明应用内页面跳转、Ability 切换不会自动退出 Kiosk注意只有主动调用exitKioskMode或 MDM 下发指令才会解除锁定总结Kiosk 模式是鸿蒙面向商用终端场景的核心差异化能力它把「单应用锁定」这个原本需要定制 ROM 才能实现的功能封装成了标准的 AbilityKit 接口开发者只需几行代码就能实现工业级的设备锁定效果。对于门店自助终端、政企查询机这类场景Kiosk 模式 开机自启 崩溃自动恢复的组合方案完全可以替代传统的定制系统方案大幅降低开发和运维成本。