diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 83dab164aef76..7f7945ad4969d 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -236,6 +236,7 @@ public final class ActivityThread { boolean mSystemThread = false; boolean mJitEnabled = false; boolean mSomeActivitiesChanged = false; + boolean mUpdatingSystemConfig = false; // These can be accessed by multiple threads; mPackages is the lock. // XXX For now we keep around information about all packages we have @@ -1574,7 +1575,9 @@ public final class ActivityThread { case CONFIGURATION_CHANGED: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged"); mCurDefaultDisplayDpi = ((Configuration)msg.obj).densityDpi; + mUpdatingSystemConfig = true; handleConfigurationChanged((Configuration)msg.obj, null); + mUpdatingSystemConfig = false; Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; case CLEAN_UP_CONTEXT: @@ -4629,7 +4632,14 @@ public final class ActivityThread { // onConfigurationChanged int diff = activity.mCurrentConfig.diff(newConfig); if (diff != 0) { - shouldChangeConfig = true; + // Always send the task-level config changes. For system-level configuration, if + // this activity doesn't handle any of the config changes, then don't bother + // calling onConfigurationChanged as we're going to destroy it. + if (!mUpdatingSystemConfig + || (~activity.mActivityInfo.getRealConfigChanged() & diff) == 0 + || !reportToActivity) { + shouldChangeConfig = true; + } } }