diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index 80bc2ef1cffb06be69e1c244bcb77573401226cc..03782d3a010426c4f4151fa24940bfec25b10456 100644 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -106,9 +106,16 @@ int AbilityConnectManager::TerminateAbilityInner(const sptr &toke CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); std::string element = abilityRecord->GetURI(); HILOG_DEBUG("Terminate ability, ability is %{public}s.", element.c_str()); - if (IsUIExtensionAbility(abilityRecord) && !abilityRecord->IsConnectListEmpty()) { - HILOG_INFO("There exist connection, don't terminate."); - return ERR_OK; + if (IsUIExtensionAbility(abilityRecord)) { + if (!abilityRecord->IsConnectListEmpty()) { + HILOG_INFO("There exist connection, don't terminate."); + return ERR_OK; + } else { + HILOG_INFO("current ability is active"); + DoBackgroundAbilityWindow(abilityRecord, abilityRecord->GetSessionInfo()); + MoveToTerminatingMap(abilityRecord); + return ERR_OK; + } } MoveToTerminatingMap(abilityRecord); return TerminateAbilityLocked(token); @@ -716,9 +723,13 @@ int AbilityConnectManager::AbilityTransitionDone(const sptr &toke std::string abilityState = AbilityRecord::ConvertAbilityState(static_cast(targetState)); std::shared_ptr abilityRecord; if (targetState == AbilityState::INACTIVE - || targetState == AbilityState::FOREGROUND - || targetState == AbilityState::BACKGROUND) { + || targetState == AbilityState::FOREGROUND) { abilityRecord = GetExtensionFromServiceMapInner(token); + } else if (targetState == AbilityState::BACKGROUND) { + abilityRecord = GetExtensionFromServiceMapInner(token); + if (abilityRecord == nullptr) { + abilityRecord = GetExtensionFromTerminatingMapInner(token); + } } else if (targetState == AbilityState::INITIAL) { abilityRecord = GetExtensionFromTerminatingMapInner(token); } else { @@ -726,7 +737,7 @@ int AbilityConnectManager::AbilityTransitionDone(const sptr &toke } CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE); std::string element = abilityRecord->GetURI(); - HILOG_DEBUG("Ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str()); + HILOG_INFO("Ability: %{public}s, state: %{public}s", element.c_str(), abilityState.c_str()); switch (targetState) { case AbilityState::INACTIVE: { @@ -2321,12 +2332,13 @@ void AbilityConnectManager::CompleteBackground(const std::shared_ptrGetAbilityState()); return; } - abilityRecord->SetAbilityState(AbilityState::BACKGROUND); // send application state to AppMS. // notify AppMS to update application state. DelayedSingleton::GetInstance()->MoveToBackground(abilityRecord->GetToken()); CompleteStartServiceReq(abilityRecord->GetURI()); + // Abilities ahead of the one started were put in terminate list, we need to terminate them. + TerminateAbilityLocked(abilityRecord->GetToken()); } void AbilityConnectManager::PrintTimeOutLog(const std::shared_ptr &ability, uint32_t msgId) diff --git a/services/appmgr/src/app_running_record.cpp b/services/appmgr/src/app_running_record.cpp index ac20a1fb7c537cd6837536ee34ffd5d653feec3d..2a8349491b479318412f244a25a47c33c20a264b 100644 --- a/services/appmgr/src/app_running_record.cpp +++ b/services/appmgr/src/app_running_record.cpp @@ -891,7 +891,7 @@ void AppRunningRecord::AbilityForeground(const std::shared_ptrGetName().c_str()); // We need schedule application to foregrounded when current application state is ready or background running. if (curState_ == ApplicationState::APP_STATE_FOREGROUND