在没有上下文的情况下访问资源

IT小君   2021-11-11T01:42:51

我正在尝试将配置(例如 URLs/etc)放入资源文件夹中以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名访问资源(似乎 assets/ 就是为此用途而设计的),而无需使用上下文来访问资源。

在这种特殊情况下,我希望单例在实例化时在配置中使用某些内容。除了在实例化过程中的那一次之外,它不需要任何来自资源的东西。因此,每次调用 getInstance() 时都必须传入 Context 将完全是浪费。

此外,这特定于应用程序的配置,不应存储在共享系统文件或类似文件中。

评论(5)
IT小君

Resources.getSystem().getString(android.R.string.someuniversalstuff)

您可以在应用程序中的任何地方使用它,即使是在静态常量声明中!仅适用于系统资源

对于本地资源,请使用该解决方案

2021-11-11T01:42:52   回复
IT小君

您可以扩展主应用程序类并在那里提供通用助手来访问资源。这减轻了对上下文的需求,因为应用程序将提供上下文而不是调用者。应用程序类是单例样式,在应用程序的任何部分(包括服务)运行时应该始终可用。

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"
 ... >
2021-11-11T01:42:52   回复
IT小君

我建议执行以下操作:不要在任何地方传递上下文,而是让您的活动类成为具有返回上下文的公共函数的单例类:

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);
2021-11-11T01:42:52   回复
IT小君

不幸的是,我认为没有真正的方法可以解决这个问题。我布置了这样的东西,并且还传入了 getApplicationContext() 而不是活动上下文。

public static AppController getAppController(Context context){
    if(self == null) {
        //Create instance
        self = new AppController();
    }

    return self;
}

进而:

appController = AppController.getAppController(getApplicationContext());
2021-11-11T01:42:52   回复
IT小君

以下问题的 stackoverflow 答案显示了如何使用 POJO 获取资源的流(如果您提供其路径)。如果您需要从众多资源之一中选择特定资源,这可能很有用。

是否可以在Android库项目中读取没有上下文引用的原始文本文件

2021-11-11T01:42:52   回复