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

时间:2019-01-28 02:56:39

标签: android

我发现,重写getResources()之后,应用程序的第一个运行活动也将对以后运行的活动生效,只要您的手机具有非常大的字体。

例如:执行以下步骤

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

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

这与一项活动有关:

@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中处理,但是不能当然,我希望给大家指点,非常感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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