HarmonyOS鸿蒙Next中想实现一个常驻通知栏的通知,并且点击通知之后会弹出一个悬浮窗

HarmonyOS鸿蒙Next中想实现一个常驻通知栏的通知,并且点击通知之后会弹出一个悬浮窗 【问题描述】:想实现一个常驻通知栏的通知,就是点击一键清除通知按钮之后也不会清除掉该通知,方便用户在填写账户或密码,下拉通知栏点击直接弹出一个小窗口,快速从中选择账号、密码

【问题现象】:无

【版本信息】:不涉及

【希望得到的帮助】:如何实现常驻通知,点击后如何弹出一个悬浮窗,并且能够与主界面进行交互,麻烦提供一下相关文档或demo

3 回复

这是鸿蒙,这不是Android!!!鸿蒙不会给你这个权限的。

“弹出一个小窗口,快速从中选择账号、密码”,这个是系统能力,不用你开发的。

建议你可以往app内考虑加一个悬浮按钮,点击按钮出现悬浮窗,用于填写账号和密码。

更多关于HarmonyOS鸿蒙Next中想实现一个常驻通知栏的通知,并且点击通知之后会弹出一个悬浮窗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,要实现常驻通知栏通知并点击后弹出悬浮窗,需要使用NotificationRequestWindowManager。首先,创建NotificationRequest实例,设置notificationContentnotificationId,并通过NotificationHelper.publishNotification()发布通知。将tapAction属性设置为notificationWantAgent,以定义点击行为。点击后,通过WindowManagercreateWindow()方法创建悬浮窗,传入WindowStage和布局配置。确保在module.json5中声明ohos.permission.SYSTEM_FLOAT_WINDOW权限。

在HarmonyOS Next中,实现一个常驻通知栏的通知,并且点击后弹出悬浮窗,主要涉及NotificationManagerWindowManager模块。以下是核心实现步骤和代码示例。

1. 创建常驻通知

常驻通知的关键是设置通知的ongoing属性为true,并确保其具有较高的优先级。

步骤:

  • 使用NotificationRequest构建通知请求。
  • 设置ongoingtrue,使通知无法被一键清除。
  • 通过NotificationManager发布通知。

示例代码:

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

// 构建通知内容
let notificationRequest: notificationManager.NotificationRequest = {
  content: {
    contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
    normal: {
      title: '快速填充助手',
      text: '点击选择账号或密码',
      additionalText: '常驻通知'
    }
  },
  // 设置常驻通知
  ongoing: true,
  // 设置高优先级
  notificationFlags: {
    soundEnabled: false,
    vibrationEnabled: false
  },
  // 设置点击通知的意图,用于触发悬浮窗
  wantAgent: {
    want: {
      bundleName: 'com.example.myapp',
      abilityName: 'EntryAbility',
      // 可传递参数标识点击来源
      parameters: {
        "action": "open_floating_window"
      }
    } as Want,
    requestCode: 1
  }
};

// 发布通知
try {
  notificationManager.publish(notificationRequest, (err: BusinessError) => {
    if (err) {
      console.error('发布通知失败:', err.code, err.message);
    } else {
      console.info('通知发布成功');
    }
  });
} catch (error) {
  console.error('捕获到异常:', (error as BusinessError).code, (error as BusinessError).message);
}

2. 处理通知点击事件

当用户点击通知时,系统会触发wantAgent中定义的意图。你需要在Ability(如EntryAbility)的onCreateonNewWant生命周期中解析参数,并启动悬浮窗。

在Ability中处理:

import UIAbility from '@ohos.app.ability.UIAbility';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    // 解析参数,判断是否来自通知点击
    if (want?.parameters?.action === 'open_floating_window') {
      this.openFloatingWindow();
    }
  }

  // 打开悬浮窗
  async openFloatingWindow() {
    try {
      // 创建悬浮窗窗口
      let windowClass: window.Window = await window.create(this.context, "floating_window", window.WindowType.TYPE_FLOAT);
      // 设置悬浮窗大小和位置
      await windowClass.moveTo(300, 500); // 移动到屏幕坐标(300, 500)
      await windowClass.resize(400, 600); // 调整大小为400x600
      // 加载悬浮窗页面
      windowClass.setUIContent(this.context, "pages/FloatingWindowPage", (err) => {
        if (err) {
          console.error('加载悬浮窗页面失败:', err);
          return;
        }
        // 显示悬浮窗
        windowClass.show();
      });
    } catch (error) {
      console.error('打开悬浮窗失败:', error);
    }
  }
}

3. 构建悬浮窗界面与交互

悬浮窗是一个独立的UI页面,你可以使用ArkTS编写。它可以通过postMessageEventEmitter与主界面进行通信。

示例悬浮窗页面 (FloatingWindowPage.ets):

@Entry
@Component
struct FloatingWindowPage {
  @State accountList: string[] = ['账号1', '账号2', '账号3'];

  build() {
    Column() {
      Text('选择账号或密码').fontSize(20).margin(10);
      List() {
        ForEach(this.accountList, (item: string) => {
          ListItem() {
            Text(item)
              .fontSize(16)
              .padding(10)
          }
          .onClick(() => {
            // 点击后发送选中数据到主界面
            // 假设通过EventEmitter通信
            // EventEmitter.emit('accountSelected', item);
            // 然后关闭悬浮窗
            // window.destroy();
          })
        })
      }
      .layoutWeight(1)
    }
    .width('100%')
    .height('100%')
  }
}

4. 权限配置

module.json5中声明所需权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.SYSTEM_FLOAT_WINDOW" // 悬浮窗权限
      }
    ]
  }
}

关键点总结

  • 常驻通知:设置NotificationRequestongoingtrue
  • 通知点击响应:通过wantAgent定义意图,在Ability中解析并触发悬浮窗。
  • 悬浮窗创建:使用window.create并指定类型为TYPE_FLOAT
  • 交互通信:可通过全局事件、Ability内通信或共享状态管理实现悬浮窗与主界面数据传递。

以上代码提供了基础实现框架。具体UI和交互逻辑需根据你的业务需求调整。

回到顶部