在Android编程中,Context类到底是什么?它用于什么?
我在开发者网站上读过这篇文章,但我无法清楚地理解它。
在Android编程中,Context类到底是什么?它用于什么?
我在开发者网站上读过这篇文章,但我无法清楚地理解它。
当前回答
上下文是指不同时间段内的组件(或应用程序)。如果我确实在下午1点到2点之间吃了那么多食物,那么我在这段时间内使用的所有方法(或资源)都将被用来访问。内容是特定时间的组件(应用程序)。应用程序组件的上下文根据组件或应用程序的底层生命周期不断变化。例如,在Activity的onCreate()内,
getBaseContext()--提供由Activity的构造函数设置(创建)的Activity的上下文。getApplicationContext()--在创建应用程序期间提供Context设置(已创建)。
注意:<application>包含所有Android组件。
<application>
<activity> .. </activity>
<service> .. </service>
<receiver> .. </receiver>
<provider> .. </provider>
</application>
这意味着,当您从任何组件内部调用getApplicationContext()时,您正在调用整个应用程序的公共上下文。
系统根据组件的生命周期不断修改上下文。
其他回答
如果您查看的评论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方法从其对象,并将其传递给新对象的构造函数。用这个方法,上下文在任何地方都可用,但它只显示为构造函数中的显式参数。
上下文是对当前对象的引用。上下文还允许访问有关应用程序环境的信息。
老板助理类比
在深入研究Context的技术性之前,让我们先做一个小类比
每个老板都有一个助手或一个办事少的人(跑腿)对他来说,重要而耗时的事情。例如,如果需要一份文件或咖啡,那么助手就可以跑了。老板不会知道后台正在发生什么,但文件或任务将生产所以在这里Boss-Android应用程序助手-上下文文件或咖啡杯-资源
Android开发者官方网站对Context的描述
上下文是应用程序相关资源的访问点
让我们看看这些资源或任务
启动活动。获取文件系统上特定于应用程序的缓存目录的绝对路径。确定系统中运行的特定进程和用户ID是否允许给定权限。检查是否已授予您特定权限。
等等因此,如果一个Android应用程序想要启动一个活动,它将直接转到Context(访问点),Context类将资源返回给他(在本例中为Intent)。
与任何其他类一样,Context类具有字段和方法。您可以在官方文档中探索更多关于Context的内容,它几乎涵盖了所有内容、可用的方法、字段,甚至包括如何将字段与方法一起使用。
Context是Android提供的抽象类,因此,它的任务是将应用程序代码与Android系统连接起来。通过从Context继承的类(活动、服务和应用程序),您的应用程序能够访问仅由操作系统访问的资源和功能。
当上下文后代对象被操作系统实例化(通过OS控制的实例化机制,如“意图”)时,它们将由操作系统管理,因此,它们将获得生命周期。
除此之外,将上下文作为方法调用中的参数传递,允许此方法将上下文用作与操作系统通信的通道,以便到达操作系统并要求其执行某些操作或返回某些资源。
将上下文与清单一起可视化
为了将Android环境和Manifest可视化,一个旧的呼叫中心交换机就是一个很好的类比。
基础是Android系统,连接每个正在运行的应用程序的所有应用程序组件的所有电线都出现在这里。
每个“交换机应用程序”都包含一些插件孔,它们代表应用程序的清单组件声明。因此,通过清单声明,Android系统了解到这些插件孔的存在,从而可以通过意图创建对象来插入新的上下文连接。每条连线表示一个Android上下文,该上下文连接到应用程序的某个可启动组件或应用程序本身。您可以使用现有的电线,因为它与Android系统连接,以便请求完成需要通过操作系统完成的所有事情。你可以假设当一个活动被破坏时,它的电线被拔掉了。当构建另一个活动(或另一个组件)时,一条新的电线会出现并连接到正确的清单声明的插孔。
我写了一篇完整的文章,解释了Context如何将您的应用程序与android系统相结合:
上下文是系统的句柄;它提供诸如解析资源、访问数据库和首选项等服务。Android应用程序有活动。上下文就像应用程序当前运行的环境的句柄。活动对象继承上下文对象。
有关更多信息,请参阅Android Studio的Android开发简介-教程。