为什么Android需要Context才能访问资源?

7

我理解为什么在Android中,当你想获取一个视图或者显示一个Toast时需要传递上下文对象。

但是,我不太理解为什么需要它来访问在应用程序中不同上下文间可共享的资源。

我曾多次尝试使用静态方法或类似的方式从工具类中访问资源,而且发现需要传递上下文参数非常烦人。

我无法看出其中出现问题的可能性。


当您需要在活动之外获取或访问资源时,您需要当前活动的上下文引用。 - Haresh Chhelana
活动的上下文就像类的接口。 - Muhammed Refaat
“活动的上下文就像类的接口”这句话我无法理解。 - Alexander Kulyakhtin
好的。我想知道的是为什么Android需要这样做?为什么不能让运行在你的应用程序中的任何类访问例如任何字符串资源? - Mateo
2个回答

2

来自官方文档

应用程序环境的全局信息接口。这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及针对应用程序级操作(如启动活动、广播和接收意图等)的向上调用。

简而言之,Context是电话资源和你的代码之间的中间人。很明显,你不能从任何地方访问它。

只有在Activity和Application类中才能访问Context是因为两者都派生自Context:

java.lang.Object

↳ android.content.Context

  ↳ android.content.ContextWrapper

      ↳ android.view.ContextThemeWrapper

          ↳ android.app.Activity

2
也许在某个时候这是个好主意,但是一个存在于超级对象中的上帝对象自第一天起就引发了不良实践。 - MLProgrammer-CiM
1
http://www.doubleencore.com/2013/06/context/ - MLProgrammer-CiM
我理解这一点,但我不明白为什么你不能在由你的应用程序启动的线程中运行的任何类中访问应用程序的资源,而无需传递上下文对象。 - Mateo
实际上,Context 只能在你的 Activity 类(和 Application)中使用,对吧?你只能在内部使用它的原因是 Activity 和 Application 都继承自 Context。请参见编辑后的答案。 - FR073N
1
但是为什么Android需要它呢?Context能提供什么,而Android不可能推断出来呢?它可以意识到你是从某个应用程序内部调用它,并让你访问那些本地资源,就像你可以通过Resources.getSystem()访问全局资源一样。我不明白拥有类似Resources.getLocal()这样的东西会有什么问题。 - Mateo

1

通过自己的public class MyApp extends Application扩展应用程序类,并在清单中注册MyApp,并使MyApp像这样:

class MyApp extends Application {
...
private static ApplicationContext context;

@Override
public static void onCreate() {
  super.onCreate();
  context = this;
}

public static String string(int resId) {
   return context.getString(resId);
}

}

然后你可以从任何地方执行 MyApp.string(R.id.mystring)。您也可以对其他资源类型执行相同操作。如果您更喜欢,也可以执行 (MyApp)getApplication()

2
你的回答实际上并没有回答“为什么Android需要Context来访问资源”的问题,它只是一个解决方法。此外,只有在绝对必要的特定情况下才应该扩展Application - 通常它只用于维护全局状态,而不是作为Context实例的跳板。另外,应用程序Context有一些限制,所以按照你的设计示例可能在某些情况下无法正常工作。 - Squonk
@Squonk:“只有在绝对必要的特定情况下才应该扩展应用程序” - 你能否详细说明原因?至于回答原问题,我认为这确实完全回答了它。 - Alexander Kulyakhtin
我确实使用这个解决方法,但只是为了访问资源。我真正想知道的是为什么需要上下文。 - Mateo
@Mate 因为这些 API 函数需要一个上下文作为参数。 - Alexander Kulyakhtin
这是我的问题!为什么Android需要那个?从任何Activity或Service中访问Application的资源将产生相同的结果。我看不出需要Context的意义。 - Mateo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接