Fix NPE caused by config change on a destroyed activity

The config callback from view root may not know the state
of activity. That may trigger a stale callback, so
 - Restore the null check when getting mSizeConfigurations.
 - Clear the callback if the activity will be removed.

Bug: 192603207
Test: ActivityLifecycleTopResumedStateTests
Change-Id: I17ea8fc2ba994f630d5ad7baa3de298d90a32827
This commit is contained in:
Riddle Hsu
2021-07-02 14:06:22 +08:00
parent e085ae55d8
commit 9a2454c595

View File

@@ -5430,6 +5430,12 @@ public final class ActivityThread extends ClientTransactionHandler
// behave properly when activity is relaunching.
r.window.clearContentView();
} else {
final ViewRootImpl viewRoot = v.getViewRootImpl();
if (viewRoot != null) {
// Clear the callback to avoid the destroyed activity from receiving
// configuration changes that are no longer effective.
viewRoot.setActivityConfigCallback(null);
}
wm.removeViewImmediate(v);
}
}
@@ -5834,10 +5840,9 @@ public final class ActivityThread extends ClientTransactionHandler
final boolean movedToDifferentDisplay = isDifferentDisplay(activity.getDisplayId(),
displayId);
final SizeConfigurationBuckets buckets = getActivityClient(activityToken)
.mSizeConfigurations;
final ActivityClientRecord r = mActivities.get(activityToken);
final int diff = diffPublicWithSizeBuckets(activity.mCurrentConfig,
newConfig, buckets);
newConfig, r != null ? r.mSizeConfigurations : null);
final boolean hasPublicConfigChange = diff != 0;
// TODO(b/173090263): Use diff instead after the improvement of AssetManager and
// ResourcesImpl constructions.