diff --git a/interfaces/inner_api/app_manager/include/appmgr/app_process_data.h b/interfaces/inner_api/app_manager/include/appmgr/app_process_data.h index e6d8cc374b9ae373b4653cae329042225f739dea..f7df0d11607311e0d4a42fd3e6d929fc6f36b50d 100644 --- a/interfaces/inner_api/app_manager/include/appmgr/app_process_data.h +++ b/interfaces/inner_api/app_manager/include/appmgr/app_process_data.h @@ -61,6 +61,7 @@ struct AppProcessData : public Parcelable { std::string processName; std::string instanceKey = ""; std::string bundleName = ""; + bool isFromWindowFocusChanged = false; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/inner_api/app_manager/include/appmgr/app_state_data.h b/interfaces/inner_api/app_manager/include/appmgr/app_state_data.h index 6b8cbbb9a737d6a7affebc22ca3f2cbf88db5a52..461c47f8784bcd622aa3bf729b497222a53617d2 100644 --- a/interfaces/inner_api/app_manager/include/appmgr/app_state_data.h +++ b/interfaces/inner_api/app_manager/include/appmgr/app_state_data.h @@ -71,6 +71,7 @@ struct AppStateData : public Parcelable { std::vector renderPids; std::string bundleName; std::string callerBundleName; + bool isFromWindowFocusChanged = false; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/inner_api/app_manager/include/appmgr/process_data.h b/interfaces/inner_api/app_manager/include/appmgr/process_data.h index 6121e98e03778ef656a22d3296ca5c90edb4db98..ea02800a3560132599595b3e480b17df1467c6b4 100644 --- a/interfaces/inner_api/app_manager/include/appmgr/process_data.h +++ b/interfaces/inner_api/app_manager/include/appmgr/process_data.h @@ -72,6 +72,7 @@ struct ProcessData : public Parcelable { int32_t callerPid = -1; int32_t callerUid = -1; std::string killReason; + bool isFromWindowFocusChanged = false; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/inner_api/app_manager/src/appmgr/app_process_data.cpp b/interfaces/inner_api/app_manager/src/appmgr/app_process_data.cpp index 4888aa7333a00210ccef1401ce0d8a1ca146a80f..51e2ee6ef949c2f404df8cfb1ad1921c005e1231 100644 --- a/interfaces/inner_api/app_manager/src/appmgr/app_process_data.cpp +++ b/interfaces/inner_api/app_manager/src/appmgr/app_process_data.cpp @@ -65,6 +65,7 @@ bool AppProcessData::Marshalling(Parcel &parcel) const WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, appIndex); WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(instanceKey)); WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(bundleName)); + WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isFromWindowFocusChanged); return true; } @@ -84,7 +85,7 @@ bool AppProcessData::ReadFromParcel(Parcel &parcel) appIndex = parcel.ReadInt32(); instanceKey = Str16ToStr8(parcel.ReadString16()); bundleName = Str16ToStr8(parcel.ReadString16()); - + isFromWindowFocusChanged = parcel.ReadBool(); return true; } diff --git a/interfaces/inner_api/app_manager/src/appmgr/app_state_data.cpp b/interfaces/inner_api/app_manager/src/appmgr/app_state_data.cpp index 4d68d42a55d53ed6dea67bed4ec677490b0a2819..b9638f119e0f5ff48a743d2466e731c771c10033 100644 --- a/interfaces/inner_api/app_manager/src/appmgr/app_state_data.cpp +++ b/interfaces/inner_api/app_manager/src/appmgr/app_state_data.cpp @@ -26,7 +26,8 @@ bool AppStateData::Marshalling(Parcel &parcel) const && parcel.WriteInt32(pid) && parcel.WriteUint32(accessTokenId) && parcel.WriteBool(isFocused) && parcel.WriteInt32(static_cast(extensionType)) && parcel.WriteInt32Vector(renderPids) && parcel.WriteString(callerBundleName) && parcel.WriteBool(isSplitScreenMode) && parcel.WriteInt32(callerUid) - && parcel.WriteBool(isFloatingWindowMode) && parcel.WriteInt32(appIndex) && parcel.WriteBool(isPreloadModule)); + && parcel.WriteBool(isFloatingWindowMode) && parcel.WriteInt32(appIndex) && parcel.WriteBool(isPreloadModule) + && parcel.WriteBool(isFromWindowFocusChanged)); } bool AppStateData::ReadFromParcel(Parcel &parcel) @@ -45,7 +46,8 @@ bool AppStateData::ReadFromParcel(Parcel &parcel) isFloatingWindowMode = parcel.ReadBool(); appIndex = parcel.ReadInt32(); isPreloadModule = parcel.ReadBool(); - + isFromWindowFocusChanged = parcel.ReadBool(); + return true; } diff --git a/interfaces/inner_api/app_manager/src/appmgr/process_data.cpp b/interfaces/inner_api/app_manager/src/appmgr/process_data.cpp index 700cd993a3d5b02e93b2460a690f5271568f25c9..bc815bc1ed1d7d40216257e578c987668ea15c10 100644 --- a/interfaces/inner_api/app_manager/src/appmgr/process_data.cpp +++ b/interfaces/inner_api/app_manager/src/appmgr/process_data.cpp @@ -32,7 +32,8 @@ bool ProcessData::Marshalling(Parcel &parcel) const && parcel.WriteInt32(renderUid) && parcel.WriteUint32(accessTokenId) && parcel.WriteBool(isTestMode) && parcel.WriteInt32(exitReason) && parcel.WriteString16(Str8ToStr16(exitMsg)) && parcel.WriteInt32(childUid) && parcel.WriteBool(isPreload) && parcel.WriteBool(isPreloadModule) && - parcel.WriteInt32(callerPid) && parcel.WriteInt32(callerUid) && parcel.WriteString(killReason)); + parcel.WriteInt32(callerPid) && parcel.WriteInt32(callerUid) && parcel.WriteString(killReason) && + parcel.WriteBool(isFromWindowFocusChanged)); } bool ProcessData::ReadFromParcel(Parcel &parcel) @@ -62,6 +63,7 @@ bool ProcessData::ReadFromParcel(Parcel &parcel) callerPid = parcel.ReadInt32(); callerUid = parcel.ReadInt32(); killReason = parcel.ReadString(); + isFromWindowFocusChanged = parcel.ReadBool(); return true; } diff --git a/services/appmgr/include/app_mgr_service_inner.h b/services/appmgr/include/app_mgr_service_inner.h index 963b7b5fbfa1ba0a6c4bc96b14ccb58be4941bde..f657a12d15d9325f1b0bb238cb57483178c7260a 100644 --- a/services/appmgr/include/app_mgr_service_inner.h +++ b/services/appmgr/include/app_mgr_service_inner.h @@ -1731,7 +1731,7 @@ private: bool GetBundleAndHapInfo(const AbilityInfo &abilityInfo, const std::shared_ptr &appInfo, BundleInfo &bundleInfo, HapModuleInfo &hapModuleInfo, int32_t appIndex = 0) const; AppProcessData WrapAppProcessData(const std::shared_ptr &appRecord, - const ApplicationState state); + const ApplicationState state, bool isFromWindowFocusChanged = false); int UserTestAbnormalFinish(const sptr &observer, const std::string &msg); int GetHapModuleInfoForTestRunner(const AAFwk::Want &want, const sptr &observer, diff --git a/services/appmgr/include/app_state_observer_manager.h b/services/appmgr/include/app_state_observer_manager.h index e5bd29a6f99193db2ef188374218d477d20a867b..e2c4489cef4feeaa9e2d0c8d3a62d07324896cf4 100644 --- a/services/appmgr/include/app_state_observer_manager.h +++ b/services/appmgr/include/app_state_observer_manager.h @@ -71,7 +71,8 @@ public: void OnAppStarted(const std::shared_ptr &appRecord); void OnAppStopped(const std::shared_ptr &appRecord); void OnProcessCreated(const std::shared_ptr &appRecord, bool isPreload); - void OnProcessStateChanged(const std::shared_ptr &appRecord); + void OnProcessStateChanged( + const std::shared_ptr &appRecord, bool isFromWindowFocusChanged = false); void OnProcessBindingRelationChanged(const std::shared_ptr &appRecord, const UIExtensionProcessBindInfo &bindInfo, int32_t bindingRelation); void OnWindowShow(const std::shared_ptr &appRecord); @@ -119,7 +120,8 @@ private: AppStateObserverMap GetAppStateObserverMapCopy(); AppForegroundStateObserverMap GetAppForegroundStateObserverMapCopy(); AbilityForegroundObserverMap GetAbilityForegroundObserverMapCopy(); - ProcessData WrapProcessData(const std::shared_ptr &appRecord); + ProcessData WrapProcessData( + const std::shared_ptr &appRecord, bool isFromWindowFocusChanged = false); ProcessData WrapRenderProcessData(const std::shared_ptr &renderRecord); ProcessBindData WrapProcessBindData(const UIExtensionProcessBindInfo &bindInfo, int32_t bindingRelation); #ifdef SUPPORT_CHILD_PROCESS @@ -127,9 +129,10 @@ private: #endif // SUPPORT_CHILD_PROCESS void OnObserverDied(const wptr &remote, const ObserverType &type); AppStateData WrapAppStateData(const std::shared_ptr &appRecord, - const ApplicationState state); + const ApplicationState state, bool isFromWindowFocusChanged = false); void HandleOnProcessCreated(const ProcessData &data); - void HandleOnProcessStateChanged(const std::shared_ptr &appRecord); + void HandleOnProcessStateChanged( + const std::shared_ptr &appRecordm, bool isFromWindowFocusChanged = false); void HandleOnProcessDied(const ProcessData &data); void HandleOnProcessResued(const std::shared_ptr &appRecord); void HandleOnPageShow(const PageStateData pageStateData); diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index 6db7e144467e2b2ecb3b54092840012ae2c0759c..9f996266b701306279b91d3fad315013d3229468 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -3719,7 +3719,7 @@ void AppMgrServiceInner::OnAppStateChanged( std::lock_guard lock(appStateCallbacksLock_); for (const auto &item : appStateCallbacks_) { if (item.callback != nullptr) { - item.callback->OnAppStateChanged(WrapAppProcessData(appRecord, state)); + item.callback->OnAppStateChanged(WrapAppProcessData(appRecord, state, isFromWindowFocusChanged)); } } } @@ -3768,7 +3768,7 @@ void AppMgrServiceInner::OnAppStopped(const std::shared_ptr &a } AppProcessData AppMgrServiceInner::WrapAppProcessData(const std::shared_ptr &appRecord, - const ApplicationState state) + const ApplicationState state, bool isFromWindowFocusChanged) { AppProcessData processData; CHECK_POINTER_AND_RETURN_VALUE(appRecord, processData); @@ -3789,6 +3789,7 @@ AppProcessData AppMgrServiceInner::WrapAppProcessData(const std::shared_ptrGetAppIndex(); processData.instanceKey = appRecord->GetInstanceKey(); processData.bundleName = appRecord->GetBundleName(); + processData.isFromWindowFocusChanged = isFromWindowFocusChanged; auto renderRecordMap = appRecord->GetRenderRecordMap(); if (!renderRecordMap.empty()) { for (auto iter : renderRecordMap) { @@ -6737,7 +6738,7 @@ void AppMgrServiceInner::HandleFocused(const sptr if (appRecord->GetState() == ApplicationState::APP_STATE_FOREGROUND) { OnAppStateChanged(appRecord, ApplicationState::APP_STATE_FOREGROUND, needNotifyApp, true); } - DelayedSingleton::GetInstance()->OnProcessStateChanged(appRecord); + DelayedSingleton::GetInstance()->OnProcessStateChanged(appRecord, true); } void AppMgrServiceInner::HandleUnfocused(const sptr &focusChangeInfo) @@ -6768,7 +6769,7 @@ void AppMgrServiceInner::HandleUnfocused(const sptrIsApplicationUnfocused(appRecord->GetBundleName()); OnAppStateChanged(appRecord, appRecord->GetState(), needNotifyApp, true); - DelayedSingleton::GetInstance()->OnProcessStateChanged(appRecord); + DelayedSingleton::GetInstance()->OnProcessStateChanged(appRecord, true); } void AppMgrServiceInner::InitWindowVisibilityChangedListener() diff --git a/services/appmgr/src/app_state_observer_manager.cpp b/services/appmgr/src/app_state_observer_manager.cpp index 1bc239adc0f59ab2d7cb2498ed7939aeb87406be..0349ec10028e1090b6d1e85e970d866bad722a7d 100644 --- a/services/appmgr/src/app_state_observer_manager.cpp +++ b/services/appmgr/src/app_state_observer_manager.cpp @@ -337,21 +337,22 @@ void AppStateObserverManager::OnChildProcessDied(std::shared_ptr &appRecord) +void AppStateObserverManager::OnProcessStateChanged( + const std::shared_ptr &appRecord, bool isFromWindowFocusChanged) { if (handler_ == nullptr) { TAG_LOGE(AAFwkTag::APPMGR, "null handler"); return; } - auto task = [weak = weak_from_this(), appRecord]() { + auto task = [weak = weak_from_this(), appRecord, isFromWindowFocusChanged]() { auto self = weak.lock(); if (self == nullptr) { TAG_LOGE(AAFwkTag::APPMGR, "null self"); return; } TAG_LOGD(AAFwkTag::APPMGR, "OnProcessStateChanged come."); - self->HandleOnProcessStateChanged(appRecord); + self->HandleOnProcessStateChanged(appRecord, isFromWindowFocusChanged); }; handler_->SubmitTask(task); } @@ -544,7 +545,7 @@ void AppStateObserverManager::HandleAppStateChanged(const std::shared_ptrGetSplitModeAndFloatingMode(data.isSplitScreenMode, data.isFloatingWindowMode); auto appForegroundStateObserverMap = GetAppForegroundStateObserverMapCopy(); for (const auto &[observer, uid] : appForegroundStateObserverMap) { @@ -555,7 +556,7 @@ void AppStateObserverManager::HandleAppStateChanged(const std::shared_ptrGetExtensionType()) && !AAFwk::UIExtensionUtils::IsWindowExtension(appRecord->GetExtensionType())) { - AppStateData data = WrapAppStateData(appRecord, state); + AppStateData data = WrapAppStateData(appRecord, state, isFromWindowFocusChanged); TAG_LOGD(AAFwkTag::APPMGR, "name:%{public}s, uid:%{public}d, state:%{public}d, notify:%{public}d", data.bundleName.c_str(), data.uid, data.state, needNotifyApp); auto appStateObserverMapCopy = GetAppStateObserverMapCopy(); @@ -573,7 +574,7 @@ void AppStateObserverManager::HandleAppStateChanged(const std::shared_ptr &appRecord) +void AppStateObserverManager::HandleOnProcessStateChanged( + const std::shared_ptr &appRecord, bool isFromWindowFocusChanged) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); if (!appRecord) { TAG_LOGE(AAFwkTag::APPMGR, "null appRecord"); return; } - ProcessData data = WrapProcessData(appRecord); + ProcessData data = WrapProcessData(appRecord, isFromWindowFocusChanged); if (data.bundleName == XIAOYI_BUNDLE_NAME && data.extensionType == ExtensionAbilityType::SERVICE) { TAG_LOGI(AAFwkTag::APPMGR, "change processType to NORMAL"); data.processType = ProcessType::NORMAL; @@ -851,7 +853,8 @@ void AppStateObserverManager::HandleOnProcessDied(const ProcessData &data) } } -ProcessData AppStateObserverManager::WrapProcessData(const std::shared_ptr &appRecord) +ProcessData AppStateObserverManager::WrapProcessData( + const std::shared_ptr &appRecord, bool isFromWindowFocusChanged) { ProcessData processData; processData.bundleName = appRecord->GetBundleName(); @@ -879,6 +882,7 @@ ProcessData AppStateObserverManager::WrapProcessData(const std::shared_ptrGetCallerPid(); processData.callerUid = appRecord->GetCallerUid(); processData.killReason = appRecord->GetKillReason(); + processData.isFromWindowFocusChanged = isFromWindowFocusChanged; return processData; } @@ -1102,7 +1106,7 @@ void AppStateObserverManager::OnObserverDied(const wptr &remote, } AppStateData AppStateObserverManager::WrapAppStateData(const std::shared_ptr &appRecord, - const ApplicationState state) + const ApplicationState state, bool isFromWindowFocusChanged) { AppStateData appStateData; appStateData.pid = appRecord->GetPid(); @@ -1112,6 +1116,7 @@ AppStateData AppStateObserverManager::WrapAppStateData(const std::shared_ptrGetExtensionType(); appStateData.isPreloadModule = appRecord->GetPreloadMode() != PreloadMode::PRESS_DOWN; appStateData.callerUid = appRecord->GetCallerUid(); + appStateData.isFromWindowFocusChanged = isFromWindowFocusChanged; if (appRecord->GetApplicationInfo() != nullptr) { appStateData.accessTokenId = static_cast(appRecord->GetApplicationInfo()->accessTokenId); }