鸿蒙NEXT开发App相关工具类(ArkTs)

鸿蒙布道师 鸿蒙布道师 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
 import bundleManager from '@ohos.bundle.bundleManager';
import { KeyboardAvoidMode, window } from '@kit.ArkUI';
import { common, ConfigurationConstant } from '@kit.AbilityKit';

/**
 * App相关工具类(使用该工具前请在UIAbility的onWindowStageCreate方法中调用AppUtil的init方法初始化)
 * author: 鸿蒙布道师
 * since: 2024/03/25
 */
export class AppUtil {
  private static context: common.UIAbilityContext; // 上下文

  /**
   * 初始化方法,缓存全局变量,在UIAbility的onCreate方法中初始化该方法。
   * @param context UIAbility上下文
   */
  static init(context: common.UIAbilityContext) {
    AppUtil.context = context;
  }

  /**
   * 获取上下文,common.UIAbilityContext
   * @returns UIAbility上下文
   */
  static getContext(): common.UIAbilityContext {
    if (!AppUtil.context) {
      throw new Error("请在UIAbility的onCreate方法中调用AppUtil的init方法初始化!");
    }
    return AppUtil.context;
  }

  /**
   * 获取WindowStage
   * @returns WindowStage
   */
  static getWindowStage(): window.WindowStage {
    return AppUtil.getContext().windowStage;
  }

  /**
   * 获取主窗口
   * @returns 主窗口
   */
  static getMainWindow(): window.Window {
    return AppUtil.getWindowStage().getMainWindowSync();
  }

  /**
   * 获取UIContext
   * @returns UIContext
   */
  static getUIContext(): UIContext {
    return AppUtil.getMainWindow().getUIContext();
  }

  /**
   * 设置灰阶,APP一键置灰。
   * @param grayScale 该参数为浮点数,取值范围为[0.0, 1.0]。
   * @param onlyMainWindow 是否只置灰主窗口,默认false。
   */
  static async setGrayScale(grayScale: number = 1.0, onlyMainWindow: boolean = false): Promise<void> {
    AppUtil.getMainWindow().setWindowGrayScale(grayScale);
    if (!onlyMainWindow) {
      const subWindows = await AppUtil.getWindowStage().getSubWindow();
      subWindows?.forEach((subWindow) => subWindow.setWindowGrayScale(grayScale));
    }
  }

  /**
   * 设置应用的颜色模式。仅支持主线程调用。
   * @param colorMode 颜色模式
   */
  static setColorMode(colorMode: ConfigurationConstant.ColorMode = ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET) {
    AppUtil.getContext().getApplicationContext().setColorMode(colorMode);
  }

  /**
   * 设置应用的字体类型。仅支持主线程调用。
   * @param font 字体类型
   */
  static setFont(font: string) {
    AppUtil.getContext().getApplicationContext().setFont(font);
  }

  /**
   * 获取当前窗口的属性
   * @param windowClass 窗口实例,默认主窗口
   * @returns 窗口属性
   */
  static getWindowProperties(windowClass: window.Window = AppUtil.getMainWindow()): window.WindowProperties {
    return windowClass.getWindowProperties();
  }

  /**
   * 获取虚拟键盘抬起时的页面避让模式
   * @returns 避让模式
   */
  static getKeyboardAvoidMode(): KeyboardAvoidMode {
    const mode = AppUtil.getUIContext().getKeyboardAvoidMode();
    if(typeof mode === 'string'){
      return mode === "KeyBoardAvoidMode.RESIZE" ? KeyboardAvoidMode.RESIZE : KeyboardAvoidMode.OFFSET;
    }
    return mode;
  }

  /**
   * 设置虚拟键盘弹出时,页面的避让模式。
   * @param value 避让模式
   * @returns 是否设置成功
   */
  static setKeyboardAvoidMode(value: KeyboardAvoidMode): boolean {
    try {
      AppUtil.getUIContext().setKeyboardAvoidMode(value);
      return true;
    } catch (err) {
      console.error('设置键盘避让模式失败:', err);
      return false;
    }
  }

  /**
   * 设置窗口的显示方向属性
   * @param orientation 显示方向
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setPreferredOrientation(orientation: window.Orientation, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setPreferredOrientation(orientation);
  }

  /**
   * 设置屏幕亮度值
   * @param brightness 屏幕亮度值,取值范围为[0.0, 1.0]或-1.0
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowBrightness(brightness: number, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowBrightness(brightness);
  }

  /**
   * 设置屏幕是否为常亮状态
   * @param isKeepScreenOn 是否常亮
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowKeepScreenOn(isKeepScreenOn: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowKeepScreenOn(isKeepScreenOn);
  }

  /**
   * 设置窗口是否为隐私模式
   * @param isPrivacyMode 是否隐私模式
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowPrivacyMode(isPrivacyMode: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowPrivacyMode(isPrivacyMode);
  }

  /**
   * 设置窗口的背景色
   * @param color 背景色
   * @param windowClass 窗口实例,默认主窗口
   */
  static setWindowBackgroundColor(color: string, windowClass: window.Window = AppUtil.getMainWindow()) {
    try {
      windowClass.setWindowBackgroundColor(color);
    } catch (err) {
      console.error('设置窗口背景色失败:', err);
    }
  }

  /**
   * 设置点击时是否支持切换焦点窗口
   * @param isFocusable 是否支持切换焦点窗口
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowFocusable(isFocusable: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowFocusable(isFocusable);
  }

  /**
   * 设置窗口是否为可触状态
   * @param isTouchable 是否可触
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowTouchable(isTouchable: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowTouchable(isTouchable);
  }

  /**
   * 获取状态栏的高度,单位为px。
   * @returns 状态栏高度
   */
  static getStatusBarHeight(): number {
    try {
      const avoidArea = AppUtil.getMainWindow().getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
      return avoidArea.topRect.height;
    } catch (err) {
      console.error('获取状态栏高度失败:', err);
      return 0;
    }
  }

  /**
   * 获取底部导航条的高度,单位为px。
   * @returns 导航条高度
   */
  static getNavigationIndicatorHeight(): number {
    try {
      const avoidArea = AppUtil.getMainWindow().getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR);
      return avoidArea.bottomRect.height;
    } catch (err) {
      console.error('获取导航条高度失败:', err);
      return 0;
    }
  }

  /**
   * 设置沉浸式状态栏
   * @param isLayoutFullScreen 是否沉浸式布局
   * @param enable 是否显示状态栏和导航栏
   * @param color 窗口背景颜色
   * @param systemBarProperties 状态栏和导航栏属性
   */
  static async setStatusBar(isLayoutFullScreen: boolean = true, enable: boolean = true, color: string = '#FFFFFF', systemBarProperties?: window.SystemBarProperties) {
    try {
      const windowClass = AppUtil.getMainWindow();
      await windowClass.setWindowLayoutFullScreen(isLayoutFullScreen);
      windowClass.setWindowBackgroundColor(color);
      await windowClass.setWindowSystemBarEnable(enable ? ['status', 'navigation'] : []);
      await windowClass.setSpecificSystemBarEnabled("navigationIndicator", enable);
      if (systemBarProperties) {
        await windowClass.setWindowSystemBarProperties(systemBarProperties);
      }
    } catch (err) {
      console.error('设置沉浸式状态栏失败:', err);
    }
  }

  /**
   * 获取当前应用的BundleInfo
   * @param sync 是否同步获取,默认异步
   * @returns BundleInfo
   */
  static async getBundleInfo(sync: boolean = false): Promise<bundleManager.BundleInfo> {
    return sync ? bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) : bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
  }

  /**
   * 获取应用包的名称。
   * @returns 应用包名
   */
  static async getBundleName(): Promise<string> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.name;
  }

  /**
   * 获取应用版本号。
   * @returns 版本号
   */
  static async getVersionCode(): Promise<number> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.versionCode;
  }

  /**
   * 获取应用版本名。
   * @returns 版本名
   */
  static async getVersionName(): Promise<string> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.versionName;
  }

  /**
   * 获取运行应用包所需要最高SDK版本号。
   * @returns 目标版本号
   */
  static async getTargetVersion(): Promise<number> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.targetVersion;
  }

  /**
   * 获取应用程序的配置信息
   * @returns 应用信息
   */
  static async getAppInfo(): Promise<bundleManager.ApplicationInfo> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.appInfo;
  }

  /**
   * 主动退出整个应用
   */
  static exit() {
    AppUtil.getContext().terminateSelf();
    AppUtil.getContext().getApplicationContext().killAllProcesses();
  }
}

代码如下:

import bundleManager from '@ohos.bundle.bundleManager';
import { KeyboardAvoidMode, window } from '@kit.ArkUI';
import { common, ConfigurationConstant } from '@kit.AbilityKit';

/**
 * App相关工具类(使用该工具前请在UIAbility的onWindowStageCreate方法中调用AppUtil的init方法初始化)
 * author: 鸿蒙布道师
 * since: 2024/03/25
 */
export class AppUtil {
  private static context: common.UIAbilityContext; // 上下文

  /**
   * 初始化方法,缓存全局变量,在UIAbility的onCreate方法中初始化该方法。
   * @param context UIAbility上下文
   */
  static init(context: common.UIAbilityContext) {
    AppUtil.context = context;
  }

  /**
   * 获取上下文,common.UIAbilityContext
   * @returns UIAbility上下文
   */
  static getContext(): common.UIAbilityContext {
    if (!AppUtil.context) {
      throw new Error("请在UIAbility的onCreate方法中调用AppUtil的init方法初始化!");
    }
    return AppUtil.context;
  }

  /**
   * 获取WindowStage
   * @returns WindowStage
   */
  static getWindowStage(): window.WindowStage {
    return AppUtil.getContext().windowStage;
  }

  /**
   * 获取主窗口
   * @returns 主窗口
   */
  static getMainWindow(): window.Window {
    return AppUtil.getWindowStage().getMainWindowSync();
  }

  /**
   * 获取UIContext
   * @returns UIContext
   */
  static getUIContext(): UIContext {
    return AppUtil.getMainWindow().getUIContext();
  }

  /**
   * 设置灰阶,APP一键置灰。
   * @param grayScale 该参数为浮点数,取值范围为[0.0, 1.0]。
   * @param onlyMainWindow 是否只置灰主窗口,默认false。
   */
  static async setGrayScale(grayScale: number = 1.0, onlyMainWindow: boolean = false): Promise<void> {
    AppUtil.getMainWindow().setWindowGrayScale(grayScale);
    if (!onlyMainWindow) {
      const subWindows = await AppUtil.getWindowStage().getSubWindow();
      subWindows?.forEach((subWindow) => subWindow.setWindowGrayScale(grayScale));
    }
  }

  /**
   * 设置应用的颜色模式。仅支持主线程调用。
   * @param colorMode 颜色模式
   */
  static setColorMode(colorMode: ConfigurationConstant.ColorMode = ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET) {
    AppUtil.getContext().getApplicationContext().setColorMode(colorMode);
  }

  /**
   * 设置应用的字体类型。仅支持主线程调用。
   * @param font 字体类型
   */
  static setFont(font: string) {
    AppUtil.getContext().getApplicationContext().setFont(font);
  }

  /**
   * 获取当前窗口的属性
   * @param windowClass 窗口实例,默认主窗口
   * @returns 窗口属性
   */
  static getWindowProperties(windowClass: window.Window = AppUtil.getMainWindow()): window.WindowProperties {
    return windowClass.getWindowProperties();
  }

  /**
   * 获取虚拟键盘抬起时的页面避让模式
   * @returns 避让模式
   */
  static getKeyboardAvoidMode(): KeyboardAvoidMode {
    const mode = AppUtil.getUIContext().getKeyboardAvoidMode();
    if(typeof mode === 'string'){
      return mode === "KeyBoardAvoidMode.RESIZE" ? KeyboardAvoidMode.RESIZE : KeyboardAvoidMode.OFFSET;
    }
    return mode;
  }

  /**
   * 设置虚拟键盘弹出时,页面的避让模式。
   * @param value 避让模式
   * @returns 是否设置成功
   */
  static setKeyboardAvoidMode(value: KeyboardAvoidMode): boolean {
    try {
      AppUtil.getUIContext().setKeyboardAvoidMode(value);
      return true;
    } catch (err) {
      console.error('设置键盘避让模式失败:', err);
      return false;
    }
  }

  /**
   * 设置窗口的显示方向属性
   * @param orientation 显示方向
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setPreferredOrientation(orientation: window.Orientation, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setPreferredOrientation(orientation);
  }

  /**
   * 设置屏幕亮度值
   * @param brightness 屏幕亮度值,取值范围为[0.0, 1.0]或-1.0
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowBrightness(brightness: number, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowBrightness(brightness);
  }

  /**
   * 设置屏幕是否为常亮状态
   * @param isKeepScreenOn 是否常亮
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowKeepScreenOn(isKeepScreenOn: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowKeepScreenOn(isKeepScreenOn);
  }

  /**
   * 设置窗口是否为隐私模式
   * @param isPrivacyMode 是否隐私模式
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowPrivacyMode(isPrivacyMode: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowPrivacyMode(isPrivacyMode);
  }

  /**
   * 设置窗口的背景色
   * @param color 背景色
   * @param windowClass 窗口实例,默认主窗口
   */
  static setWindowBackgroundColor(color: string, windowClass: window.Window = AppUtil.getMainWindow()) {
    try {
      windowClass.setWindowBackgroundColor(color);
    } catch (err) {
      console.error('设置窗口背景色失败:', err);
    }
  }

  /**
   * 设置点击时是否支持切换焦点窗口
   * @param isFocusable 是否支持切换焦点窗口
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowFocusable(isFocusable: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowFocusable(isFocusable);
  }

  /**
   * 设置窗口是否为可触状态
   * @param isTouchable 是否可触
   * @param windowClass 窗口实例,默认主窗口
   */
  static async setWindowTouchable(isTouchable: boolean, windowClass: window.Window = AppUtil.getMainWindow()): Promise<void> {
    return windowClass.setWindowTouchable(isTouchable);
  }

  /**
   * 获取状态栏的高度,单位为px。
   * @returns 状态栏高度
   */
  static getStatusBarHeight(): number {
    try {
      const avoidArea = AppUtil.getMainWindow().getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
      return avoidArea.topRect.height;
    } catch (err) {
      console.error('获取状态栏高度失败:', err);
      return 0;
    }
  }

  /**
   * 获取底部导航条的高度,单位为px。
   * @returns 导航条高度
   */
  static getNavigationIndicatorHeight(): number {
    try {
      const avoidArea = AppUtil.getMainWindow().getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR);
      return avoidArea.bottomRect.height;
    } catch (err) {
      console.error('获取导航条高度失败:', err);
      return 0;
    }
  }

  /**
   * 设置沉浸式状态栏
   * @param isLayoutFullScreen 是否沉浸式布局
   * @param enable 是否显示状态栏和导航栏
   * @param color 窗口背景颜色
   * @param systemBarProperties 状态栏和导航栏属性
   */
  static async setStatusBar(isLayoutFullScreen: boolean = true, enable: boolean = true, color: string = '#FFFFFF', systemBarProperties?: window.SystemBarProperties) {
    try {
      const windowClass = AppUtil.getMainWindow();
      await windowClass.setWindowLayoutFullScreen(isLayoutFullScreen);
      windowClass.setWindowBackgroundColor(color);
      await windowClass.setWindowSystemBarEnable(enable ? ['status', 'navigation'] : []);
      await windowClass.setSpecificSystemBarEnabled("navigationIndicator", enable);
      if (systemBarProperties) {
        await windowClass.setWindowSystemBarProperties(systemBarProperties);
      }
    } catch (err) {
      console.error('设置沉浸式状态栏失败:', err);
    }
  }

  /**
   * 获取当前应用的BundleInfo
   * @param sync 是否同步获取,默认异步
   * @returns BundleInfo
   */
  static async getBundleInfo(sync: boolean = false): Promise<bundleManager.BundleInfo> {
    return sync ? bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) : bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
  }

  /**
   * 获取应用包的名称。
   * @returns 应用包名
   */
  static async getBundleName(): Promise<string> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.name;
  }

  /**
   * 获取应用版本号。
   * @returns 版本号
   */
  static async getVersionCode(): Promise<number> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.versionCode;
  }

  /**
   * 获取应用版本名。
   * @returns 版本名
   */
  static async getVersionName(): Promise<string> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.versionName;
  }

  /**
   * 获取运行应用包所需要最高SDK版本号。
   * @returns 目标版本号
   */
  static async getTargetVersion(): Promise<number> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.targetVersion;
  }

  /**
   * 获取应用程序的配置信息
   * @returns 应用信息
   */
  static async getAppInfo(): Promise<bundleManager.ApplicationInfo> {
    const bundleInfo = await AppUtil.getBundleInfo();
    return bundleInfo.appInfo;
  }

  /**
   * 主动退出整个应用
   */
  static exit() {
    AppUtil.getContext().terminateSelf();
    AppUtil.getContext().getApplicationContext().killAllProcesses();
  }
}

 

 

...全文

相关推荐

一个基于ArkTS开源的鸿蒙next版的物流APP源代码

一个基于ArkTS开源的鸿蒙next版的物流APP源代码

程序员柳

鸿蒙NEXT开发指南[项目源码]

本文详细介绍了鸿蒙HarmonyOS NEXT星河版APP应用开发的第二阶段内容,包括鸿蒙应用界面开发、ArkTS语法进阶以及界面交互功能。在界面开发部分,重点讲解了弹性布局Flex的语法、主轴方向、对齐方式、换行等核心概念,并通过示例代码展示了如何实现各种布局效果。ArkTS语法进阶部分涵盖了字符串拼接、类型转换、运算符、数组操作、条件语句和循环语句等基础语法知识。界面交互功能部分则介绍了点击事件、状态管理、ForEach渲染控制等实用功能,并通过多个实际案例(如B站视频卡片、支付宝首页、美团购物车等)展示了如何将这些知识应用到实际开发中。

5f4d3s2a1q

鸿蒙 ArkTS 网易云仿制

【鸿蒙ArkTS仿网易云】项目是为华为鸿蒙操作系统(HarmonyOS)开发的应用示例,模仿网易云音乐的功能。项目使用ArkTS,一种基于TypeScript的编程语言,结合了静态类型检查和鸿蒙OS的运行环境,支持跨平台开发。ArkTS语法类似JavaScript和TypeScript,降低了学习成本。项目可能包含主模块或入口文件,负责核心逻辑,如用户界面布局、音乐播放控制和数据接口调用。开发者利用鸿蒙的API实现界面、音乐播放、数据同步、存储管理、模块化开发、性能优化和设备适配等功能。该项目涵盖了用户界面设计、多媒体处理、网络通信和数据管理,对掌握鸿蒙开发流程和技术栈有较高参考价值。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

2401_89793006

鸿蒙HarmonyOS NEXT旅游出行App源码-渝客行ArkTS项目实战

本资源为基于鸿蒙HarmonyOS NEXT(ArkTS语言)开发的综合旅游出行服务平台完整项目源码,项目名称为“渝客行”(Yukexing)。该应用围绕城市及周边出行场景,实现了包括首页轮播推荐、出发地与目的地选择、日历日期组件、机场快线订票、城际快线查询、旅游线路浏览预订、换乘方案规划、包车服务、热门产品展示、两江游船票预订、直通车票务等核心业务模块。在用户体系方面,涵盖手机号注册登录(含图形验证码校验)、密码重置、个人信息编辑、常用地址管理、常用联系人管理、订单全流程管理、电子票查看、优惠券领取与使用、积分体系、卡包、消息中心、意见反馈及常见问题等功能。项目采用MVVM架构进行分层设计,目录结构清晰,包含Data数据层、Model模型层、View视图层、Component公共组件和Util工具类,共计20余个业务页面,配套丰富的UI素材资源。适用于鸿蒙HarmonyOS NEXT应用开发入门参考、毕业设计选题或实际项目练手。

跟风舞烟学编程

HarmonyOS NEXT记账App开发[源码]

本文是一篇详细的HarmonyOS NEXT开发教程,手把手教你如何在30分钟内开发一个功能完整的记账App。教程从项目创建开始,逐步介绍了数据结构设计、数据服务管理、首页仪表盘设计、记账页面实现、账单列表页面开发以及路由配置等核心内容。通过这个项目,开发者可以学习到ArkTS基础语法、组件化开发、Canvas图表绘制、数据持久化以及页面路由等HarmonyOS NEXT开发的核心技能。教程还提供了常见问题解答和下一步学习建议,适合初学者快速上手鸿蒙应用开发。

a2b3c4d5e
评论
收藏 已收藏
分享
返回顶部