diff --git a/services/abilitymgr/include/ability_connect_manager.h b/services/abilitymgr/include/ability_connect_manager.h index 1421f22f8c..b11b9e3ee9 100644 --- a/services/abilitymgr/include/ability_connect_manager.h +++ b/services/abilitymgr/include/ability_connect_manager.h @@ -257,6 +257,8 @@ public: void TerminateAbilityWindowLocked(const std::shared_ptr &abilityRecord, const sptr &sessionInfo); + + void RemoveLauncherDeathRecipient(); // MSG 0 - 20 represents timeout message static constexpr uint32_t LOAD_TIMEOUT_MSG = 0; diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index df025855e0..cba8c0ad69 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -1441,6 +1441,8 @@ public: */ int32_t GetForegroundUIAbilities(std::vector &list) override; + void RemoveLauncherDeathRecipient(int32_t userId); + // MSG 0 - 20 represents timeout message static constexpr uint32_t LOAD_TIMEOUT_MSG = 0; static constexpr uint32_t ACTIVE_TIMEOUT_MSG = 1; diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index 488ad7647e..a2919a26a6 100644 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -1952,6 +1952,22 @@ void AbilityConnectManager::PauseExtensions() } } +void AbilityConnectManager::RemoveLauncherDeathRecipient() +{ + HILOG_INFO("Call."); + std::lock_guard guard(Lock_); + for (auto it = serviceMap_.begin(); it != serviceMap_.end();) { + auto targetExtension = it->second; + if (targetExtension != nullptr && targetExtension->GetAbilityInfo().type == AbilityType::EXTENSION && + (IsLauncher(targetExtension) || IsSceneBoard(targetExtension))) { + targetExtension->RemoveAbilityDeathRecipient(); + break; + } else { + it++; + } + } +} + bool AbilityConnectManager::IsLauncher(std::shared_ptr serviceExtension) const { if (serviceExtension == nullptr) { diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 3003c015a7..4d1e50e482 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -9353,5 +9353,15 @@ int AbilityManagerService::SendDialogResult(const Want &want, const std::string return StartAbilityAsCaller(targetWant, callerToken, nullptr, dialogCallerInfo->userId, dialogCallerInfo->requestCode, true); } + +void AbilityManagerService::RemoveLauncherDeathRecipient(int32_t userId) +{ + auto connectManager = GetConnectManagerByUserId(userId); + if (connectManager == nullptr) { + HILOG_ERROR("connectManager is nullptr. userId=%{public}d", userId); + return; + } + connectManager->RemoveLauncherDeathRecipient(); +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/user_controller.cpp b/services/abilitymgr/src/user_controller.cpp index fb11bdfb07..e36a5f0151 100644 --- a/services/abilitymgr/src/user_controller.cpp +++ b/services/abilitymgr/src/user_controller.cpp @@ -19,6 +19,7 @@ #include "app_scheduler.h" #include "hilog_wrapper.h" #include "ipc_skeleton.h" +#include "mock_session_manager_service.h" #include "os_account_manager_wrapper.h" #include "scene_board_judgement.h" #include "task_data_persistence_mgr.h" @@ -200,19 +201,27 @@ int32_t UserController::LogoutUser(int32_t userId) HILOG_ERROR("not exist such account:%{public}d", userId); return INVALID_USERID_VALUE; } + auto abilityManagerService = DelayedSingleton::GetInstance(); + if (!abilityManagerService) { + HILOG_ERROR("abilityManagerService is null"); + return -1; + } + abilityManagerService->RemoveLauncherDeathRecipient(userId); + if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) { + HILOG_INFO("SceneBoard exit normally."); + Rosen::MockSessionManagerService::GetInstance().NotifyNotKillService(); + } auto appScheduler = DelayedSingleton::GetInstance(); if (!appScheduler) { HILOG_ERROR("appScheduler is null"); return INVALID_USERID_VALUE; } appScheduler->KillProcessesByUserId(userId); - auto abilityManagerService = DelayedSingleton::GetInstance(); - if (!abilityManagerService) { - HILOG_ERROR("abilityManagerService is null"); - return -1; - } abilityManagerService->ClearUserData(userId); ClearAbilityUserItems(userId); + if (IsCurrentUser(userId)) { + SetCurrentUserId(0); + } return 0; }