diff --git a/services/abilitymgr/include/ability_record/caller_record.h b/services/abilitymgr/include/ability_record/caller_record.h index c1f1000404..687be1c234 100644 --- a/services/abilitymgr/include/ability_record/caller_record.h +++ b/services/abilitymgr/include/ability_record/caller_record.h @@ -26,6 +26,9 @@ namespace OHOS { namespace AAFwk { class AbilityRecord; +namespace { +constexpr int32_t DEFAULT_REQUEST_CODE = -1; +} /** * @struct CallerAbilityInfo @@ -144,6 +147,11 @@ public: { return requestCodeSet_; } + bool HasForResultRequestCode() + { + return std::any_of(requestCodeSet_.begin(), requestCodeSet_.end(), + [](int32_t requestCode) { return requestCode != DEFAULT_REQUEST_CODE; }); + } private: int32_t requestCode_ = -1; // requestCode of for-result start mode diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 1cd61de364..1f4a88e6d0 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -334,7 +334,6 @@ constexpr const char* SCENEBOARD_BUNDLE_NAME = "com.ohos.sceneboard"; constexpr const char* SPECIFY_TOKEN_ID = "specifyTokenId"; constexpr const char* PROCESS_SUFFIX = "embeddable"; constexpr int32_t DEFAULT_DMS_MISSION_ID = -1; -constexpr int32_t DEFAULT_REQUEST_CODE = -1; constexpr const char* PARAM_PREVENT_STARTABILITY = "persist.sys.abilityms.prevent_startability"; constexpr const char* SUSPEND_SERVICE_CONFIG_FILE = "/etc/efficiency_manager/prevent_startability_whitelist.json"; constexpr int32_t MAX_BUFFER = 2048; @@ -9148,12 +9147,12 @@ void AbilityManagerService::RetrySubscribeUnlockedEvent(int32_t retryCount, auto retrySubscribeScreenUnlockedEventTask = [aams = weak_from_this(), unlockedEventSubscriber = subscriber, retryCount, isUserUnlock = isUserUnlockSubscriber]() { CHECK_POINTER_LOG(unlockedEventSubscriber, "unlockedEventSubscriber nullptr"); - bool subResult = EventFwk::CommonEventManager::SubscribeCommonEvent(unlockedEventSubscriber); auto obj = aams.lock(); if (obj == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "retry subscribe screen unlocked event, obj null"); return; } + bool subResult = EventFwk::CommonEventManager::SubscribeCommonEvent(unlockedEventSubscriber); if (subResult) { if (!isUserUnlock) { obj->isSubscribed_ = true; @@ -9165,9 +9164,7 @@ void AbilityManagerService::RetrySubscribeUnlockedEvent(int32_t retryCount, obj->RetrySubscribeUnlockedEvent(retryCount - 1, unlockedEventSubscriber, isUserUnlock); return; } - if (!retryCount) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "SU life, subscribe err:%{public}d", isUserUnlock); - } + TAG_LOGE(AAFwkTag::ABILITYMGR, "SU life, subscribe err:%{public}d", isUserUnlock); }; constexpr int32_t delaytime = 200 * 1000; // us ffrt::submit(std::move(retrySubscribeScreenUnlockedEventTask), diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index ebf5879e00..58c5de56b4 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -113,7 +113,6 @@ const int32_t SHELL_ASSISTANT_DIETYPE = 0; std::atomic AbilityRecord::abilityRecordId = 0; const int32_t DEFAULT_USER_ID = 0; const int32_t SEND_RESULT_CANCELED = -1; -const int32_t DEFAULT_REQUEST_CODE = -1; const int VECTOR_SIZE = 2; const int LOAD_TIMEOUT_ASANENABLED = 150; const int TERMINATE_TIMEOUT_ASANENABLED = 150; @@ -1319,10 +1318,6 @@ void AbilityRecord::SendResultByBackToCaller(const std::shared_ptrSendResult(result->requestCode_, result->resultCode_, result->resultWant_); - if (GetCallerInfo() != nullptr) { - DelayedSingleton::GetInstance()->AbilityRemovePidConnection( - GetCallerInfo()->callerPid, GetPid(), GetAbilityRecordId()); - } } void AbilityRecord::SendSandboxSavefileResult(const Want &want, int resultCode, int requestCode) @@ -1551,17 +1546,27 @@ void AbilityRecord::RemoveCallerRequestCode(std::shared_ptr calle TAG_LOGI(AAFwkTag::ABILITYMGR, "null record"); return; } - std::lock_guard guard(callerListLock_); - for (auto it = callerList_.begin(); it != callerList_.end(); it++) { - if ((*it)->GetCaller() == callerAbilityRecord) { - (*it)->RemoveHistoryRequestCode(requestCode); - if ((*it)->GetRequestCodeSet().empty()) { - callerList_.erase(it); - TAG_LOGI(AAFwkTag::ABILITYMGR, "remove callerRecord"); + bool removePidConnection = false; + { + std::lock_guard guard(callerListLock_); + for (auto it = callerList_.begin(); it != callerList_.end(); it++) { + if ((*it) != nullptr && (*it)->GetCaller() == callerAbilityRecord) { + (*it)->RemoveHistoryRequestCode(requestCode); + if (!(*it)->HasForResultRequestCode()) { + removePidConnection = true; + } + if ((*it)->GetRequestCodeSet().empty()) { + callerList_.erase(it); + TAG_LOGI(AAFwkTag::ABILITYMGR, "remove callerRecord"); + } + break; } - return; } } + if (removePidConnection) { + DelayedSingleton::GetInstance()->AbilityRemovePidConnection( + callerAbilityRecord->GetPid(), GetPid(), GetAbilityRecordId()); + } } void AbilityRecord::AddCallerRecord(const sptr &callerToken, int requestCode, const Want &want, diff --git a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp index ed19e282be..3b4d729cc6 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -78,7 +78,6 @@ constexpr int32_t START_UI_ABILITY_PER_SECOND_UPPER_LIMIT = 20; constexpr int32_t API20 = 20; constexpr int32_t API_VERSION_MOD = 100; constexpr int32_t REQUEST_LIST_ID_INIT = -1; -constexpr int32_t DEFAULT_REQUEST_CODE = -1; constexpr const char* IS_CALLING_FROM_DMS = "supportCollaborativeCallingFromDmsInAAFwk"; constexpr int REMOVE_STARTING_BUNDLE_TIMEOUT_MICRO_SECONDS = 5000000; // 5s constexpr int32_t BY_CALL_TIMEOUT = 10 * 1000 * 1000; // 10s