From 424ecb04fbb2a336791debdeb59dc61031dc5581 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Mon, 23 Jun 2025 14:21:51 +0800 Subject: [PATCH] sts_ui_extension onDestroyAsync Signed-off-by: zhangzezhong --- .../include/sts_ui_extension.h | 1 + .../src/sts_ui_extension.cpp | 86 +++++++++++-------- .../ets/ets/@ohos.app.ability.UIAbility.ets | 3 +- .../@ohos.app.ability.UIExtensionAbility.ets | 24 ++++-- frameworks/ets/ets/utils/AbilityUtils.ets | 12 +-- 5 files changed, 75 insertions(+), 51 deletions(-) diff --git a/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h b/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h index de2139dbc17..b921221dff9 100644 --- a/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h +++ b/frameworks/ets/ani/ui_extension_ability/include/sts_ui_extension.h @@ -194,6 +194,7 @@ private: sptr CreateUIWindow(const std::shared_ptr context, const sptr &sessionInfo); void ExecuteInsightIntentDone(uint64_t intentId, const InsightIntentExecuteResult &result); + bool BindNativeMethods(); STSRuntime& stsRuntime_; std::shared_ptr stsObj_ = nullptr; diff --git a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp index c2764a8e5ba..0649a02b091 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/sts_ui_extension.cpp @@ -43,35 +43,12 @@ namespace OHOS { namespace AbilityRuntime { using namespace OHOS::AppExecFwk; +namespace { +constexpr const char* UIEXTENSION_CLASS_NAME = "L@ohos/app/ability/UIExtensionAbility/UIExtensionAbility;"; -static constexpr char UIEXTENSION_CLASS_NAME[] = "L@ohos/app/ability/UIExtensionAbility/UIExtensionAbility;"; - -StsUIExtension* StsUIExtension::Create(const std::unique_ptr& runtime) -{ - return new (std::nothrow) StsUIExtension(static_cast(*runtime)); -} - -StsUIExtension::StsUIExtension(STSRuntime &stsRuntime) : stsRuntime_(stsRuntime) -{ -} - -StsUIExtension::~StsUIExtension() -{ - auto context = GetContext(); - if (context) { - context->Unbind(); - } - contentSessions_.clear(); -} - -void StsUIExtension::ResetEnv(ani_env* env) -{ - env->DescribeError(); - env->ResetError(); -} - -static void PromiseCallback(ani_env* env, ani_object aniObj) +void OnDestroyPromiseCallback(ani_env* env, ani_object aniObj) { + TAG_LOGD(AAFwkTag::UI_EXT, "OnDestroyPromiseCallback called"); if (env == nullptr || aniObj == nullptr) { TAG_LOGE(AAFwkTag::UI_EXT, "null env or null aniObj"); return; @@ -96,6 +73,33 @@ static void PromiseCallback(ani_env* env, ani_object aniObj) return; } } +} // namespace + +StsUIExtension* StsUIExtension::Create(const std::unique_ptr& runtime) +{ + return new (std::nothrow) StsUIExtension(static_cast(*runtime)); +} + +StsUIExtension::StsUIExtension(STSRuntime &stsRuntime) : stsRuntime_(stsRuntime) {} + +StsUIExtension::~StsUIExtension() +{ + auto context = GetContext(); + if (context) { + context->Unbind(); + } + contentSessions_.clear(); +} + +void StsUIExtension::ResetEnv(ani_env* env) +{ + if (env == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "env null"); + return; + } + env->DescribeError(); + env->ResetError(); +} void StsUIExtension::Init(const std::shared_ptr &record, const std::shared_ptr &application, std::shared_ptr &handler, @@ -133,23 +137,37 @@ void StsUIExtension::Init(const std::shared_ptr &record, TAG_LOGE(AAFwkTag::UI_EXT, "stsObj_ null"); return; } + if (!BindNativeMethods()) { + TAG_LOGE(AAFwkTag::UI_EXT, "BindNativeMethods failed"); + return; + } + BindContext(stsRuntime_.GetAniEnv(), record->GetWant()); + RegisterDisplayInfoChangedListener(); +} +bool StsUIExtension::BindNativeMethods() +{ auto env = stsRuntime_.GetAniEnv(); if (env == nullptr) { TAG_LOGE(AAFwkTag::UI_EXT, "null env"); - return; + return false; } std::array functions = { - ani_native_function { "nativeOnDestroyCallback", ":V", reinterpret_cast(PromiseCallback) }, + ani_native_function { "nativeOnDestroyCallback", ":V", reinterpret_cast(OnDestroyPromiseCallback) }, }; - ani_status status = ANI_ERROR; - if ((status = env->Class_BindNativeMethods(stsObj_->aniCls, functions.data(), functions.size())) != ANI_OK) { - TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); + ani_class cls {}; + ani_status status = env->FindClass(UIEXTENSION_CLASS_NAME, &cls); + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "FindClass failed status: %{public}d", status); + return false; } - BindContext(env, record->GetWant()); + if ((status = env->Class_BindNativeMethods(cls, functions.data(), functions.size())) != ANI_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "Class_BindNativeMethods status: %{public}d", status); + return false; SetExtensionCommon( EtsExtensionCommon::Create(stsRuntime_, static_cast(*stsObj_), shellContextRef_)); - RegisterDisplayInfoChangedListener(); + } + return true; } std::shared_ptr StsUIExtension::LoadModule(ani_env *env) diff --git a/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets b/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets index 783667f4e87..3ead39a392c 100644 --- a/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets +++ b/frameworks/ets/ets/@ohos.app.ability.UIAbility.ets @@ -52,8 +52,7 @@ export default class UIAbility { this.onDestroy(); return false; } - const isInherited = AbilityUtils.isInherited(derivedClassType, "onDestroyAsync", uiAbilityClassType); - if (isInherited === false) { + if (AbilityUtils.isOverride(derivedClassType, "onDestroyAsync", uiAbilityClassType)) { this.onDestroyAsync().then(() => this.nativeOnDestroyCallback()); return true; } diff --git a/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets b/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets index c0eb6724098..1109ad62986 100644 --- a/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets +++ b/frameworks/ets/ets/@ohos.app.ability.UIExtensionAbility.ets @@ -18,22 +18,29 @@ import ExtensionAbility from '@ohos.app.ability.ExtensionAbility'; import Want from '@ohos.app.ability.Want'; import UIExtensionContentSession from '@ohos.app.ability.UIExtensionContentSession'; import UIExtensionContext from 'application.UIExtensionContext'; +import { AbilityUtils } from './utils/AbilityUtils'; export default class UIExtensionAbility extends ExtensionAbility { - private isOnDestroyAsync: boolean = true; private destroyCallbackPoint: long; private native nativeOnDestroyCallback(): void; private callOnDestroy(): boolean { - let p = this.onDestroyAsync(); - if (this.isOnDestroyAsync) { - p.then((): void => { - this.nativeOnDestroyCallback(); - }); - } else { + const derivedClassType = AbilityUtils.getClassType(this); + if (derivedClassType === undefined) { this.onDestroy(); + return false; } - return this.isOnDestroyAsync; + const uiExtensionAbilityClassType = AbilityUtils.getClassType(new UIExtensionAbility()); + if (uiExtensionAbilityClassType === undefined) { + this.onDestroy(); + return false; + } + if (AbilityUtils.isOverride(derivedClassType, "onDestroyAsync", uiExtensionAbilityClassType)) { + this.onDestroyAsync().then(() => this.nativeOnDestroyCallback()); + return true; + } + this.onDestroy(); + return false; } context: UIExtensionContext = {}; @@ -51,7 +58,6 @@ export default class UIExtensionAbility extends ExtensionAbility { onDestroy(): void {} onDestroyAsync(): Promise { - this.isOnDestroyAsync = false; return new Promise((resolve: (a: undefined)=>void, reject: (err: Error)=>void): void => {}); } } diff --git a/frameworks/ets/ets/utils/AbilityUtils.ets b/frameworks/ets/ets/utils/AbilityUtils.ets index cf3f297f0c4..9ff9cb3bfb9 100644 --- a/frameworks/ets/ets/utils/AbilityUtils.ets +++ b/frameworks/ets/ets/utils/AbilityUtils.ets @@ -43,7 +43,7 @@ export class AbilityUtils { } } - public static isInherited(type: ClassType, methodName: string, stopBaseClassType: ClassType): boolean | undefined { + public static isOverride(type: ClassType, methodName: string, stopBaseClassType: ClassType): boolean | undefined { let currType = type; let level = 0; while (!currType.equals(stopBaseClassType)) { @@ -52,26 +52,26 @@ export class AbilityUtils { const method = currType.getMethod(methodIdx) if (method.getName().equals(methodName)) { if (!method.isInherited()) { - return false; + return true; } } } let baseType = currType.getBaseType(); if (baseType.equals(currType)) { - hilog.error(DOMAIN_ID, TAG, `isInherited: baseType equals currType (${currType.getName()})`); + hilog.error(DOMAIN_ID, TAG, `isOverride: baseType equals currType (${currType.getName()})`); return undefined; } level++; if (level >= LEVEL) { - hilog.error(DOMAIN_ID, TAG, `isInherited: inheritance level >= ${LEVEL}, aborting`); + hilog.error(DOMAIN_ID, TAG, `isOverride: inheritance level >= ${LEVEL}, aborting`); return undefined; } currType = baseType; } catch (err) { - hilog.error(DOMAIN_ID, TAG, `isInherited error: ${err}`); + hilog.error(DOMAIN_ID, TAG, `isOverride error: ${err}`); return undefined; } } - return true; + return false; } } \ No newline at end of file -- Gitee