HarmonyOS 鸿蒙Next中PC应用如何创建任务栏托盘图标,以及启动时隐藏窗口?
HarmonyOS 鸿蒙Next中PC应用如何创建任务栏托盘图标,以及启动时隐藏窗口? 就是应用启动时直接在后台启动,不显示窗口。
另外,有没有办法让应用在显示窗口时不在任务栏显示图标?
如果能有个demo就更好了。
尊敬的开发者,您好,
当前暂不支持直接点击图标启动应用时不显示主窗的能力,若开发者需要此功能,为了尽快响应您的诉求,请帮忙补充以下信息,感谢:
请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。
更多关于HarmonyOS 鸿蒙Next中PC应用如何创建任务栏托盘图标,以及启动时隐藏窗口?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
- 在 module.json5中声明 ExtensionAbility,类型为 “tray”。
- 创建一个继承 TrayExtensionAbility 的类,实现关键回调。
{
"extensionAbilities": [
{
"name": "MyTrayExtension",
"type": "tray",
"srcEntry": "./ets/MyTrayExtension.ets"
}
]
}
TrayExtension.ets
import TrayExtensionAbility from '[@ohos](/user/ohos).application.TrayExtensionAbility';
export default class MyTray extends TrayExtensionAbility {
onCreateTrayMenu() {
// 返回菜单项数组
return [
{ id: 1, text: "显示窗口", icon: "$media:show_icon" },
{ id: 2, text: "退出", icon: "$media:exit_icon" }
];
}
onTrayMenuItemClick(item: any) {
if (item.id === 1) {
// 显示主窗口逻辑
this.showMainWindow();
} else if (item.id === 2) {
this.terminateSelf(); // 退出应用
}
}
updateTrayIcon(iconPath?: string) {
// 更新托盘图标
}
// 自定义显示窗口方法(需结合 WindowStage)
private showMainWindow() {
// 通过 WindowManager 或 AbilityContext 获取并显示窗口
}
}
托盘图标通常与应用的 Extension 结合使用,支持点击菜单、图标更新等。系统可能会自动添加“退出”菜单项,开发者需在逻辑中统一处理退出事件。
启动时直接后台运行(隐藏主窗口)
应用启动时不显示主窗口,实现“后台驻留”:
- 在 UIAbility 的生命周期中处理窗口:
- 在 onWindowStageCreate 中获取主窗口后立即隐藏/最小化。
- 使用 Window API 设置可见性或状态。
- @ohos.window中mainWindow.minimize()
EntryAbility.ets
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.WindowKit';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
// 获取主窗口
windowStage.getMainWindow().then((mainWin: window.Window) => {
// 启动时立即隐藏主窗口(后台运行)
mainWin.hide(); // 或 mainWin.minimize();
// 可选:设置窗口标志,确保最小化时隐藏到托盘
// mainWin.setWindowFlags(...);
// 初始化托盘
this.initTray();
}).catch(err => {
console.error('获取窗口失败', err);
});
}
private initTray() {
// 触发 TrayExtensionAbility 或相关逻辑
}
// 提供显示窗口的方法,供托盘菜单调用
showWindow() {
// 通过 WindowStage 或 AbilityContext 显示
}
}
PC 端这几个能力要分开看:托盘/状态栏入口、启动不显示主窗口、任务栏是否显示图标,不是同一个开关。
托盘类入口优先看 PC 桌面相关能力里的 statusBar/statusBarManager;普通 @ohos.window 更偏应用窗口管理,不能把任意窗口直接变成系统托盘。启动隐藏窗口则要看应用启动流程里是否可以先不 show 主窗口,或启动后立即最小化/隐藏,并通过托盘入口再恢复。
“窗口显示但不在任务栏显示图标”通常受系统窗口类型和应用权限限制,普通三方应用未必能完全控制。建议先用官方 PC 桌面扩展 Demo 跑通状态栏图标,再接自己的窗口显示/隐藏逻辑。
PC 端需要分开看:
-
类似“托盘/状态栏图标”的入口,不是 @ohos.window 里的普通任务栏属性。PC 桌面能力里可以使用 DesktopExtensionKit 的 statusBarManager 添加状态栏图标,例如通过 statusBarManager.addToStatusBar(context, statusBarItem) 配置图标、悬浮提示、左键快捷操作、右键菜单,并监听 statusBarIconClick / rightMenuClick。该能力依赖设备支持 SystemCapability.PCService.StatusBarManager。需要 QuickBar 任务入口时,可再看 quickBarManager.addQuickTask / addQuickBarGroup。
-
应用启动后直接退到后台,普通 UIAbility 可在合适时机调用 UIAbilityContext.moveAbilityToBackground()。注意它要求 Ability 当前在前台,且不支持的场景会返回 Operation not supported。
-
如果要隐藏/显示一个挂在状态栏项上的 Ability,可用 UIAbilityContext.hideAbility() / showAbility(),但前提是该 Ability 是通过 startAbility 启动,并且 StartOptions 同时设置 processMode 与 startupVisibility,其中 processMode 使用 NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM 或 ATTACH_TO_STATUS_BAR_ITEM,且调用方已先添加状态栏项。不满足这些条件会报 StartOptions 校验失败或 Capability not support。
-
“显示窗口但不在任务栏显示图标”目前不建议按普通 Window 属性处理,公开窗口 API 里没有一个通用开关可以直接隐藏任务栏图标。若目标是常驻后台入口,应按 PC 状态栏/QuickBar 扩展能力设计。
插眼,
在 HarmonyOS NEXT 中,PC 应用可通过 application 组件配合 WindowStage 实现。创建托盘图标需使用 SystemTray 能力(@ohos.systemTray),调用 createTrayIcon() 并绑定 click 事件。启动时隐藏窗口:在 onWindowStageCreate 中获取主窗口 windowStage.getMainWindow(),调用 window.hide(),并设置 WindowMode 为 FULLSCREEN 或不显示。需在 module.json5 中申请 ohos.permission.SYSTEM_TRAY 权限。注意使用 ArkTS/ArkUI,非 Java/C。
在HarmonyOS NEXT PC应用中,可使用 @ohos.systemTray 创建任务栏托盘图标,并在启动时通过窗口隐藏接口实现后台运行。
1. 创建托盘图标
在UIAbility中初始化系统托盘:
import systemTray from '@ohos.systemTray';
import { BusinessError } from '@ohos.base';
// 创建托盘
systemTray.createTray(context, (err, tray) => {
if (err) return;
// 设置图标和提示文本
tray.setIcon(iconPixelMap, (err) => {});
tray.setLabel('应用名称', (err) => {});
// 点击托盘图标时显示主窗口
tray.on('click', () => {
window.getLastWindow(context).then(win => win.show());
});
});
2. 启动时隐藏窗口
在UIAbility的onWindowStageCreate中,加载页面后将主窗口设为不可见:
onWindowStageCreate(windowStage: window.WindowStage) {
windowStage.loadContent('pages/Index', (err) => {
if (!err) {
const mainWin = windowStage.getMainWindowSync();
mainWin.setWindowVisibility(false, (err) => {});
}
});
}
3. 关于“显示窗口时不在任务栏显示图标”
目前HarmonyOS公开API不支持直接控制任务栏图标的显隐。若需实现,可考虑将显示窗口创建为工具窗口(windowStage.createSubWindow)而非主窗口,但该方式会有其他限制。建议优先使用托盘方案,隐藏主窗口即可避免任务栏图标。
