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 10747b36c589eff5d8f3d82b1793d7392d8602eb..02e5e81cd14ac9394c4f744b281120a433dd319b 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 96423740845bb14b01b9a4198e06c914bfa0eeee..3981f0e98336d90874b0edbf3c0e5f81e020f154 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 849af9446d9b79db4e60585d8085728b052a834f..1501ef562f376a7f86bf858bb4e8685e63bb1e22 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__);