HarmonyOS鸿蒙Next中关于getContext(this)被废弃问题

HarmonyOS鸿蒙Next中关于getContext(this)被废弃问题 目前官方文档getContext(this)在API18已经被废弃使用,更改为this.getUIContext()?.getHostContext(),如果用户的设备版本比较低,那么他使用新API的应用时,是否会出现问题

6 回复

【背景知识】

  • getContext:获取与页面上下文组件关联的Context对象。
    • 从API version 18开始废弃,建议使用UIContext中的getHostContext替代。
    • 从API version 12开始,可以通过使用UIContext中的getHostContext来明确UI的执行上下文。
  • getHostContext:获得当前元能力的Context。

【解决方案】

getHostContext()是api12的接口,只要api12及以上设备都可以正常使用,一般不会出现问题。

更多关于HarmonyOS鸿蒙Next中关于getContext(this)被废弃问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


新API this.getUIContext()?.getHostContext() 仅在 API 18及以上 版本有效,低版本设备(API <18)无法识别该方法

可以采用条件编译方案

// 高版本实现(API≥18)
// getContextV18.ets
export function getContext(comp: any): Context | undefined {
  return comp.getUIContext()?.getHostContext();
}

// 低版本实现(API<18)
// getContextLegacy.ets
export function getContext(comp: any): Context | undefined {
  return getContext(comp); // 继续调用旧API
}

this.getUIContext()?.getHostContext()从API 18开始引入,低版本设备无法识别此方法,getContext(this)虽被废弃但仍保留,在低版本中可继续使用。

兼容性处理方案

// 运行时判断API版本

import { platform } from '@kit.ArkUI';

let context: any;

if (platform.apiVersion >= 18) {

  const uiContext = this.getUIContext();

  context = uiContext ? uiContext.getHostContext() : undefined;

} else {

  context = getContext(this); // 兼容旧版本

}

this.getUIContext()?.getHostContext()在API 12就开始引入了,不需要做API版本判断。

在HarmonyOS Next中,getContext(this)已被废弃。替代方案是使用getContext()方法,该方法无需传入参数即可获取当前组件的上下文。这是API演进的一部分,旨在简化调用方式并提升一致性。开发者应直接调用getContext()来获取上下文对象。

在HarmonyOS Next中,getContext(this) 被废弃并替换为 this.getUIContext()?.getHostContext(),主要是为了提供更清晰、类型安全的上下文获取方式,并适配新的UI框架架构。

关于您担心的低版本设备兼容性问题,答案是:如果应用仅适配HarmonyOS Next(API 18及以上),则不会出现问题。但如果应用需要兼容旧版本HarmonyOS(API 9-17),则必须进行版本兼容处理。

具体原因和处理方案如下:

  1. API版本隔离:HarmonyOS Next是一个独立的操作系统版本,其应用开发基于全新的ArkTS声明式UI范式(Stage模型)和API。为Next开发的应用使用其专属的SDK进行编译构建,生成的HAP包无法安装或运行在旧的HarmonyOS(通常称为“API 9-17”或“传统HarmonyOS”)设备上。因此,一个纯粹为HarmonyOS Next(API 18+)开发的应用,在运行时环境上已经保证了API的可用性,使用新API不会在低版本上触发问题,因为根本不会在低版本上运行。

  2. 需要向下兼容时的处理:如果您的工程是一个**需要同时支持旧HarmonyOS(API 9-17)和HarmonyOS Next(API 18+)**的“跨版本兼容应用”,则必须在代码中进行API版本的运行时判断和适配。您不能直接使用新的 getUIContext() API,因为它在API 18以下版本中不存在。

    推荐的做法是使用条件编译和运行时能力判断:

    // 方法一:使用运行时API版本判断(推荐)
    import { BusinessError } from '@ohos.base';
    import common from '@ohos.app.ability.common';
    
    let context: common.UIAbilityContext | null = null;
    try {
      // 首先检查新API是否可用
      if (typeof this.getUIContext !== 'undefined') {
        // 运行在API 18+ (HarmonyOS Next) 环境
        context = this.getUIContext()?.getHostContext() as common.UIAbilityContext;
      } else {
        // 降级到旧API,运行在API 9-17 (传统HarmonyOS) 环境
        // @ts-ignore  // 忽略旧API的类型检查警告
        context = getContext(this) as common.UIAbilityContext;
      }
    } catch (err) {
      const error: BusinessError = err as BusinessError;
      console.error(`Failed to get context: code ${error.code}, message ${error.message}`);
    }
    
    // 方法二:使用条件编译(需在构建时区分目标)
    // 在HarmonyOS Next的编译条件下
    // #if API_VERSION >= 18
    let contextNext = this.getUIContext()?.getHostContext();
    // #endif
    
    // 在传统HarmonyOS的编译条件下
    // #if API_VERSION >= 9 && API_VERSION < 18
    // @ts-ignore
    let contextLegacy = getContext(this);
    // #endif
    

    工程配置:对于跨版本兼容应用,您需要在项目的 build-profile.json5 或模块级的 build-profile.json5 中,通过 targets 配置项为不同的目标API版本创建不同的构建目标,并可能使用不同的SDK。

总结:

  • 仅开发HarmonyOS Next应用:可安全使用 this.getUIContext()?.getHostContext(),无需担心低版本问题。
  • 开发跨版本兼容应用:必须通过运行时判断或条件编译来区分API调用,确保在旧版本系统上回退到 getContext(this),在新版本上使用新API。
回到顶部