From 8b5afd93b6c63e99fe58104437a651b0bfebbbfd Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 12 Apr 2021 09:35:51 +0800 Subject: [PATCH] Do not relaunch bg activities when application info changes Update the configurations via ActivityTaskManager to prevent the activities being relaunched while in background. Instead, the activities will be relaunched after brought to front and being visible. This also prevents all activities in the system being relaunched at the same time. Bug: 185301309 Test: update app info via shell command while activity in background Change-Id: Ibf93b9e3f203578c25e0b6b50494065938790f24 --- core/java/android/app/ActivityThread.java | 14 -------------- .../android/app/activity/ActivityThreadTest.java | 9 --------- .../java/com/android/server/am/ProcessList.java | 7 +++++++ 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 3a1961a1c741a..35007aec01856 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -5961,20 +5961,6 @@ public final class ActivityThread extends ClientTransactionHandler // Update all affected Resources objects to use new ResourcesImpl mResourcesManager.applyNewResourceDirsLocked(ai, oldResDirs); } - - ApplicationPackageManager.configurationChanged(); - - // Trigger a regular Configuration change event, only with a different assetsSeq number - // so that we actually call through to all components. - // TODO(adamlesinski): Change this to make use of ActivityManager's upcoming ability to - // store configurations per-process. - final Configuration config = mConfigurationController.getConfiguration(); - Configuration newConfig = new Configuration(); - newConfig.assetsSeq = (config != null ? config.assetsSeq : 0) + 1; - mConfigurationController.handleConfigurationChanged(newConfig, null /* compat */); - - // Preserve windows to avoid black flickers when overlays change. - relaunchAllActivities(true /* preserveWindows */, "handleApplicationInfoChanged"); } /** diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 2e2e6bd075395..6f17ea9946998 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -184,15 +184,6 @@ public class ActivityThreadTest { }); } - @Test - public void testHandleActivity_assetsChanged() { - relaunchActivityAndAssertPreserveWindow(activity -> { - // Relaunches all activities. - activity.getActivityThread().handleApplicationInfoChanged( - activity.getApplicationInfo()); - }); - } - @Test public void testRecreateActivity() { relaunchActivityAndAssertPreserveWindow(Activity::recreate); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index fae941d172a21..774825ee885ca 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -77,6 +77,7 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManagerInternal; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Point; import android.net.LocalSocket; @@ -4643,6 +4644,12 @@ public final class ProcessList { } }); } + + // Update the global configuration and increase the assets sequence number. + Configuration currentConfig = mService.mActivityTaskManager.getConfiguration(); + Configuration newConfig = new Configuration(); + newConfig.assetsSeq = (currentConfig != null ? currentConfig.assetsSeq : 0) + 1; + mService.mActivityTaskManager.updateConfiguration(newConfig); } @GuardedBy("mService")