Fix problem with calling onConfigurationChanged() too much.
We now return the initial configuration for a window when it is added to the window manager. The view hierarchy would check to see if it was different than the last one, and not dispatch a configuration change down itself if not. However, when ActivityThread received it, it would always dispatch a config change even if it is the same. The solution is to only do this in ActivityThread if the config is actually different; otherwise, we continue to rely only on the activity manager explicitly telling us when to do a config change. Change-Id: I8a6e3565776dd2723c8b791496bb6041463d4b67
This commit is contained in:
@@ -3908,16 +3908,16 @@ public final class ActivityThread {
|
||||
}
|
||||
}
|
||||
|
||||
final void applyConfigurationToResourcesLocked(Configuration config) {
|
||||
final boolean applyConfigurationToResourcesLocked(Configuration config) {
|
||||
if (mResConfiguration == null) {
|
||||
mResConfiguration = new Configuration();
|
||||
}
|
||||
if (!mResConfiguration.isOtherSeqNewer(config)) {
|
||||
if (DEBUG_CONFIGURATION) Log.v(TAG, "Skipping new config: curSeq="
|
||||
+ mResConfiguration.seq + ", newSeq=" + config.seq);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
mResConfiguration.updateFrom(config);
|
||||
int changes = mResConfiguration.updateFrom(config);
|
||||
DisplayMetrics dm = getDisplayMetricsLocked(true);
|
||||
|
||||
// set it for java, this also affects newly created Resources
|
||||
@@ -3948,6 +3948,8 @@ public final class ActivityThread {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
|
||||
return changes != 0;
|
||||
}
|
||||
|
||||
final void handleConfigurationChanged(Configuration config) {
|
||||
@@ -4522,17 +4524,20 @@ public final class ActivityThread {
|
||||
ViewRoot.addConfigCallback(new ComponentCallbacks() {
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
synchronized (mPackages) {
|
||||
if (mPendingConfiguration == null ||
|
||||
mPendingConfiguration.isOtherSeqNewer(newConfig)) {
|
||||
mPendingConfiguration = newConfig;
|
||||
|
||||
// We need to apply this change to the resources
|
||||
// immediately, because upon returning the view
|
||||
// hierarchy will be informed about it.
|
||||
applyConfigurationToResourcesLocked(newConfig);
|
||||
// We need to apply this change to the resources
|
||||
// immediately, because upon returning the view
|
||||
// hierarchy will be informed about it.
|
||||
if (applyConfigurationToResourcesLocked(newConfig)) {
|
||||
// This actually changed the resources! Tell
|
||||
// everyone about it.
|
||||
if (mPendingConfiguration == null ||
|
||||
mPendingConfiguration.isOtherSeqNewer(newConfig)) {
|
||||
mPendingConfiguration = newConfig;
|
||||
|
||||
queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
|
||||
}
|
||||
}
|
||||
}
|
||||
queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
|
||||
}
|
||||
public void onLowMemory() {
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user