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

简介: 这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。

 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();
  }
}

image.gif


相关文章
|
1月前
|
缓存 移动开发 JavaScript
如何优化UniApp开发的App的启动速度?
如何优化UniApp开发的App的启动速度?
344 139
|
23天前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
327 36
|
24天前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
160 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
222 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
29天前
|
人工智能 前端开发 JavaScript
最佳实践3:用通义灵码开发一款 App
本示例演示使用通义灵码,基于React Native与Node.js开发跨平台类通义App,重点展示iOS端实现。涵盖前端页面生成、后端代码库自动生成、RTK Query通信集成及Qwen API调用全过程,体现灵码在全栈开发中的高效能力。(238字)
203 11
|
30天前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
100 0
|
移动开发 Ubuntu 网络协议
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(中)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令
351 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(中)
|
XML Web App开发 开发框架
鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转
准备好鸿蒙开发环境后,接下来就需要创建鸿蒙项目,掌握项目的创建过程以及配置。项目创建好后,需要把项目运行在模拟器上,鸿蒙的模拟和安卓模拟器有些不同,鸿蒙提供远程模拟器和本地模拟器,通过登录华为账号登录在线模拟器,使用DevEco Studio可将项目部署到远程模拟器中。
1680 1
鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转
|
存储 Ubuntu 前端开发
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(下)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令
602 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(下)
|
存储 编解码 Ubuntu
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(上)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令
341 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发 (二)Ubuntu操作入门与Linux常用命令(上)

热门文章

最新文章