Análisis Práctico de Desarrollo en HarmonyOS: Migración de API y Cambio de Interfaces de Contexto

Introducción a la Migración entre Modelos en HarmonyOS

En el desarrollo para HarmonyOS, la transición del modelo FA al modelo Stage implica cambios significativos en las interfaces de API y Contexto. Esto se debe a diferencias en los modelos de hilos y procesos. Las interfaces marcadas con FAModelOnly solo están disponibles en el modelo FA, por lo que al cambiar al modelo Stage, es necesario reemplazarlas con las interfaces correspondientes. A continuación, se analiza un ejemplo práctico de migración para la API startAbility.

Ejemplo de Migración para startAbility

En el modelo FA, se utiliza featureAbility para iniciar habilidades. En el modelo Stage, se accede a través del contexto de UIAbility. Aquí se muestra cómo se adapta el código:

Implementación en el Modelo FA


import { featureAbility } from '@ohos.ability.featureAbility';
import { Want } from '@ohos.app.ability.Want';

const IDENTIFICADOR_LOG: string = 'ComponentePrincipal';

@Entry
@Component
struct PaginaInicio {
  build() {
    Button('Lanzar Habilidad')
      .onClick(async () => {
        try {
          console.info(IDENTIFICADOR_LOG, 'Iniciando proceso de habilidad');
          let datosSolicitud: Want = {
            bundleName: 'ejemplo.aplicacion.modeloFA',
            moduleName: 'moduloBase',
            abilityName: 'ejemplo.aplicacion.modeloFA.HabilidadPagina'
          };
          await featureAbility.startAbility({ want: datosSolicitud });
          console.info(IDENTIFICADOR_LOG, 'Habilidad iniciada exitosamente');
        } catch (excepcion) {
          console.error(IDENTIFICADOR_LOG, 'Error durante el inicio: ' + excepcion);
        }
      })
  }
}

Implementación en el Modelo Stage


import { Want } from '@ohos.app.ability.Want';
import { common } from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';

@Entry
@Component
struct VistaPrincipal {
  private contextoApp = getContext(this) as common.UIAbilityContext;

  build() {
    Button('Ejecutar Habilidad')
      .onClick(() => {
        let parametros: Want = {
          bundleName: "com.ejemplo.miaplicacion",
          abilityName: "HabilidadEntrada"
        };
        this.contextoApp.startAbility(parametros).then(() => {
          console.log('Operación completada con éxito.');
        }).catch((error: BusinessError) => {
          console.error('Fallo en la ejecución: ' + error);
        })
      })
  }
}

Mapeo de Interfaces de Contexto

La migración de interfaces de Contexto entre modelos requiere ajustes específicos. A continuación, se presenta una tabla que describe las equivalencias y cambios necesarios al pasar del modeelo FA al modelo Stage.

Interfaz en Modelo FA Archivo d.ts Correspondiente en Modelo Stage Interfza o Campo Equivalente en Modelo Stage
getOrCreateLocalDir(callback: AsyncCallback<string>): void; getOrCreateLocalDir(): Promise<string>; Sin correspondencia en Stage El modelo Stage no permite operaciones en el directorio raíz de la aplicación; no se provee una interfaz equivalente.
verifyPermission(permission: string, options: PermissionOptions, callback: AsyncCallback<number>): void; verifyPermission(permission: string, callback: AsyncCallback<number>): void; verifyPermission(permission: string, options?: PermissionOptions): Promise<number>; @ohos.abilityAccessCtrl.d.ts verifyAccessTokenSync(tokenID: number, permissionName: Permissions): GrantStatus; verifyAccessToken(tokenID: number, permissionName: Permissions): Promise<GrantStatus>;
requestPermissionsFromUser(permissions: Array<string>, requestCode: number, resultCallback: AsyncCallback<PermissionRequestResult>): void; requestPermissionsFromUser(permissions: Array<string>, requestCode: number): Promise<PermissionRequestResult>; @ohos.abilityAccessCtrl.d.ts requestPermissionsFromUser(context: Context, permissionList: Array<Permissions>, requestCallback: AsyncCallback<PermissionRequestResult>): void; requestPermissionsFromUser(context: Context, permissionList: Array<Permissions>): Promise<PermissionRequestResult>;
getApplicationInfo(callback: AsyncCallback<ApplicationInfo>): void; getApplicationInfo(): Promise<ApplicationInfo>; application/Context.d.ts applicationInfo: ApplicationInfo;
getBundleName(callback: AsyncCallback<string>): void; getBundleName(): Promise<string>; application/UIAbilityContext.d.ts abilityInfo.bundleName: string;
getDisplayOrientation(callback: AsyncCallback<bundle.DisplayOrientation>): void; getDisplayOrientation(): Promise<bundle.DisplayOrientation>; @ohos.screen.d.ts readonly orientation: Orientation;
setDisplayOrientation(orientation: bundle.DisplayOrientation, callback: AsyncCallback<void>): void; setDisplayOrientation(orientation: bundle.DisplayOrientation): Promise<void>; @ohos.screen.d.ts setOrientation(orientation: Orientation, callback: AsyncCallback<void>): void; setOrientation(orientation: Orientation): Promise<void>;
setShowOnLockScreen(show: boolean, callback: AsyncCallback<void>): void; setShowOnLockScreen(show: boolean): Promise<void>; @ohos.window.d.ts setShowOnLockScreen(showOnLockScreen: boolean): void;
setWakeUpScreen(wakeUp: boolean, callback: AsyncCallback<void>): void; setWakeUpScreen(wakeUp: boolean): Promise<void>; @ohos.window.d.ts setWakeUpScreen(wakeUp: boolean): void;
getProcessInfo(callback: AsyncCallback<ProcessInfo>): void; getProcessInfo(): Promise<ProcessInfo>; @ohos.app.ability.abilityManager.d.ts getAbilityRunningInfos(callback: AsyncCallback<Array<AbilityRunningInfo>>): void; getAbilityRunningInfos(): Promise<Array<AbilityRunningInfo>>;
getElementName(callback: AsyncCallback<ElementName>): void; getElementName(): Promise<ElementName>; application/UIAbilityContext.d.ts abilityInfo.name: string; abilityInfo.bundleName: string;
getProcessName(callback: AsyncCallback<string>): void; getProcessName(): Promise<string>; @ohos.app.ability.abilityManager.d.ts getAbilityRunningInfos(callback: AsyncCallback<Array<AbilityRunningInfo>>): void; getAbilityRunningInfos(): Promise<Array<AbilityRunningInfo>>;
getCallingBundle(callback: AsyncCallback<string>): void; getCallingBundle(): Promise<string>; Sin correspondencia en Stage En el modelo Stage, se puede usar el parámetro ohos.aafwk.param.callerUid en Want.parameters para obtener información del llamador.
getFilesDir(callback: AsyncCallback<string>): void; getFilesDir(): Promise<string>; application/Context.d.ts filesDir: string;
getCacheDir(callback: AsyncCallback<string>): void; getCacheDir(): Promise<string>; application/Context.d.ts cacheDir: string;
getOrCreateDistributedDir(callback: AsyncCallback<string>): void; getOrCreateDistributedDir(): Promise<string>; application/Context.d.ts distributedFilesDir: string;
getAppType(callback: AsyncCallback<strinng>): void; getAppType(): Promise<string>; application/UIAbilityContext.d.ts Se obtiene a través de la propiedad type del campo abilityInfo: abilityInfo.type: bundleManager.AbilityType;
getHapModuleInfo(callback: AsyncCallback<HapModuleInfo>): void; getHapModuleInfo(): Promise<HapModuleInfo>; application/UIAbilityContext.d.ts currentHapModuleInfo: HapModuleInfo;
getAppVersionInfo(callback: AsyncCallback<AppVersionInfo>): void; getAppVersionInfo(): Promise<AppVersionInfo>; bundle/bundleInfo.d.ts readonly name: string; readonly versionCode: number; readonly versionName: string;
getApplicationContext(): Context; application/Context.d.ts getApplicationContext(): ApplicationContext;
getAbilityInfo(callback: AsyncCallback<AbilityInfo>): void; getAbilityInfo(): Promise<AbilityInfo>; application/UIAbilityContext.d.ts abilityInfo: AbilityInfo;
isUpdatingConfigurations(callback: AsyncCallback<boolean>): void; isUpdatingConfigurations(): Promise<boolean>; Sin correspondencia en Stage En el modelo Stage, la aplicación no se reinicia ante cambios ambientales; se notifica mediante la interfaz onConfigurationUpdated, que en el modelo FA era una implementación vacía.
printDrawnCompleted(callback: AsyncCallback<void>): void; printDrawnCompleted(): Promise<void>; Sin correspondencia en Stage Esta interfaz en el modelo FA es una implementación vacía y no afecta la funcionalidad; el modelo Stage no la provee.

Etiquetas: HarmonyOS ArkTS API-Migration Context-API FA-Model

Publicado el 6-25 19:19