From 8049f512c47c412405b87558fb22c82733e31a86 Mon Sep 17 00:00:00 2001 From: njupthan Date: Thu, 20 Jan 2022 16:23:21 +0000 Subject: [PATCH] Check codex Signed-off-by: njupthan --- .../include/ability_runtime/js_ability.h | 1 - .../native/include/js_service_extension.h | 2 - .../native/src/ability_runtime/js_ability.cpp | 16 ++--- .../native/src/js_service_extension.cpp | 31 ++------- .../aafwk/mission_manager/mission_manager.cpp | 16 +---- .../include/ability_manager_service.h | 1 + services/abilitymgr/include/ability_record.h | 5 ++ .../include/ams_configuration_parameter.h | 6 ++ .../abilitymgr/include/mission_list_manager.h | 5 +- .../resource/ams_service_config.json | 3 +- .../src/ability_manager_service.cpp | 48 ++++++++++---- .../abilitymgr/src/ability_manager_stub.cpp | 4 ++ services/abilitymgr/src/ability_record.cpp | 26 ++++++++ .../src/ams_configuration_parameter.cpp | 6 ++ services/abilitymgr/src/mission_info_mgr.cpp | 1 - .../abilitymgr/src/mission_list_manager.cpp | 65 +++++++++++++++++-- 16 files changed, 164 insertions(+), 72 deletions(-) diff --git a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h index dd59355bba7..7c2d5204f3d 100755 --- a/frameworks/kits/ability/native/include/ability_runtime/js_ability.h +++ b/frameworks/kits/ability/native/include/ability_runtime/js_ability.h @@ -63,7 +63,6 @@ protected: private: void CallObjectMethod(const char* name, NativeValue* const* argv = nullptr, size_t argc = 0); std::unique_ptr CreateAppWindowStage(); - void GetPageStackFromWant(const Want& want, std::string& pageStack); JsRuntime& jsRuntime_; std::unique_ptr jsAbilityObj_; diff --git a/frameworks/kits/ability/native/include/js_service_extension.h b/frameworks/kits/ability/native/include/js_service_extension.h index 036fe803236..b95b15ab9a9 100644 --- a/frameworks/kits/ability/native/include/js_service_extension.h +++ b/frameworks/kits/ability/native/include/js_service_extension.h @@ -107,8 +107,6 @@ public: private: NativeValue* CallObjectMethod(const char* name, NativeValue* const* argv = nullptr, size_t argc = 0); - void GetSrcPath(std::string &srcPath); - JsRuntime& jsRuntime_; std::unique_ptr jsObj_; }; diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp index 6da103b7cad..05762130053 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -304,14 +304,6 @@ std::unique_ptr JsAbility::CreateAppWindowStage() return jsRuntime_.LoadSystemModule("application.WindowStage", &jsWindowStage, 1); } -void JsAbility::GetPageStackFromWant(const Want& want, std::string& pageStack) -{ - auto stringObj = AAFwk::IString::Query(want.GetParams().GetParam(PAGE_STACK_PROPERTY_NAME)); - if (stringObj != nullptr) { - pageStack = AAFwk::String::Unbox(stringObj); - } -} - void JsAbility::DoOnForeground(const Want& want) { if (scene_ == nullptr) { @@ -324,6 +316,7 @@ void JsAbility::DoOnForeground(const Want& want) HILOG_ERROR("%{public}s error. failed to create WindowScene instance!", __func__); return; } + int32_t displayId = Rosen::WindowScene::DEFAULT_DISPLAY_ID; if (setting_ != nullptr) { std::string strDisplayId = setting_->GetProperty( @@ -344,16 +337,17 @@ void JsAbility::DoOnForeground(const Want& want) HILOG_ERROR("%{public}s error. failed to init window scene!", __func__); return; } + // multi-instance ability continuation HILOG_INFO("lauch reason = %{public}d, contentStorage = %{public}p", launchParam_.launchReason, abilityContext_->GetContentStorage()); if (IsRestoredInContinuation()) { - std::string pageStack; - GetPageStackFromWant(want, pageStack); + std::string pageStack = AAFwk::String::Unbox( + AAFwk::IString::Query(want.GetParams().GetParam(PAGE_STACK_PROPERTY_NAME))); HandleScope handleScope(jsRuntime_); auto& engine = jsRuntime_.GetNativeEngine(); scene_->GetMainWindow()->SetUIContent(pageStack, &engine, - static_cast(abilityContext_->GetContentStorage()), true); + static_cast(abilityContext_->GetContentStorage())); OnSceneRestored(); NotityContinuationResult(want, true); } else { diff --git a/frameworks/kits/ability/native/src/js_service_extension.cpp b/frameworks/kits/ability/native/src/js_service_extension.cpp index e72970cea9f..1abe9ce14fa 100755 --- a/frameworks/kits/ability/native/src/js_service_extension.cpp +++ b/frameworks/kits/ability/native/src/js_service_extension.cpp @@ -46,12 +46,14 @@ void JsServiceExtension::Init(const std::shared_ptr &record, const sptr &token) { ServiceExtension::Init(record, application, handler, token); - std::string srcPath = ""; - GetSrcPath(srcPath); - if (srcPath.empty()) { - HILOG_ERROR("Failed to get srcPath"); + if (Extension::abilityInfo_->srcEntrance.empty()) { + HILOG_ERROR("abilityInfo srcEntrance is empty"); return; } + std::string srcPath(Extension::abilityInfo_->moduleName + "/"); + srcPath.append(Extension::abilityInfo_->srcPath); + srcPath.erase(srcPath.rfind('.')); + srcPath.append(".abc"); std::string moduleName(Extension::abilityInfo_->moduleName); moduleName.append("::").append(abilityInfo_->name); @@ -244,26 +246,5 @@ NativeValue* JsServiceExtension::CallObjectMethod(const char* name, NativeValue* HILOG_INFO("JsServiceExtension::CallFunction(%{public}s), success", name); return nativeEngine.CallFunction(value, method, argv, argc); } - -void JsServiceExtension::GetSrcPath(std::string &srcPath) -{ - if (!Extension::abilityInfo_->isStageBasedModel) { - /* temporary compatibility api8 + config.json */ - srcPath.append(Extension::abilityInfo_->package); - srcPath.append("/assets/js/"); - if (!Extension::abilityInfo_->srcPath.empty()) { - srcPath.append(Extension::abilityInfo_->srcPath); - } - srcPath.append("/").append(Extension::abilityInfo_->name).append(".abc"); - return; - } - - if (!Extension::abilityInfo_->srcEntrance.empty()) { - srcPath.append(Extension::abilityInfo_->moduleName + "/"); - srcPath.append(Extension::abilityInfo_->srcEntrance); - srcPath.erase(srcPath.rfind('.')); - srcPath.append(".abc"); - } -} } } \ No newline at end of file diff --git a/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp b/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp index ab5046bfbfc..f51690175ab 100644 --- a/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp +++ b/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp @@ -32,7 +32,7 @@ namespace AbilityRuntime { using namespace OHOS::AppExecFwk; using AbilityManagerClient = AAFwk::AbilityManagerClient; namespace { - constexpr int32_t ARG_COUNT_TWO = 2; + constexpr int32_t ARG_COUNT_TWO = 1; constexpr int32_t ARG_COUNT_THREE = 3; } class JsMissionManager { @@ -266,19 +266,9 @@ private: auto errcode = AbilityManagerClient::GetInstance()->GetMissionSnapshot( deviceId, missionId, missionSnapshot); if (errcode == 0) { - NativeValue* objValue = engine.CreateObject(); - NativeObject* object = ConvertNativeValueTo(objValue); - NativeValue* abilityValue = engine.CreateObject(); - NativeObject* abilityObj = ConvertNativeValueTo(abilityValue); - abilityObj->SetProperty( - "bundleName", CreateJsValue(engine, missionSnapshot.topAbility.GetBundleName())); - abilityObj->SetProperty( - "abilityName", CreateJsValue(engine, missionSnapshot.topAbility.GetAbilityName())); - object->SetProperty("ability", abilityValue); - auto snapshotValue = reinterpret_cast(Media::PixelMapNapi::CreatePixelMap( + auto nativeValue = reinterpret_cast(Media::PixelMapNapi::CreatePixelMap( reinterpret_cast(&engine), missionSnapshot.snapshot)); - object->SetProperty("snapshot", snapshotValue); - task.Resolve(engine, objValue); + task.Resolve(engine, nativeValue); } else { task.Reject(engine, CreateJsError(engine, errcode, "Get mission snapshot failed.")); } diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index def74abaddb..b5cc5184beb 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -655,6 +655,7 @@ public: std::list> GetConnectRecordListByCallback(sptr callback); void OnAbilityDied(std::shared_ptr abilityRecord); + void GetMaxRestartNum(int &max); /** * wait for starting system ui. diff --git a/services/abilitymgr/include/ability_record.h b/services/abilitymgr/include/ability_record.h index 087b7b1ce4d..ce6135da0bd 100644 --- a/services/abilitymgr/include/ability_record.h +++ b/services/abilitymgr/include/ability_record.h @@ -817,7 +817,12 @@ public: std::weak_ptr missionList_; std::weak_ptr mission_; int32_t missionId_ = -1; + + int32_t restartCount_ = -1; + int32_t restratMax_ = -1; + std::string specifiedFlag_; + }; class AbilityRecordNew : public AbilityRecord { diff --git a/services/abilitymgr/include/ams_configuration_parameter.h b/services/abilitymgr/include/ams_configuration_parameter.h index c04fee90ebb..ddb4c9fb37d 100644 --- a/services/abilitymgr/include/ams_configuration_parameter.h +++ b/services/abilitymgr/include/ams_configuration_parameter.h @@ -38,6 +38,7 @@ const std::string SYSTEM_ORIENTATION {"system_orientation"}; const std::string STARTUP_CONTACTS {"startup_contacts"}; const std::string STARTUP_MMS {"startup_mms"}; const std::string USE_NEW_MISSION {"use_new_mission"}; +const std::string ROOT_LAUNCHER_RESTART_MAX {"root_launcher_restart_max"}; } // namespace AmsConfig enum class SatrtUiMode { STATUSBAR = 1, NAVIGATIONBAR = 2, STARTUIBOTH = 3 }; @@ -108,6 +109,10 @@ public: * return true if use mission list, false if use mission stack. */ bool IsUseNewMission() const; + /** + * Get the max number of restart. + */ + int GetMaxRestartNum() const; enum { READ_OK = 0, READ_FAIL = 1, READ_JSON_FAIL = 2 }; @@ -131,6 +136,7 @@ private: bool canStartContacts {false}; bool canStartMms {false}; bool useNewMission_ {false}; + int maxRestartNum_ = 0; std::string orientation_ {""}; int missionSaveTime_ {12 * 60 * 60 * 1000}; std::map memThreshold_; diff --git a/services/abilitymgr/include/mission_list_manager.h b/services/abilitymgr/include/mission_list_manager.h index 7e4ab021029..05058c2a950 100755 --- a/services/abilitymgr/include/mission_list_manager.h +++ b/services/abilitymgr/include/mission_list_manager.h @@ -208,7 +208,7 @@ public: * * @param abilityRecord the died ability */ - void OnAbilityDied(std::shared_ptr abilityRecord); + void OnAbilityDied(std::shared_ptr abilityRecord, int32_t currentUserId); /** * Get mission id by target ability token. @@ -319,6 +319,9 @@ private: bool IsPC(); std::shared_ptr GetMissionBySpecifiedFlag(const std::string &flag) const; + void HandleLoadTimeout(const std::shared_ptr &ability); + void HandleForgroundNewTimeout(const std::shared_ptr &ability); + private: int userId_; std::recursive_mutex managerLock_; diff --git a/services/abilitymgr/resource/ams_service_config.json b/services/abilitymgr/resource/ams_service_config.json index 392255de15f..3eb6c45e883 100644 --- a/services/abilitymgr/resource/ams_service_config.json +++ b/services/abilitymgr/resource/ams_service_config.json @@ -7,7 +7,8 @@ "startup_phone_service" : true, "startup_contacts":true, "startup_mms":true, - "mission_save_time" : 43200000 + "mission_save_time" : 43200000, + "root_launcher_restart_max":15 }, "memorythreshold":{ "home_application": "20" diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 960f4367af9..95c828791d9 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -2113,7 +2113,8 @@ void AbilityManagerService::OnAbilityDied(std::shared_ptr ability } if (currentMissionListManager_) { - currentMissionListManager_->OnAbilityDied(abilityRecord); + int32_t currentUserId = userController_? userController_->GetCurrentUserId() : USER_ID_DEFAULT; + currentMissionListManager_->OnAbilityDied(abilityRecord, currentUserId); } } else { if (systemAppManager_ && abilityRecord->IsKernalSystemAbility()) { @@ -2135,6 +2136,13 @@ void AbilityManagerService::OnAbilityDied(std::shared_ptr ability } } +void AbilityManagerService::GetMaxRestartNum(int &max) +{ + if (amsConfigResolver_) { + max = amsConfigResolver_->GetMaxRestartNum(); + } +} + int AbilityManagerService::KillProcess(const std::string &bundleName) { HILOG_DEBUG("Kill process, bundleName: %{public}s", bundleName.c_str()); @@ -2275,14 +2283,17 @@ void AbilityManagerService::HandleLoadTimeOut(int64_t eventId) if (kernalAbilityManager_) { kernalAbilityManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); } + if (currentMissionListManager_) { + currentMissionListManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); + } } else { if (systemAppManager_) { systemAppManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); } + if (currentStackManager_) { + currentStackManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); + } } - if (currentStackManager_) { - currentStackManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); - } } void AbilityManagerService::HandleActiveTimeOut(int64_t eventId) @@ -2293,21 +2304,30 @@ void AbilityManagerService::HandleActiveTimeOut(int64_t eventId) if (kernalAbilityManager_) { kernalAbilityManager_->OnTimeOut(AbilityManagerService::ACTIVE_TIMEOUT_MSG, eventId); } + if (currentMissionListManager_) { + currentMissionListManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); + } } else { if (systemAppManager_) { systemAppManager_->OnTimeOut(AbilityManagerService::ACTIVE_TIMEOUT_MSG, eventId); } - } - if (currentStackManager_) { - currentStackManager_->OnTimeOut(AbilityManagerService::ACTIVE_TIMEOUT_MSG, eventId); + if (currentStackManager_) { + currentStackManager_->OnTimeOut(AbilityManagerService::ACTIVE_TIMEOUT_MSG, eventId); + } } } void AbilityManagerService::HandleInactiveTimeOut(int64_t eventId) { HILOG_DEBUG("Handle inactive timeout."); - if (currentStackManager_) { - currentStackManager_->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, eventId); + if (useNewMission_) { + if (currentMissionListManager_) { + currentMissionListManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); + } + }else { + if (currentStackManager_) { + currentStackManager_->OnTimeOut(AbilityManagerService::INACTIVE_TIMEOUT_MSG, eventId); + } } } @@ -2318,13 +2338,16 @@ void AbilityManagerService::HandleForegroundNewTimeOut(int64_t eventId) if (kernalAbilityManager_) { kernalAbilityManager_->OnTimeOut(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, eventId); } + if (currentMissionListManager_) { + currentMissionListManager_->OnTimeOut(AbilityManagerService::LOAD_TIMEOUT_MSG, eventId); + } } else { if (systemAppManager_) { systemAppManager_->OnTimeOut(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, eventId); } - } - if (currentStackManager_) { - currentStackManager_->OnTimeOut(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, eventId); + if (currentStackManager_) { + currentStackManager_->OnTimeOut(AbilityManagerService::FOREGROUNDNEW_TIMEOUT_MSG, eventId); + } } } @@ -3083,7 +3106,6 @@ int32_t AbilityManagerService::InitAbilityInfoFromExtension(AppExecFwk::Extensio abilityInfo.applicationInfo = extensionInfo.applicationInfo; abilityInfo.resourcePath = extensionInfo.resourcePath; abilityInfo.enabled = extensionInfo.enabled; - abilityInfo.isStageBasedModel = true; switch (extensionInfo.type) { case AppExecFwk::ExtensionAbilityType::FORM: abilityInfo.type = AppExecFwk::AbilityType::FORM; diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index 78e2a6242b9..0982a6f03cf 100755 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -1250,6 +1250,10 @@ int AbilityManagerStub::RegisterSnapshotHandlerInner(MessageParcel &data, Messag int AbilityManagerStub::GetMissionSnapshotInfoInner(MessageParcel &data, MessageParcel &reply) { std::string deviceId = data.ReadString(); + if (deviceId.empty()) { + HILOG_ERROR("missionSnapshot: get deviceId empty!"); + return ERR_NULL_OBJECT; + } int32_t missionId = data.ReadInt32(); MissionSnapshot missionSnapshot; int32_t result = GetMissionSnapshot(deviceId, missionId, missionSnapshot); diff --git a/services/abilitymgr/src/ability_record.cpp b/services/abilitymgr/src/ability_record.cpp index 01e8f54edf5..36318669fd8 100644 --- a/services/abilitymgr/src/ability_record.cpp +++ b/services/abilitymgr/src/ability_record.cpp @@ -159,6 +159,11 @@ int AbilityRecord::LoadAbility() return ERR_INVALID_VALUE; } + if (isLauncherRoot_ && isRestarting_ && IsLauncherAbility() && (restartCount_ < 0)) { + HILOG_ERROR("Root launcher restart is out of max count."); + return ERR_INVALID_VALUE;; + } + if (abilityInfo_.type != AppExecFwk::AbilityType::DATA) { if (isKernalSystemAbility_) { SendEvent(AbilityManagerService::LOAD_TIMEOUT_MSG, AbilityManagerService::SYSTEM_UI_TIMEOUT); @@ -304,6 +309,10 @@ void AbilityRecord::SetAbilityState(AbilityState state) mission->UpdateActiveTimestamp(); } } + + if (state == AbilityState::FOREGROUND_NEW) { + SetRestarting(false); + } } void AbilityRecord::SetScheduler(const sptr &scheduler) @@ -890,6 +899,11 @@ void AbilityRecord::Dump(std::vector &info) dumpInfo = " ready #" + std::to_string(isReady_) + " window attached #" + std::to_string(isWindowAttached_) + " launcher #" + std::to_string(isLauncherAbility_); info.push_back(dumpInfo); + + if (isLauncherRoot_) { + dumpInfo = " can restart num #" + std::to_string(restartCount_); + info.push_back(dumpInfo); + } } void AbilityRecord::SetStartTime() @@ -1117,6 +1131,18 @@ bool AbilityRecord::GetPowerState() const void AbilityRecord::SetRestarting(const bool isRestart) { isRestarting_ = isRestart; + + if (restratMax_ < 0) { + auto ams = DelayedSingleton::GetInstance(); + if (ams) { + ams->GetMaxRestartNum(restratMax_); + } + } + + if (isLauncherRoot_ && IsLauncherAbility()) { + restartCount_ = isRestart ? (--restartCount_) : restratMax_; + HILOG_INFO("root launcher restart count: %{public}d", restartCount_); + } } bool AbilityRecord::IsRestarting() const diff --git a/services/abilitymgr/src/ams_configuration_parameter.cpp b/services/abilitymgr/src/ams_configuration_parameter.cpp index 0c132a94d5e..19b314dffb1 100644 --- a/services/abilitymgr/src/ams_configuration_parameter.cpp +++ b/services/abilitymgr/src/ams_configuration_parameter.cpp @@ -82,6 +82,11 @@ bool AmsConfigurationParameter::IsUseNewMission() const return useNewMission_; } +int AmsConfigurationParameter::GetMaxRestartNum() const +{ + return maxRestartNum_; +} + int AmsConfigurationParameter::LoadAmsConfiguration(const std::string &filePath) { HILOG_DEBUG("%{public}s", __func__); @@ -145,6 +150,7 @@ int AmsConfigurationParameter::LoadAppConfigurationForStartUpService(nlohmann::j if (Object.at(AmsConfig::SERVICE_ITEM_AMS).contains(AmsConfig::USE_NEW_MISSION)) { useNewMission_ = Object.at(AmsConfig::SERVICE_ITEM_AMS).at(AmsConfig::USE_NEW_MISSION).get(); } + maxRestartNum_ = Object.at(AmsConfig::SERVICE_ITEM_AMS).at(AmsConfig::ROOT_LAUNCHER_RESTART_MAX).get(); HILOG_INFO("get ams service config succes!"); ret = 0; } diff --git a/services/abilitymgr/src/mission_info_mgr.cpp b/services/abilitymgr/src/mission_info_mgr.cpp index 564b57bad0f..a93288237f8 100644 --- a/services/abilitymgr/src/mission_info_mgr.cpp +++ b/services/abilitymgr/src/mission_info_mgr.cpp @@ -339,7 +339,6 @@ bool MissionInfoMgr::UpdateMissionSnapshot(int32_t missionId, const sptrGetMission()) { - abilityRecord->GetMission()->SetMovingState(false); - } + HandleForgroundNewTimeout(abilityRecord); break; default: break; } } +void MissionListManager::HandleLoadTimeout(const std::shared_ptr &ability) +{ + if (ability == nullptr) { + HILOG_ERROR("MissionListManager on time out event: ability record is nullptr."); + return; + } + // root launcher load timeout, notify appMs force terminate the ability and restart immediately. + if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) { + ability->SetRestarting(true); + DelayedSingleton::GetInstance()->AttachTimeOut(ability->GetToken()); + HILOG_INFO("Launcher root load timeout, restart."); + DelayedStartLauncher(); + return; + } + + // other +} + +void MissionListManager::HandleForgroundNewTimeout(const std::shared_ptr &ability) +{ + if (ability == nullptr) { + HILOG_ERROR("MissionListManager on time out event: ability record is nullptr."); + return; + } + + if (ability->GetMission()) { + ability->GetMission()->SetMovingState(false); + } + + // root launcher load timeout, notify appMs force terminate the ability and restart immediately. + if (ability->IsLauncherAbility() && ability->IsLauncherRoot()) { + DelayedSingleton::GetInstance()->AttachTimeOut(ability->GetToken()); + HILOG_INFO("Launcher root load timeout, restart."); + DelayedStartLauncher(); + return; + } + + // other +} + std::shared_ptr MissionListManager::GetAbilityRecordByCaller( const std::shared_ptr &caller, int requestCode) { @@ -1186,7 +1225,7 @@ std::shared_ptr MissionListManager::GetAbilityRecordByEventId(int return defaultStandardList_->GetAbilityRecordById(eventId); } -void MissionListManager::OnAbilityDied(std::shared_ptr abilityRecord) +void MissionListManager::OnAbilityDied(std::shared_ptr abilityRecord, int32_t currentUserId) { HILOG_INFO("On ability died."); if (!abilityRecord) { @@ -1199,7 +1238,17 @@ void MissionListManager::OnAbilityDied(std::shared_ptr abilityRec HILOG_ERROR("Ability type is not page."); return; } + std::lock_guard guard(managerLock_); + + if (abilityRecord->IsLauncherRoot() && currentUserId != userId_) { + HILOG_WARN("delay restart root launcher when start user."); + HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__); + abilityRecord->SetAbilityState(AbilityState::INITIAL); + abilityRecord->SetRestarting(true); + return; + } + HandleAbilityDied(abilityRecord); } @@ -1321,10 +1370,17 @@ void MissionListManager::HandleAbilityDied(std::shared_ptr abilit { HILOG_INFO("Handle Ability Died."); CHECK_POINTER(abilityRecord); + + if (abilityRecord->GetAbilityInfo().type != AbilityType::PAGE) { + HILOG_ERROR("Ability type is not page."); + return; + } + if (abilityRecord->IsLauncherAbility()) { HandleLauncherDied(abilityRecord); return; } + HandleAbilityDiedByDefault(abilityRecord); } @@ -1343,6 +1399,7 @@ void MissionListManager::HandleLauncherDied(std::shared_ptr abili if (ability->IsLauncherRoot()) { HILOG_INFO("launcher root Ability died, state: INITIAL, %{public}d", __LINE__); ability->SetAbilityState(AbilityState::INITIAL); + ability->SetRestarting(true); } else { HILOG_INFO("launcher Ability died, remove, %{public}d", __LINE__); missionList->RemoveMission(mission); -- Gitee