我想将配置(如URL等)放入资源文件夹中供实用程序类使用。然而,我不想在各处传递上下文。我希望能够通过路径名访问资源(似乎assets/是为此设计的),而不使用上下文访问资源。
在这种情况下,我希望一个单例在实例化时使用配置中的某些内容。除了实例化期间需要这一个之外,它不需要来自资源的任何东西。因此,每次调用getInstance()时都必须传递上下文是完全浪费的。
此外,这是特定于应用程序的配置,不应存储在共享系统文件或其他任何地方。
我想将配置(如URL等)放入资源文件夹中供实用程序类使用。然而,我不想在各处传递上下文。我希望能够通过路径名访问资源(似乎assets/是为此设计的),而不使用上下文访问资源。
在这种情况下,我希望一个单例在实例化时使用配置中的某些内容。除了实例化期间需要这一个之外,它不需要来自资源的任何东西。因此,每次调用getInstance()时都必须传递上下文是完全浪费的。
此外,这是特定于应用程序的配置,不应存储在共享系统文件或其他任何地方。
使用
Resources.getSystem().getString(android.R.string.someuniversalstuff)
你可以在应用程序中绝对任何地方使用它,甚至可以在静态常量声明中使用!但仅适用于系统资源。
对于本地资源,请使用那个解决方案。
你可以扩展主应用程序类并提供通用助手来访问资源。这样可以解除对上下文的依赖,因为应用程序会提供上下文而不是调用者。应用程序类采用单例模式,并且在您的应用程序的任何部分运行时(包括服务)始终可用。
public class MyApplication extends Application {
protected static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static Resources getResources() {
return instance.getResources();
}
}
这使您可以访问:
MyApplication.getResources()....
请确保在你的清单文件中声明自定义应用程序,以便访问此功能。假设你的自定义应用程序位于应用程序命名空间的根目录下:
<application
android:name=".MyApplication"
... >
private static ActivityMain instance;
在super.onCreate()之前在onCreate()内进行初始化:
instance = this;
/** Get singleton instance of activity **/
public static ActivityMain getInstance() {
return instance;
}
/** Returns context of this activity **/
public static Context getContext(){
return instance.getApplicationContext();
}
Context context = AntiMorphActivity.getContext();
String packageName = context.getPackageName();
int id = context.getResources().getIdentifier("web_page", "raw", packageName);
很遗憾,我认为没有真正的解决方法。我会像这样布置我的代码,并传递getApplicationContext()而不是活动上下文。
public static AppController getAppController(Context context){
if(self == null) {
//Create instance
self = new AppController();
}
return self;
}
然后:
appController = AppController.getAppController(getApplicationContext());
Application
上下文。 - CoolMind