什么是 Android 上的“上下文”?

新手上路,请多包涵

在 Android 编程中, Context 类究竟是什么,它的用途是什么?

我在 开发者网站 上读到了它,但我无法清楚地理解它。

原文由 Brigadier 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

简单地说:

顾名思义,它是应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序的另一部分(活动和包/应用程序)的信息。

You can get the context by invoking getApplicationContext() , getContext() , getBaseContext() or this (when in a class that extends from Context ,例如Application、Activity、Service和IntentService类)。

上下文的典型用法:

  • 创建新对象:创建新视图、适配器、监听器:
    TextView tv = new TextView(getContext());
   ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);

  • 访问标准公共资源:LAYOUT_INFLATER_SERVICE、SharedPreferences 等服务:
    context.getSystemService(LAYOUT_INFLATER_SERVICE)
   getApplicationContext().getSharedPreferences(*name*, *mode*);

  • 隐式访问组件:关于内容提供者、广播、意图
   getApplicationContext().getContentResolver().query(uri, ...);

原文由 Sameer Segal 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您查看 https://stackoverflow.com/a/16301475/1772898 的评论,您会发现 ulf-edholm 的评论

嗯,对我来说,这听起来就像我们老前辈过去所说的全局变量,当面向对象进入场景时,人们对此非常不满

他是对的。上下文是全局变量的替代品。

为简单起见,我们可以这样说: global variable ≈ context

上下文相对于全局变量的好处是,全局变量使得不可能在同一个进程中创建同一个系统的两个独立实例,而上下文允许系统的多个实例共存于一个进程中,每个实例都有自己的上下文.

请查看 John Ousterhout 的 A Philosophy of Software Design,7.5 Pass-through variables。

全局变量使得不可能在同一个进程中创建同一个系统的两个独立实例,因为对全局变量的访问会发生冲突

我最常使用的解决方案是引入一个上下文对象,如图 7.2(d) 所示。上下文存储应用程序的所有全局状态(否则将成为 传递变量或全局变量 的任何内容)。大多数应用程序在其全局状态中有多个变量,代表诸如配置选项、共享子系统和性能计数器之类的东西。每个系统实例都有一个上下文对象。 上下文允许系统的多个实例共存于一个进程中,每个实例都有自己的上下文

稍后在评论部分,您会发现 bjornw 的另一条评论

如果你只是 grep 一个代码库,你会看到数百个不同的 getContext、getBaseContext、getBlaBlaContext。

他也是对的。

为了减少必须了解上下文的方法数量,在许多主要对象中都引用了对上下文的引用。这就是为什么你会在很多地方看到 getContext、getBaseContext、getBlaBlaContext ..。

参考:John Ousterhout 的软件设计哲学,7.5 传递变量。

不幸的是,很多地方都可能需要上下文,因此它可能会成为传递变量。 为了减少必须知道它的方法的数量,可以在系统的大多数主要对象中保存对上下文的引用。在图 7.2(d) 的示例中,包含 m3 的类将对上下文的引用作为实例变量存储在其对象中。创建新对象时,创建方法会从其对象中检索上下文引用并将其传递给新对象的构造函数。使用这种方法,上下文随处可用,但它仅在构造函数中显示为显式参数。

原文由 Ahmad Ismail 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题