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. |