在活动覆盖getResources()之后,它如何对下一个正在运行的活动生效



我发现,如果你的手机字体很大,重写getResources()后应用程序的第一个运行活动也会对稍后运行的活动生效。

E.g:执行以下步骤

  1. 将手机字体设置为巨无霸
  2. 创建两个名为A和B的活动,其中A活动覆盖getResources(),而B不执行任何特殊操作
  3. 首先输入B活动,发现字体被放大
  4. 退出B页面,然后进入A页面。A页面字体大小正常
  5. 退出A,然后输入B,发现B的字体大小是正常的

然后我梳理了源代码,包括活动启动过程,我猜配置缓存在哪里,下面运行的活动可以使用,但最终没有找到

这是关于A活动:

@Override
public Resources getResources() {
Resources resources = super.getResources();
try {
if (resources != null) {
Configuration newConfig = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (newConfig.fontScale != 1) {
newConfig.fontScale = 1;
if (Build.VERSION.SDK_INT >= 17) {
Context configurationContext = createConfigurationContext(newConfig);
resources = configurationContext.getResources();
displayMetrics.scaledDensity = displayMetrics.density * newConfig.fontScale;
} else {
resources.updateConfiguration(newConfig, displayMetrics);
}
}
}
Log.d(TAG, "A-Activity fontScale :" + resources.getConfiguration().fontScale + " ");
return resources;
} catch (Exception e) {
}
return resources;
}

而B活动不执行任何特殊操作。

@Override
public Resources getResources() {
Resources resources = super.getResources();
Log.d(TAG, "B-Activity fontScale :" + resources.getConfiguration().fontScale + " ");
return super.getResources();
}

以及运行应用程序后的结果,关于Logcat:

2019-01-28 10:46:22.006  B-Activity fontScale :1.3 
2019-01-28 10:46:22.007  B-Activity fontScale :1.3 
2019-01-28 10:46:26.675  A-Activity fontScale :1.0 
2019-01-28 10:46:26.675  A-Activity fontScale :1.0 
2019-01-28 10:46:29.818  B-Activity fontScale :1.0 
2019-01-28 10:46:29.818  B-Activity fontScale :1.0 

所以我很困惑,android内部是如何工作的,让上一次活动的getResources()的设置为下一次活动生效,个人猜测在ActivityStack中处理,但不能确定,我希望能给大家指点迷津,非常感谢。

默认情况下,同一应用程序中的活动将共享相同的配置

如果您调试应用程序,您会发现A.getResources().getConfiguration()返回与B.getResources().getConfiguration()相同的Configuration实例。因此,在修改A中的Configuration后,它也会影响B中的Configuration

尝试用Configuration newConfig = new Configuration(resources.getConfiguration());替换Configuration newConfig = resources.getConfiguration();

有关更多详细信息,请参阅源代码ResourcesManager.updateResourcesForActivity

最新更新