HarmonyOS鸿蒙Next中想实现一个常驻通知栏的通知,并且点击通知之后会弹出一个悬浮窗
HarmonyOS鸿蒙Next中想实现一个常驻通知栏的通知,并且点击通知之后会弹出一个悬浮窗 【问题描述】:想实现一个常驻通知栏的通知,就是点击一键清除通知按钮之后也不会清除掉该通知,方便用户在填写账户或密码,下拉通知栏点击直接弹出一个小窗口,快速从中选择账号、密码
【问题现象】:无
【版本信息】:不涉及
【希望得到的帮助】:如何实现常驻通知,点击后如何弹出一个悬浮窗,并且能够与主界面进行交互,麻烦提供一下相关文档或demo
这是鸿蒙,这不是Android!!!鸿蒙不会给你这个权限的。
“弹出一个小窗口,快速从中选择账号、密码”,这个是系统能力,不用你开发的。
建议你可以往app内考虑加一个悬浮按钮,点击按钮出现悬浮窗,用于填写账号和密码。
更多关于HarmonyOS鸿蒙Next中想实现一个常驻通知栏的通知,并且点击通知之后会弹出一个悬浮窗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,要实现常驻通知栏通知并点击后弹出悬浮窗,需要使用NotificationRequest和WindowManager。首先,创建NotificationRequest实例,设置notificationContent和notificationId,并通过NotificationHelper.publishNotification()发布通知。将tapAction属性设置为notificationWantAgent,以定义点击行为。点击后,通过WindowManager的createWindow()方法创建悬浮窗,传入WindowStage和布局配置。确保在module.json5中声明ohos.permission.SYSTEM_FLOAT_WINDOW权限。
在HarmonyOS Next中,实现一个常驻通知栏的通知,并且点击后弹出悬浮窗,主要涉及NotificationManager和WindowManager模块。以下是核心实现步骤和代码示例。
1. 创建常驻通知
常驻通知的关键是设置通知的ongoing属性为true,并确保其具有较高的优先级。
步骤:
- 使用
NotificationRequest构建通知请求。 - 设置
ongoing为true,使通知无法被一键清除。 - 通过
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)的onCreate或onNewWant生命周期中解析参数,并启动悬浮窗。
在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编写。它可以通过postMessage或EventEmitter与主界面进行通信。
示例悬浮窗页面 (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" // 悬浮窗权限
}
]
}
}
关键点总结
- 常驻通知:设置
NotificationRequest的ongoing为true。 - 通知点击响应:通过
wantAgent定义意图,在Ability中解析并触发悬浮窗。 - 悬浮窗创建:使用
window.create并指定类型为TYPE_FLOAT。 - 交互通信:可通过全局事件、Ability内通信或共享状态管理实现悬浮窗与主界面数据传递。
以上代码提供了基础实现框架。具体UI和交互逻辑需根据你的业务需求调整。

