From 47c82793c19ce1d7b269f7a165e2bda4cccf3fb3 Mon Sep 17 00:00:00 2001 From: jsjzju Date: Thu, 30 May 2024 20:04:46 +0800 Subject: [PATCH] =?UTF-8?q?closeAbility=E6=94=B9=E4=B8=BA=E7=94=B1scb?= =?UTF-8?q?=E5=8F=91=E8=B5=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jsjzju Change-Id: Ib58648d29cca34a1acc8a3d8a8a27dd117f9a997 --- .../ui_ability_lifecycle_manager.h | 1 + .../src/ability_connect_manager.cpp | 10 +++++----- .../ui_ability_lifecycle_manager.cpp | 20 ++++++++++++++++--- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h index 10747b36c58..02e5e81cd14 100644 --- a/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h +++ b/services/abilitymgr/include/scene_board/ui_ability_lifecycle_manager.h @@ -399,6 +399,7 @@ private: std::shared_ptr GetStatusBarDelegateManager(); int32_t DoProcessAttachment(std::shared_ptr abilityRecord); void BatchCloseUIAbility(const std::unordered_set>& abilitySet); + void TerminateSession(std::shared_ptr abilityRecord); int StartWithPersistentIdByDistributed(const AbilityRequest &abilityRequest, int32_t persistentId); int32_t userId_ = -1; diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index 96423740845..3981f0e9833 100644 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -2009,11 +2009,11 @@ void AbilityConnectManager::HandleAbilityDiedTask( if ((IsLauncher(abilityRecord) || abilityRecord->IsSceneBoard()) && token != nullptr) { IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton::GetInstance()->ClearProcessByToken( token->AsObject())); - if (abilityRecord->IsSceneBoard() && currentUserId != userId_) { - TAG_LOGD(AAFwkTag::ABILITYMGR, "Not the current user's SCB, clear the user and do not restart"); - KillProcessesByUserId(); - return; - } + } + if (abilityRecord->IsSceneBoard() && currentUserId != userId_) { + TAG_LOGD(AAFwkTag::ABILITYMGR, "Not the current user's SCB, clear the user and do not restart"); + KillProcessesByUserId(); + return; } if (DelayedSingleton::GetInstance()->IsMemorySizeSufficent() || IsLauncher(abilityRecord) || abilityRecord->IsSceneBoard()) { 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 849af9446d9..1501ef562f3 100644 --- a/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp +++ b/services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp @@ -259,7 +259,7 @@ int UIAbilityLifecycleManager::AttachAbilityThread(const sptr abilityRecord->SetScheduler(scheduler); if (DoProcessAttachment(abilityRecord) != ERR_OK) { TAG_LOGE(AAFwkTag::ABILITYMGR, "do process attachment failed, close the ability."); - BatchCloseUIAbility({abilityRecord}); + TerminateSession(abilityRecord); return ERR_INVALID_VALUE; } if (abilityRecord->IsStartedByCall()) { @@ -2220,8 +2220,10 @@ int32_t UIAbilityLifecycleManager::KillProcessWithPrepareTerminate(const std::ve } if (needKillProcess) { pidsToKill.push_back(pid); - } else if (!abilitysToTerminate.empty()) { - BatchCloseUIAbility(abilitysToTerminate); + continue; + } + for (const auto& abilityRecord: abilitysToTerminate) { + TerminateSession(abilityRecord); } } if (!pidsToKill.empty()) { @@ -2251,6 +2253,18 @@ void UIAbilityLifecycleManager::BatchCloseUIAbility( } } +void UIAbilityLifecycleManager::TerminateSession(std::shared_ptr abilityRecord) +{ + CHECK_POINTER(abilityRecord); + auto sessionInfo = abilityRecord->GetSessionInfo(); + CHECK_POINTER(sessionInfo); + CHECK_POINTER(sessionInfo->sessionToken); + auto session = iface_cast(sessionInfo->sessionToken); + CHECK_POINTER(session); + TAG_LOGI(AAFwkTag::ABILITYMGR, "call TerminateSession, session id: %{public}d", sessionInfo->persistentId); + session->TerminateSession(sessionInfo); +} + int UIAbilityLifecycleManager::ChangeAbilityVisibility(sptr token, bool isShow) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); -- Gitee