gpt4 book ai didi

android - Activity 覆盖 getResources() 后,如何对下一个运行的 Activity 生效?

转载 作者:行者123 更新时间:2023-11-29 00:56:30 26 4
gpt4 key购买 nike

我发现重写getResources()后app第一次运行的activity也会对后面运行的activity生效,前提是你的手机字体特别大。

例如:执行以下步骤

  1. 将手机字体设置为巨无霸
  2. 创建两个名为 A 和 B 的 Activity ,其中 A Activity 覆盖 getResources(),B 不执行任何特殊操作。
  3. 先进入B Activity ,发现字体变大了
  4. 退出B页,进入A页。 A页字号正常。
  5. 退出A,再进入B,发现B的字号正常。

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

这是关于一个 Activity :

@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 Activity 不执行任何特殊操作。

@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内部是怎么工作的,让上一个activity的getResources()的设置对下一个生效,个人猜测是在ActivityStack<中处理的,但不能确定,望指点,万分感谢。

最佳答案

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

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

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

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

关于android - Activity 覆盖 getResources() 后,如何对下一个运行的 Activity 生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54394986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com