我发现,如果你的手机字体很大,重写getResources()
后应用程序的第一个运行活动也会对稍后运行的活动生效。
E.g:执行以下步骤
- 将手机字体设置为巨无霸
- 创建两个名为A和B的活动,其中A活动覆盖
getResources()
,而B不执行任何特殊操作 - 首先输入B活动,发现字体被放大
- 退出B页面,然后进入A页面。A页面字体大小正常
- 退出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
。