diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..c8ef5f0fe8425b5a7dde31275ed2da90c6089530 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,66 @@ +{ + "files.associations": { + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "cinttypes": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "codecvt": "cpp", + "condition_variable": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "shared_mutex": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/frameworks/native/ability/native/ability_impl.cpp b/frameworks/native/ability/native/ability_impl.cpp index 2048450b451a52f64650e7ea97f434ae6bb6c0cc..a44540960e09933d727e7583d021c61b526ce6c9 100644 --- a/frameworks/native/ability/native/ability_impl.cpp +++ b/frameworks/native/ability/native/ability_impl.cpp @@ -141,7 +141,7 @@ void AbilityImpl::Stop(bool &isAsyncCallback) }; callbackInfo->Push(asyncCallback); - ability_->OnStop(callbackInfo, isAsyncCallback); + ability_->OnStop(callbackInfo, isAsyncCallback);//该调用没有实现异步。 if (!isAsyncCallback) { StopCallback(); AbilityTransactionCallbackInfo<>::Destroy(callbackInfo); diff --git a/frameworks/native/ability/native/extension.cpp b/frameworks/native/ability/native/extension.cpp index 4d9445623a7b9a5d8cd525965a164139576d361f..cc196ec63638ea3b1af553bb640fc90fe57d5aa3 100644 --- a/frameworks/native/ability/native/extension.cpp +++ b/frameworks/native/ability/native/extension.cpp @@ -20,6 +20,9 @@ #include "extension_context.h" #include "hilog_wrapper.h" #include "hitrace_meter.h" +#include "ability_lifecycle_executor.h" +#include "ability_lifecycle_interface.h" +#include "ability_lifecycle.h" namespace OHOS { namespace AbilityRuntime { @@ -54,9 +57,25 @@ void Extension::OnStart(const AAFwk::Want &want, sptr sessio SetLastRequestWant(want); } -void Extension::OnStop() -{ +void Extension::OnStop(){ HILOG_DEBUG("extension:%{public}s.", abilityInfo_->name.c_str()); + // if (abilityLifecycleExecutor_ == nullptr) { + // HILOG_ERROR("Extension::OnStop error. abilityLifecycleExecutor_ == nullptr."); + // return; + // } + // abilityLifecycleExecutor_->DispatchLifecycleState(AppExecFwk::AbilityLifecycleExecutor::LifecycleState::INITIAL); + // if (lifecycle_ == nullptr) { + // HILOG_ERROR("Extension::OnStop error. lifecycle_ == nullptr."); + // return; + // } + // lifecycle_->DispatchLifecycle(AppExecFwk::LifeCycle::Event::ON_STOP); + HILOG_DEBUG("%{public}s end", __func__); +} + +void Extension::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback) +{ + isAsyncCallback = false; + OnStop(); } sptr Extension::OnConnect(const AAFwk::Want &want) diff --git a/frameworks/native/ability/native/extension_impl.cpp b/frameworks/native/ability/native/extension_impl.cpp index 4cccd5e70af460ae906156f2d8a4fa4fc15ed86f..eda7c9b59dc576bc1ecc0b87877498949d2c646f 100644 --- a/frameworks/native/ability/native/extension_impl.cpp +++ b/frameworks/native/ability/native/extension_impl.cpp @@ -176,6 +176,50 @@ void ExtensionImpl::Stop() HILOG_INFO("ok"); } +void ExtensionImpl::Stop(bool &isAsyncCallback) +{ + HILOG_INFO("call"); + if (extension_ == nullptr) { + HILOG_ERROR("ExtensionImpl::Stop extension_ is nullptr"); + isAsyncCallback = false; + return; + } + + auto *callbackInfo = AppExecFwk::AbilityTransactionCallbackInfo<>::Create(); + if (callbackInfo == nullptr) { + extension_->OnStop(); + lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; + isAsyncCallback = false; + return; + } + std::weak_ptr weakPtr = shared_from_this(); + auto asyncCallback = [ExtensionImplWeakPtr = weakPtr, state = AAFwk::ABILITY_STATE_INITIAL,this]() { + auto extensionImpl = ExtensionImplWeakPtr.lock(); + if (extensionImpl == nullptr) { + HILOG_ERROR("extensionImpl is nullptr."); + return; + } + lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; + extensionImpl->AbilityTransactionCallback(state); + }; + callbackInfo->Push(asyncCallback); + + extension_->OnStop(callbackInfo, isAsyncCallback); + if (!isAsyncCallback) { + lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; + AppExecFwk::AbilityTransactionCallbackInfo<>::Destroy(callbackInfo); + } + // else: callbackInfo will be destroyed after the async callback + HILOG_DEBUG("%{public}s end.", __func__); +} + +void ExtensionImpl::AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState &state) +{ + HILOG_INFO("call abilityms"); + AAFwk::PacMap restoreData; + AAFwk::AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, state, restoreData); +} + /** * @brief Connect the extension. and Calling information back to Extension. * diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp index 7c0ca014e01eeff83ba33a2d4bc6a6a461bd22fb..0892918c8f30e2dfe5957fea7318bd13a8ac5da6 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp @@ -188,6 +188,15 @@ void JsUIExtension::OnStop() CallObjectMethod("onDestroy"); HILOG_DEBUG("JsUIExtension OnStop end."); } +void JsUIExtension::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback){ + if (callbackInfo == nullptr) { + isAsyncCallback = false; + OnStop(); + return; + } + //无需异步stopcallback释放资源 + OnStop(); +} sptr JsUIExtension::OnConnect(const AAFwk::Want &want) { diff --git a/interfaces/kits/native/ability/native/extension.h b/interfaces/kits/native/ability/native/extension.h index a97343e3eb8e92d34b41aeda0e57ac67e3f7c04c..9d420228cd72bfc4e0a48ec414ee3e3545c2792c 100644 --- a/interfaces/kits/native/ability/native/extension.h +++ b/interfaces/kits/native/ability/native/extension.h @@ -25,6 +25,8 @@ #include "foundation/window/window_manager/interfaces/innerkits/wm/window.h" #include "ui_extension_window_command.h" #include "want.h" +#include "ability_lifecycle_executor.h" +#include "ability_lifecycle_interface.h" namespace OHOS { namespace AppExecFwk { @@ -165,6 +167,16 @@ public: * You can override this function to implement your own processing logic. */ virtual void OnStop(); + /** + * @brief Called when this extension enters the STATE_STOP state. + * + * The ability in the STATE_STOP is being destroyed. + * You can override this function to implement your own processing logic. + * + * @param callbackInfo Indicates the lifecycle transaction callback information + * @param isAsyncCallback Indicates whether it is an asynchronous lifecycle callback + */ + virtual void OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback); /** * @brief Called when the system configuration is updated. @@ -231,6 +243,9 @@ private: std::shared_ptr launchWant_ = nullptr; std::shared_ptr lastRequestWant_ = nullptr; std::shared_ptr callingInfo_ = nullptr; + + std::shared_ptr lifecycle_ = nullptr; + std::shared_ptr abilityLifecycleExecutor_ = nullptr; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/interfaces/kits/native/ability/native/extension_impl.h b/interfaces/kits/native/ability/native/extension_impl.h index da545ecc7983e77ce14768d94417ba3bca731c54..475dcc483df7b0da7565f211549b720b597afd80 100644 --- a/interfaces/kits/native/ability/native/extension_impl.h +++ b/interfaces/kits/native/ability/native/extension_impl.h @@ -161,6 +161,13 @@ protected: * */ void Stop(); + /** + * @brief Toggles the lifecycle status of Extension to AAFwk::ABILITY_STATE_INITIAL. And notifies the application + * that it belongs to of the lifecycle status. + * @param isAsyncCallback Indicates whether it is an asynchronous lifecycle callback + */ + void Stop(bool &isAsyncCallback); + void AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState &state); /** * @brief Toggles the lifecycle status of Extension to AAFwk::ABILITY_STATE_INACTIVE. And notifies the application diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h index b54d95729e80ee1e9f8f1e27d04de19b0274db6a..97fac3400289ef40380e4eaeac00e99f518e0841 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h @@ -110,6 +110,7 @@ public: * You can override this function to implement your own processing logic. */ virtual void OnStop() override; + virtual void OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback) override; /** * @brief Called when the system configuration is updated. diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h b/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h index 30fce0248df2165d5560c3023fb398ac208c77e0..497cf9e51cf1fc8364a59e7cf0e9104e30ac678d 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h @@ -18,6 +18,10 @@ #include "extension_base.h" +#include "ability_lifecycle_executor.h" +#include "ability_lifecycle_interface.h" +#include "ability_transaction_callback_info.h" + namespace OHOS { namespace AbilityRuntime { class UIExtensionContext; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 9d313b62efbd2bd93636ca7a4ba326b98c6a23dc..b115604ee44f33a8abc2862648246264010ee074 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -151,7 +151,7 @@ bool CheckCallerIsDlpManager(const sptr &bundleManager) return true; } } // namespace - +// using namespace std::chrono; using namespace std::chrono_literals; #ifdef BGTASKMGR_CONTINUOUS_TASK_ENABLE