HarmonyOS 鸿蒙Next中如何阻止关机

HarmonyOS 鸿蒙Next中如何阻止关机 请问有人知道“阻止关机”功能怎么开发吗,可以提供一下思路吗

7 回复

普通应用级别 小于 系统应用级别;关机功能属于系统的行为,所以你这个阻止关机的想法不太切合实际。

更多关于HarmonyOS 鸿蒙Next中如何阻止关机的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


[@ohos.enterprise.restrictions (限制类策略)-ArkTS API-MDM Kit(企业设备管理服务)-基础功能-系统 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-enterprise-restrictions#restrictionssetuserrestriction20)

MDM Kit里有禁用电源键长按的方法,不过需要相应资质才能开发,而且只能给企业设备使用(MDM Kit开发指南-MDM Kit(企业设备管理服务)-基础功能-系统 - 华为HarmonyOS开发者

import { Want } from '@kit.AbilityKit';
import { restrictions } from '@kit.MDMKit';

let wantTemp: Want = {
  // 需根据实际情况进行替换
  bundleName: 'com.example.myapplication',
  abilityName: 'EnterpriseAdminAbility'
};

try {
  // 参数需根据实际情况进行替换
  restrictions.setUserRestriction(wantTemp, 'powerLongPress', true);
  console.info('Succeeded in restricting from powerLongPress');
} catch (err) {
  console.error(`Failed to restrict from powerLongPress. Code is ${err.code}, message is ${err.message}`);
}

只能弹出框提示用户: 请不要关机!!!

关机是系统级功能,APP是无法阻止的。

对于那种强制关机也没啥用呀~~~

在HarmonyOS Next中,可以通过监听系统关机广播来阻止关机。应用需要申请ohos.permission.PREVENT_DEVICE_FROM_SUSPENDING权限,并在module.json5中配置。在onReceive回调中,调用CommonEventData.setCode设置特定返回值可取消关机流程。此操作需系统级权限,普通应用可能无法使用。

在HarmonyOS Next中,应用无法直接、无条件地阻止系统关机。这是出于系统安全、稳定性和用户体验的考虑。系统关机流程由系统服务统一管理,应用只能通过标准机制进行有限度的干预或响应。

主要的实现思路是:监听关机广播,并在短暂的窗口期内执行紧急任务或弹出提示,但最终无法阻止关机流程的完成。

以下是具体的技术路径和关键步骤:

1. 核心机制:订阅系统关机广播

应用需要订阅系统在关机前发出的特定静态广播(例如 usual.event.SHUTDOWN)。当用户触发关机操作时,系统会发出此广播,为所有已订阅的应用提供一个短暂(通常很短,例如几秒)的处理窗口。

关键代码示例(ArkTS):

import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';

let context: common.UIAbilityContext = ...; // 获取Ability上下文
let shutdownReceiver: common.StaticSubscriber; // 声明静态广播接收器

// 定义接收器回调
let receiverCallback = (data: common.SubscriberEventData) => {
  console.info('Shutdown event received.');
  // 在此处执行紧急操作,例如:
  // - 保存关键应用数据到持久化存储。
  // - 向用户弹出通知提醒(注意:窗口期极短,可能无法完整显示或交互)。
  // 注意:在此回调中执行长时间操作是无效的,系统不会等待。
};

// 订阅关机广播
try {
  let subscriberInfo: common.SubscriberInfo = {
    events: ['usual.event.SHUTDOWN'] // 订阅关机事件
  };
  shutdownReceiver = context.createStaticSubscriber(subscriberInfo);
  shutdownReceiver.on('usual.event.SHUTDOWN', receiverCallback);
  console.info('Shutdown subscriber registered.');
} catch (error) {
  let err: BusinessError = error as BusinessError;
  console.error(`Failed to subscribe. Code: ${err.code}, message: ${err.message}`);
}

2. 在应用配置文件中声明权限

需要在 module.json5 配置文件中声明订阅系统事件所需的权限。

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.SUBSCRIBE_SYSTEM_EVENT" // 订阅系统事件的权限
      }
    ]
  }
}

3. 重要限制与注意事项

  • 无法阻止:收到此广播仅意味着应用被通知关机即将发生。应用没有API可以取消或终止关机流程。系统在广播发出后,会等待一个极短的时间(具体时长由系统策略决定,应用不可控),然后继续执行关机。
  • 窗口期极短:广播发出到系统继续关机的间隔非常短暂(秒级或更短)。只能用于执行轻量、快速的紧急任务(如将内存中的关键数据写入本地数据库)。严禁在此回调中执行网络请求、复杂计算或弹出需要用户交互的模态对话框,这些操作很可能无法完成。
  • 前台通知限制:虽然技术上可以在回调中尝试弹出通知,但由于上述时间限制,可能无法达到预期效果。系统级关机提示具有最高优先级。
  • 合理使用场景:此机制的设计目的是让应用在系统关机前有一个“最后清理”的机会,例如:
    • 保存未提交的文档草稿。
    • 记录应用当前的运行状态,以便下次启动时恢复。
    • 安全地断开与外部硬件的连接(如果适用)。

总结

在HarmonyOS Next中,开发“阻止关机”功能的正确思路是:订阅系统关机广播 (usual.event.SHUTDOWN),在短暂的窗口期内完成紧急的数据持久化或状态保存工作。 应用必须明确知晓自身无法真正阻止关机,其设计应遵循系统规范,确保在关机流程中行为可控、数据安全。

回到顶部