HarmonyOS 鸿蒙Next中Ability如何监听系统“勿扰模式”(DND)开关?

HarmonyOS 鸿蒙Next中Ability如何监听系统“勿扰模式”(DND)开关?

我们的闹钟 App 需在勿扰模式开启时静音,但不确定是否有广播。

3 回复

静音了还怎么起到“闹钟”的效果?

更多关于HarmonyOS 鸿蒙Next中Ability如何监听系统“勿扰模式”(DND)开关?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


勿扰模式你的闹钟app也失效了吧,何必需要监听呢?

在HarmonyOS Next中,Ability可以通过NotificationManager来查询和监听系统的“勿扰模式”(Do Not Disturb,简称DND)状态变化。系统并未提供直接的广播机制,而是推荐使用订阅通知策略变更事件的方式。

核心步骤如下:

  1. 获取NotificationManager实例: 在Ability的上下文中(如UIAbilityContext)获取服务。

  2. 查询当前勿扰模式状态: 使用getNotificationManager().getCurrentNotificationFilter()方法。返回的NotificationFilter对象包含了当前的策略信息,你可以通过其filterType属性判断是否处于勿扰模式(例如值为NotificationFilter.FILTER_TYPE_PRIORITY或特定等级时代表开启)。

  3. 订阅策略变更事件: 这是实现“监听”的关键。通过notificationManager.on('notificationFilterChange')方法订阅过滤策略变化事件。当勿扰模式被打开或关闭时,会触发此事件回调。

  4. 在回调中处理状态: 在事件回调函数中,你会收到新的NotificationFilter对象,据此更新你App的行为(例如,控制闹钟是否静音)。

  5. 适时取消订阅: 在Ability生命周期合适阶段(如onDestroy)调用对应的off方法取消订阅,避免资源泄漏。

简单代码示例(ArkTS):

import { notificationManager, NotificationFilter } from '@kit.NotificationKit';
import { common } from '@kit.AbilityKit';

export default class EntryAbility extends common.UIAbility {
  private notificationFilterChangeCallback: (filter: NotificationFilter) => void = null;

  onWindowStageCreate(windowStage: common.WindowStage): void {
    // 1. 获取NotificationManager实例
    let nm = notificationManager.getNotificationManager(this.context);

    // 2. 获取初始状态
    let currentFilter: NotificationFilter = nm.getCurrentNotificationFilter();
    this.handleDNDStatus(currentFilter);

    // 3. 订阅变更事件
    this.notificationFilterChangeCallback = (filter: NotificationFilter) => {
      // 4. 处理状态变化
      this.handleDNDStatus(filter);
    };
    nm.on('notificationFilterChange', this.notificationFilterChangeCallback);
  }

  private handleDNDStatus(filter: NotificationFilter): void {
    // 根据filter.filterType判断勿扰模式是否开启
    // 例如:FILTER_TYPE_ALLOW_ALL 通常为关闭,FILTER_TYPE_PRIORITY 为开启(优先级模式)
    let isDNDEnabled = (filter.filterType !== notificationManager.FilterType.FILTER_TYPE_ALLOW_ALL);
    // 根据isDNDEnabled控制你的闹钟响铃逻辑
    console.log(`勿扰模式状态变更,当前是否开启: ${isDNDEnabled}`);
  }

  onDestroy(): void {
    // 5. 取消订阅
    if (this.notificationFilterChangeCallback) {
      notificationManager.getNotificationManager(this.context).off('notificationFilterChange', this.notificationFilterChangeCallback);
    }
  }
}

注意事项:

  • 查询和订阅通知策略需要申请权限 ohos.permission.NOTIFICATION_CONTROLLER。你需要在module.json5文件中声明,并且该权限为system_basic级别,通常仅系统应用或拥有相应特许权限的应用才能获取。普通应用商店上架的闹钟App可能无法直接使用此方式,需考虑其他替代方案或确认你的应用权限等级。
  • 准确判断勿扰模式需结合filterType和可能的filterRank(优先级等级)综合分析,因为用户可能设置了基于优先级的例外规则。
  • 此API属于系统能力,开发前请务必查阅HarmonyOS Next最新版本的官方API文档(NotificationKit)以确认细节和兼容性。

对于闹钟App,更常见的做法是在触发响铃的时刻,即时查询一次当前的勿扰模式状态,并据此决定是否静音,而非长期后台监听。这更符合最小权限和按需使用的原则。

回到顶部