我正在为Android开发,我多次遇到过这个问题
我来解释一下
Android提供了一种很好的方法,可以不直接在代码中硬编码值,而是将它们存储在xml文件中
关于DVM
的Android应用程序是DVM
的实例,但从java的角度来看,Application
类是应用程序生命周期内存在于内存中的最顶层对象,甚至是活动等任何应用程序组件,服务等。
所以这个对象可以被视为app实例
AFAIK此应用程序对象具有主要上下文,与我们有时使用getApplicationContext
获得的相同
Context类是一种存储很多不同东西的God Object。我们现在对xml文件中的资源感兴趣
我试图找到getString
的实现或其他获取资源的方法,但AFAIK是原生的,所以我放弃了,因为时间不够。
我经常使用android SMALI(dissasembly)
,但从未注意到它看起来像
.line 29
const v0, 0x7f07005e
invoke-virtual {p0, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;
此ID(在我们的示例中为0x7f07005e)映射到apk档案中的public.xml
文件。
所以我的第一个问题是在getString
方法的引擎下发生的事情,它是否很重,来自string.xml的字符串常量存储在内存中或仍然在运行时的xml文件中它从xml文件解析这个值。或者这些值存储在内存中的某个位置?
第二个问题更多地是关于最佳做法和架构。
如果我需要从我无法访问上下文的string.xml文件中获取常量,除了将它们传递到我拥有上下文或使用常量类的其他地方后,我别无选择将它们传递到我需要它们的地方。登记/>
在从string.xml获取常量的情况下,我们需要访问上下文对象,因此在这种情况下,我们将实际上不需要上下文的类与应用程序绑在一起以获得一对常量。
其他方法被认为是不良做法Constant classes
即使使用它们,您也需要在每次更改某些值时更改您的代码,但如果使用两种方法组合这样的内容会怎样。
public class MyWheelConstants {
public static String CONSTANT_1;
public static String CONSTANT_2;
public static void init(Context context) {
CONSTANT_1 = context.getString(R.string.constant1);
CONSTANT_2 = context.getString(R.string.constant2);
}
}
例如,在Application
方法中将其移到onCreate
类中,我们在这种情况下并没有束缚,但是这应该以单音或其他任何方式重新实现以使常量最终。
请分享您的想法和建议 Thx提前。