在Android编程中,Context类到底是什么?它用于什么?

我在开发者网站上读过这篇文章,但我无法清楚地理解它。


当前回答

Context是应用程序/对象当前状态的上下文。它是表示各种环境数据的实体。上下文帮助当前活动与外部android环境交互,如本地文件、数据库、与环境相关的类加载器、包括系统级服务在内的服务等等。

上下文是系统的句柄。它提供诸如解析资源、访问数据库和首选项等服务。android应用程序有活动。它就像应用程序当前运行的环境的句柄。活动对象继承Context对象。

通过不同的调用方法可以获取上下文1.getApplicationContext(),2.getContext(),3.getBaseContext()4.或这个(在活动课上)。

其他回答

Context是每个app-s沙盒的android特定api提供访问应用程序私有数据,如资源、数据库、私有文件目录、首选项、设置。。。

对于一个应用程序的所有活动/服务/广播侦听器,大多数私有数据都是相同的。

由于Application、Activity和Service实现了Context接口,因此可以在api调用需要Context参数时使用它们

上下文是有关应用程序环境的全局信息的接口。这是一个抽象类,其实现由Android系统提供。

上下文允许访问特定于应用程序的资源和类,以及调用应用程序级操作,如启动活动、广播和接收意图等。

以下是示例

 public class MyActivity extends Activity {

      public void Testing() {

      Context actContext = this; /*returns the Activity Context since   Activity extends Context.*/

      Context appContext = getApplicationContext();    /*returns the context of the single, global Application object of the current process. */

      Button BtnShowAct1 = (Button) findViewById(R.id.btnGoToAct1);
      Context BtnContext = BtnShowAct1.getContext();   /*returns the context of the View. */

有关详细信息,请访问http://developer.android.com/reference/android/content/Context.html

Android上下文是一个接口(在一般意义上,而不是在Java意义上;在Java中,上下文实际上是一个抽象类!),它允许访问特定于应用程序的资源、类以及有关应用程序环境的信息。

如果你的android应用程序是一个web应用程序,你的上下文将类似于ServletContext(我没有在这里进行精确的比较)。

您的活动和服务还扩展了Context,因此它们继承了所有这些方法来访问应用程序正在运行的环境信息。

老板助理类比

在深入研究Context的技术性之前,让我们先做一个小类比

每个老板都有一个助手或一个办事少的人(跑腿)对他来说,重要而耗时的事情。例如,如果需要一份文件或咖啡,那么助手就可以跑了。老板不会知道后台正在发生什么,但文件或任务将生产所以在这里Boss-Android应用程序助手-上下文文件或咖啡杯-资源

Android开发者官方网站对Context的描述

上下文是应用程序相关资源的访问点

让我们看看这些资源或任务

启动活动。获取文件系统上特定于应用程序的缓存目录的绝对路径。确定系统中运行的特定进程和用户ID是否允许给定权限。检查是否已授予您特定权限。

等等因此,如果一个Android应用程序想要启动一个活动,它将直接转到Context(访问点),Context类将资源返回给他(在本例中为Intent)。

与任何其他类一样,Context类具有字段和方法。您可以在官方文档中探索更多关于Context的内容,它几乎涵盖了所有内容、可用的方法、字段,甚至包括如何将字段与方法一起使用。

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

嗯,对我来说,这一切听起来就像我们老前辈过去所说的全局变量,当对象定向进入场景时,这是非常令人反感的

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

为了简单起见,我们可以说:全局变量≈上下文

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

请查看John Ousterhout的《软件设计哲学》,7.5传递变量。

全局变量使得无法创建两个独立变量同一进程中同一系统的实例,因为访问全局变量将发生冲突。...我最常用的解决方案是引入上下文对象,如图7.2(d).上下文存储应用程序的所有全局状态(否则将是传递变量或全局变量变量)。大多数应用程序的全局变量中都有多个变量状态,表示配置选项、共享子系统和性能计数器。每个有一个上下文对象系统的实例。上下文允许系统在单个进程中共存,每个进程都有自己的上下文。

稍后在评论部分,您将看到比约恩的另一条评论

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

他也是对的。

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

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

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