为什么Android有自己的方式来获取当前区域设置?

为什么Android有自己的方式来获取当前区域设置?,android,locale,Android,Locale,此处的Android文档说明,您可以使用以下方法获取当前语言环境: context.getResources().getConfiguration().locale java.util.Locale.getDefault() Java似乎已经以这种方法的形式提供了这些信息: context.getResources().getConfiguration().locale java.util.Locale.getDefault() 那么为什么Android开发人员引入了另一种获取语言环境的

此处的Android文档说明,您可以使用以下方法获取当前语言环境:

context.getResources().getConfiguration().locale
java.util.Locale.getDefault()
Java似乎已经以这种方法的形式提供了这些信息:

context.getResources().getConfiguration().locale
java.util.Locale.getDefault()

那么为什么Android开发人员引入了另一种获取语言环境的方法呢?以上两行代码在同时并排运行时会产生不同的结果吗?

我同意这很混乱,虽然我没有攻击它,也没有为它辩护,但我可以看到它允许您做一些事情

让我们从头开始

java.util.Locale.getDefault()
由java运行时定义。它是电话/设备的区域设置。当没有给出语言环境时,它是诸如日期格式(ISO日期格式标准、美国格式标准等)、数字格式(逗号或小数、3或4的分组等)和CurrenyFormats(看起来像$或CAD)的动力。对于这些情况,可能最好为这些类型的对象指定区域设置

context.getResources().getConfiguration().locale
是在给定上下文中向当前资源包注册的区域设置。它可以包括所有资源内容将尊重的当前上下文/资源对的区域设置值。该配置可能有点像设备的当前状态,最好过滤到当前资源。您不必指定任何根据区域设置更改的内容,但这是一个选项

资源在配置中使用一组鉴别器,如方向、屏幕宽度、区域设置等。因此,在您的应用程序中,您可以通过将区域设置应用程序配置更改为其他区域设置来允许使用其他资源覆盖当前资源()。例如,您正在为地址制作布局。您可能希望某些字段根据所选国家进行变形。(并不是说这对这样的应用程序来说是正确的行为,但这是目前最简单的想法)。如果您必须简单地依赖Locale.getDefault(),那么当您想要执行我刚才描述的操作时,它将导致一些系统应用程序和状态的尴尬重置

您基本上需要修改整个设备的区域设置(这不一定安全,也不是任何老用户都会喜欢的)。即使我们忽略了安全管理器问题,主机vm也会重复这些问题;在大多数设备上,国家/地区工具包缓存了很多状态。所以在切换这个值时会有相当大的滞后,可能会有很多不稳定性(如果有人可以这么做的话)。另一种选择是始终为所有内容指定区域设置。你可以看出那有多烦人。所以它在上下文的配置中

因此,虽然它很尴尬,但它确实提供了额外的自由度、保护和便利。大多数情况下,它将是Locale.getDefault(),因为应用程序是从一个进程启动的,该进程的基本上下文被初始化为Locale.getDefault()。通常,我会避免过多地使用Locale.getDefault()值。在消费者应用程序开发中,应该信任的东西并不多见


由于我不是一个操作系统开发人员,所以也不是基于事实,只是主要基于分析系统的优缺点。我认为配置中的区域设置是完全合理的。

使用另一个区域设置进行地址布局是一个很好的用例示例。由于
getConfiguration().locale
处于API级别24,因此推荐的方法是。