From 642d9f4f24599c288eb5dff1d86a3ab14145a113 Mon Sep 17 00:00:00 2001 From: sty28558 Date: Tue, 22 Jul 2025 19:34:56 +0800 Subject: [PATCH] =?UTF-8?q?OnProcessStateChange=E6=A0=87=E8=AE=B0=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E6=9D=A5=E8=87=AAfocus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sty28558 Change-Id: Ic815bad9d72bfbc28965c0550dccde1524f7492c --- .../include/appmgr/app_process_data.h | 1 + .../include/appmgr/app_state_data.h | 1 + .../app_manager/include/appmgr/process_data.h | 1 + .../src/appmgr/app_process_data.cpp | 3 ++- .../app_manager/src/appmgr/app_state_data.cpp | 6 +++-- .../app_manager/src/appmgr/process_data.cpp | 4 ++- .../appmgr/include/app_mgr_service_inner.h | 2 +- .../include/app_state_observer_manager.h | 11 +++++--- services/appmgr/src/app_mgr_service_inner.cpp | 9 ++++--- .../appmgr/src/app_state_observer_manager.cpp | 25 +++++++++++-------- 10 files changed, 40 insertions(+), 23 deletions(-) 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 e6d8cc374b9..f7df0d11607 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 6b8cbbb9a73..461c47f8784 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 6121e98e037..ea02800a356 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 4888aa7333a..51e2ee6ef94 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 4d68d42a55d..b9638f119e0 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 700cd993a3d..bc815bc1ed1 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 963b7b5fbfa..f657a12d15d 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 e5bd29a6f99..e2c4489cef4 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 6db7e144467..9f996266b70 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 1bc239adc0f..0349ec10028 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); } -- Gitee