应用接入状态栏
应用接入状态栏之后,状态栏会显示应用自定义的图标,图标提供左键显示自定义弹窗以及右键显示菜单的功能;应用退出时,状态栏图标会随着应用进程的销毁而消失。
从6.0.2(22)版本开始支持更新状态栏图标hover时显示内容。
接口说明
以下列出应用接入状态栏的相关API,具体API说明详见接口文档。
DeskTop Extension Kit(桌面拓展服务)相关API仅在2in1设备上生效。
表1 应用接入状态栏相关功能接口介绍
| 接口名 | 描述 |
|---|---|
| addToStatusBar(context: common.Context, statusBarItem: StatusBarItem): void | 添加应用图标到状态栏。 |
| removeFromStatusBar(context: common.Context): void | 移除状态栏的应用图标。 |
| updateQuickOperationHeight(context: common.Context, height: number): void | 更新状态栏图标左键弹窗应用定制区域的高度。 |
| updateStatusBarMenu(context: common.Context, statusBarGroupMenus: StatusBarGroupMenu[]): void | 更新接入状态栏图标的右键菜单内容。 |
| updateStatusBarIcon(context: common.Context, statusBarIcon: StatusBarIcon): void | 更新状态栏图标。 |
| updateStatusBarHoverTips(context: common.Context, hoverTips: string): Promise<void> | 更新状态栏图标hover时显示内容。 |
| on(type: 'statusBarIconClick', callback: Callback<emitter.EventData>): void | 监听状态栏图标点击事件。 |
| off(type: 'statusBarIconClick', callback?: Callback<emitter.EventData>): void | 注销状态栏图标点击事件。 |
| on(type: 'rightMenuClick', callback: Callback<emitter.EventData>): void | 监听状态栏右键菜单点击事件。 |
| off(type: 'rightMenuClick', callback?: Callback<emitter.EventData>): void | 注销状态栏右键菜单点击事件。 |
开发步骤
-
导入相关模块。
import { statusBarManager, StatusBarViewExtensionAbility } from '@kit.DeskTopExtensionKit';import { UIExtensionContentSession, Want } from '@kit.AbilityKit';import { image } from '@kit.ImageKit';import { resourceManager } from '@kit.LocalizationKit';import { emitter } from '@kit.BasicServicesKit'; -
新建一个MyStatusBarViewAbility.ets文件(例如在entry/src/main/ets/statusbarviewextensionability文件夹下),同时新建一个StatusBarPage的页面(例如在entry/src/main/ets/pages目录下),该页面用于在状态栏图标的左键业务弹窗中显示,然后构建自定义的StatusBarViewExtensionAbility。
let TAG = 'MyStatusBarViewExtAbility';export default class MyStatusBarViewAbility extends StatusBarViewExtensionAbility {onCreate() {console.info(TAG, `onCreate`);}onSessionCreate(want: Want, session: UIExtensionContentSession) {console.info(TAG, `onSessionCreate, want: ${want.abilityName}`);// pages/StatusBarPage为状态栏图标左键业务弹窗显示的页面session.loadContent('pages/StatusBarPage');}onForeground() {console.info(TAG, `onForeground`);}onBackground() {console.info(TAG, `onBackground`);}onSessionDestroy(session: UIExtensionContentSession) {console.info(TAG, `onSessionDestroy`);}onDestroy() {console.info(TAG, `onDestroy`);}} -
在MyStatusBarViewAbility所在模块下的module.json5文件中配置状态栏扩展Ability的信息。
"extensionAbilities": [{"name": "MyStatusBarViewAbility","icon": "$media:startIcon","description": "statusBar","type": "statusBarView","exported": true,// 此处为MyStatusBarViewAbility类所在的文件路径"srcEntry": "./ets/statusbarviewextensionability/MyStatusBarViewAbility.ets"}] -
在对应模块的rawfile文件夹(例如entry/src/main/resources/rawfile)下预置两张24vp * 24vp尺寸的图片(例如本示例中testWhite.png和testBlack.png两张图片),在页面组件内(如:index.ets)配置应用接入状态栏显示的图标信息。
let context: Context | undefined = this.getUIContext().getHostContext();if (!context) {console.error('getHostContext failed');return;}// 获取resourceManager资源管理器const resourceMgr: resourceManager.ResourceManager = context.resourceManager;// 创建white pixelMap,需在资源rawfile文件夹中预置testWhite.png图片,图片大小为24vp * 24vpconst whiteFileData = resourceMgr.getRawFileContentSync('testWhite.png');const whiteBuffer = whiteFileData.buffer;const whiteImageSource = image.createImageSource(whiteBuffer);let whitePixelMap = await whiteImageSource.createPixelMap();// 创建black pixelMap,需在资源rawfile文件夹中预置testBlack.png图片,图片大小为24vp * 24vpconst blackFileData = resourceMgr.getRawFileContentSync('testBlack.png');const blackBuffer = blackFileData.buffer;const blackImageSource = image.createImageSource(blackBuffer);let blackPixelMap = await blackImageSource.createPixelMap();// 构建图标信息let icon: statusBarManager.StatusBarIcon = {white: whitePixelMap,black: blackPixelMap} -
配置状态栏左键点击弹窗相关信息。
// 构建左键业务弹窗信息let operation: statusBarManager.QuickOperation = {// 此处abilityName为上述配置的module.json5中配置的自定义StatusBarViewExtensionAbility名称abilityName: "MyStatusBarViewAbility",title: "测试Demo",height: 300,// 可缺省moduleName: 'entry'}; -
(可选)配置状态栏右键菜单内容信息,可在状态栏图标的右键菜单中增加自定义菜单选项。
// 构建右键菜单项内容let subMenus: Array<statusBarManager.StatusBarSubMenuItem> = [];let subMenuItemAction: statusBarManager.StatusBarMenuAction = {abilityName: "EntryAbility"}let subMenu: statusBarManager.StatusBarSubMenuItem = {subTitle: "子菜单项",menuAction: subMenuItemAction}subMenus.push(subMenu);let statusBarMenuItems: Array<statusBarManager.StatusBarMenuItem> = [];let menuItem: statusBarManager.StatusBarMenuItem = {title: "一级菜单项",// 一级menuAction和subMenu两项不可都缺省subMenu: subMenus};statusBarMenuItems.push(menuItem);let statusBarGroupMenus: Array<statusBarManager.StatusBarGroupMenu> = [];statusBarGroupMenus.push(statusBarMenuItems); -
整合配置信息,接入状态栏,显示应用图标。
// 构建添加到状态栏的图标详细信息let item: statusBarManager.StatusBarItem = {icons: icon,quickOperation: operation,// 该参数可选statusBarGroupMenu: statusBarGroupMenus};try {statusBarManager.addToStatusBar(context, item);} catch (error) {console.error(`addToStatusBar failed. error code: ${error.code}, error message: ${error.message}`);} -
(可选)应用接入状态栏之后,可以通过updateStatusBarMenu接口更新状态栏的右键菜单。
// 构建右键菜单项内容let subMenus: Array<statusBarManager.StatusBarSubMenuItem> = [];let subMenuItemAction: statusBarManager.StatusBarMenuAction = {abilityName: "EntryAbility"}let subMenu: statusBarManager.StatusBarSubMenuItem = {subTitle: "二级菜单项",menuAction: subMenuItemAction}subMenus.push(subMenu);let statusBarMenuItems: Array<statusBarManager.StatusBarMenuItem> = [];let menuItem: statusBarManager.StatusBarMenuItem = {title: "一级菜单项",// 一级menuAction和subMenu两项不可都缺省subMenu: subMenus};statusBarMenuItems.push(menuItem);let statusBarGroupMenus: Array<statusBarManager.StatusBarGroupMenu> = [];statusBarGroupMenus.push(statusBarMenuItems);let context: Context | undefined = this.getUIContext().getHostContext();if (!context) {console.error('getHostContext failed');return;}try {statusBarManager.updateStatusBarMenu(context, statusBarGroupMenus);} catch (error) {console.error(`updateStatusBarMenu failed. error code: ${error.code}, error message: ${error.message}`);} -
(可选)应用接入状态栏之后,可以通过updateQuickOperationHeight接口更新状态栏图标左键业务弹窗的高度。
let context: Context | undefined = this.getUIContext().getHostContext();if (!context) {console.error('getHostContext failed');return;}let height = 200;statusBarManager.updateQuickOperationHeight(context, height); -
(可选)应用接入状态栏之后,可以通过updateStatusBarIcon接口将状态栏中对应的应用图标进行更改。
let context: Context | undefined = this.getUIContext().getHostContext();if (!context) {console.error('getHostContext failed');return;}// 获取resourceManager资源管理器const resourceMgr: resourceManager.ResourceManager = context.resourceManager;// 创建white pixelMap,需在资源rawfile文件夹中预置testWhite.png图片,图片大小为24vp * 24vpconst whiteFileData = resourceMgr.getRawFileContentSync('testWhite.png');const whiteBuffer = whiteFileData.buffer;const whiteImageSource = image.createImageSource(whiteBuffer);let whitePixelMap = await whiteImageSource.createPixelMap();// 创建black pixelMap,需在资源rawfile文件夹中预置testBlack.png图片,图片大小为24vp * 24vpconst blackFileData = resourceMgr.getRawFileContentSync('testBlack.png');const blackBuffer = blackFileData.buffer;const blackImageSource = image.createImageSource(blackBuffer);let blackPixelMap = await blackImageSource.createPixelMap();// 构建图标信息let icons: statusBarManager.StatusBarIcon = {white: whitePixelMap,black: blackPixelMap}statusBarManager.updateStatusBarIcon(context, icons); -
(可选)应用接入状态栏之后,且未指定图标QuickOperation的abilityName可以通过on/off接口自定义状态栏图标左键业务。
private onStatusBarIconClick = (eventData: emitter.EventData) => {// 自定义图标点击业务let data = eventData.data;if (data) {switch (data['iconClickType']) {case 'leftClickType':// 自定义左键点击业务break;default:break;}}}// 监听状态栏图标点击事件statusBarManager.on('statusBarIconClick', this.onStatusBarIconClick);// 注销状态栏图标点击事件statusBarManager.off('statusBarIconClick', this.onStatusBarIconClick); -
(可选)应用接入状态栏之后,调用updateStatusBarMenu接口,指定菜单StatusBarMenuAction的notifyOnly使能和menuCode菜单项标识,可以通过on/off接口自定义状态栏图标右键菜单点击业务。
private onRightMenuClick = (eventData: emitter.EventData) => {// 自定义图标右键菜单点击业务let data = eventData.data;if (data) {let menuCode = data['menuCode'] as string;// 处理点击菜单项业务}}// 监听状态栏图标右键菜单点击事件statusBarManager.on('rightMenuClick', this.onRightMenuClick);// 注销状态栏图标右键菜单点击事件statusBarManager.off('rightMenuClick', this.onRightMenuClick); -
(可选)应用接入状态栏之后,调用updateStatusBarHoverTips接口可以自定义图标hover时的显示内容。
let context: Context | undefined = this.getUIContext().getHostContext();if (!context) {console.error('getHostContext failed');return;}let hoverTips: string = 'hoverTips';try {await statusBarManager.updateStatusBarHoverTips(context, hoverTips);} catch (err) {console.error(`updateStatusBarHoverTips ${err.message} ${err.code}`)}
完整示例代码
完整示例代码请参见状态栏开放服务。