OSDN Git Service

Merge "Do not send unhandled system config changes to app" into nyc-mr1-dev
authorChong Zhang <chz@google.com>
Thu, 23 Jun 2016 21:33:54 +0000 (21:33 +0000)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Thu, 23 Jun 2016 21:33:55 +0000 (21:33 +0000)
core/java/android/app/ActivityThread.java

index 0728bdf..3f15a75 100644 (file)
@@ -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;
+                }
             }
         }