简单地说:
顾名思义,它是应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序的另一部分(活动和包/应用程序)的信息。
您可以通过调用 getApplicationContext()
、getContext()
、getBaseContext()
或 this
来获取上下文(在从 Context
扩展的类中,例如 Application、Activity、Service 和 IntentService 类)。
上下文的典型用法:
创建新对象:创建新视图、适配器、监听器:TextView tv = new TextView(getContext()); ListAdapter 适配器 = new SimpleCursorAdapter(getApplicationContext(), ...);
访问标准公共资源: LAYOUT_INFLATER_SERVICE、SharedPreferences 等服务: context.getSystemService(LAYOUT_INFLATER_SERVICE) getApplicationContext().getSharedPreferences(*name*, *mode*);
隐式访问组件:关于内容提供者、广播、意图 getApplicationContext().getContentResolver().query(uri, ...);
上下文的定义
上下文表示环境数据
它提供对数据库等事物的访问
更简单的术语(示例 1)
考虑一下 Person-X 是一家初创软件公司的 CEO。
公司有一位首席架构师,这位首席架构师负责公司的所有工作,包括数据库、用户界面等。
现在 CEO 聘请了一位新的开发人员。
架构师根据新人的技能来告诉新人的职责,他是否将在数据库或UI等方面工作。
更简单的术语(示例 2)
这就像访问应用程序资源的 android 活动一样。
这就像您访问酒店时,您想要在合适的时间享用早餐,午餐和晚餐,对吧?
逗留期间还有很多其他喜欢的东西。你怎么得到这些东西?
您要求客房服务人员为您带来这些东西。
考虑到您是单一活动,酒店是您的应用程序,这里的客房服务人员是上下文,最后早餐、午餐和晚餐必须是资源。
涉及上下文的事情是:
加载资源。启动一项新活动。创建视图。获取系统服务。
Context是Activity、Service、Application等的基类
另一种描述方式:将上下文视为电视的远程,电视中的频道是资源、服务、使用意图等 - - 这里远程充当访问前台所有不同资源的访问权限。
因此,Remote 可以访问资源、服务、使用意图等渠道......
同样...有权访问远程的人自然可以访问所有事物,例如资源、服务、使用意图等
获取上下文的不同方法
获取应用程序上下文()
获取上下文()
getBaseContext()
或者这个(在活动课上时)
例子:
TextView tv = new TextView(this);
关键字 this
指的是当前活动的上下文。
getApplicationContext()
,getContext()
,getBaseContext()
.....请参阅此-> (stackoverflow.com/a/10641257)
SomeActivityName.this
。在实例的线程中,this
指的是线程而不是活动
Android中的上下文这个话题似乎让很多人感到困惑。人们只知道在 Android 中做一些基本的事情经常需要 Context。人们有时会因为试图执行一些需要上下文的操作而感到恐慌,但他们不知道如何“获取”正确的上下文。我将尝试揭开 Android 中 Context 的神秘面纱。对该问题的全面处理超出了本文的范围,但我将尝试给出一个总体概述,以便您了解 Context 是什么以及如何使用它。要了解什么是 Context,我们来看一下源码:
上下文到底是什么?
好吧,文档本身提供了一个相当简单的解释: Context 类是“应用程序环境的全局信息的接口”。
Context 类本身被声明为一个抽象类,其实现由 Android 操作系统提供。该文档进一步提供了 Context “......允许访问特定于应用程序的资源和类,以及对应用程序级操作的调用,例如启动活动、广播和接收意图等”。
你可以很好地理解,现在,为什么叫Context。这是因为它就是这样。如果您愿意,上下文为活动、服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而能够访问全局应用程序环境。换句话说:上下文提供了组件问题的答案:“我与应用程序的关系到底在哪里,我如何访问/与应用程序的其余部分通信?”如果这一切看起来有点令人困惑,那么快速查看 Context 类公开的方法可以提供一些关于其真实性质的进一步线索。
以下是这些方法的随机抽样:
getAssets() getResources() getPackageManager() getString() getSharedPrefsFile()
所有这些方法有什么共同点?它们都使有权访问上下文的任何人都能够访问应用程序范围的资源。
换句话说,上下文将引用它的组件与应用程序环境的其余部分挂钩。例如,资产(想想项目中的“/assets”文件夹)在整个应用程序中都是可用的,前提是 Activity、Service 或任何知道如何访问这些资源的东西。 getResources()
也是如此,它允许我们执行 getResources().getColor()
之类的操作,它会将您连接到 colors.xml
资源中(没关系,aapt 允许通过 java 代码访问资源,这是一个单独的问题)。
结果是 Context
允许访问系统资源并将组件连接到“更大的应用程序”中。让我们看看 Context
的子类,这些类提供抽象 Context
类的实现。最明显的类是 Activity
类。Activity
继承自 ContextThemeWrapper
,后者继承自 ContextWrapper
,后者继承自 Context
本身。这些类有助于深入了解事物,但是现在,只要知道 ContextThemeWrapper
和 ContextWrapper
与它们听起来很像就足够了。它们通过“包装”上下文(实际上下文)并委托它们来实现 Context
类本身的抽象元素函数适用于该上下文。一个示例很有帮助 - 在 ContextWrapper
类中,来自 Context
类的抽象方法 getAssets
实现如下:
@Override
public AssetManager getAssets() {
return mBase.getAssets();
}
mBase
只是构造函数对特定上下文的字段集。因此包装了一个上下文,ContextWrapper
将其 getAssets 方法的实现委托给该上下文。让我们回到检查最终继承自 Context
的 Activity
类,看看这一切是如何工作的。
您可能知道 Activity 是什么,但回顾一下 - 它基本上是“用户可以做的一件事”。它负责提供一个窗口来放置用户与之交互的 UI。熟悉其他 API 的开发人员甚至非开发人员可能会在当地将其视为“屏幕”。这在技术上是不准确的,但对我们的目的来说并不重要。那么 Activity
和 Context
如何交互以及它们的继承关系到底发生了什么?
同样,查看具体示例很有帮助。我们都知道如何启动活动。如果您有启动 Activity 的“上下文”,您只需调用 startActivity(intent)
,其中 Intent 描述了您启动 Activity 的上下文以及您想要启动的 Activity。这是熟悉的startActivity(this, SomeOtherActivity.class)
。
this
是什么? this
是您的 Activity,因为 Activity
类继承自 Context
。完整的独家新闻是这样的:当您调用 startActivity
时,Activity
类最终会执行如下操作:
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
因此它利用了 Instrumentation
类中的 execStartActivity
(实际上来自 Instrumentation
中称为 ActivityResult
的内部类)。
在这一点上,我们开始了解系统内部。
这是操作系统实际处理一切的地方。那么 Instrumentation 究竟是如何启动 Activity 的呢?嗯,上面 execStartActivity
方法中的参数 this
就是您的 Activity,即 Context,而 execStartActivity
使用了这个上下文。
一个 30,000 的概述是这样的:Instrumentation 类跟踪它正在监视的活动列表以完成其工作。此列表用于协调所有活动,并确保在管理活动流程中一切顺利。
有些操作我还没有完全研究到哪个协调线程和进程问题。最终,ActivityResult
使用原生操作 - ActivityManagerNative.getDefault().startActivity()
,它使用您在调用 startActivity
时传入的 Context
。如果需要,您传入的上下文用于协助“意图解决”。意图解析是系统在没有提供意图的情况下可以确定意图目标的过程。 (在此处查看指南以获取更多详细信息)。
为了让 Android 执行此操作,它需要访问由 Context
提供的信息。具体来说,系统需要访问 ContentResolver
,以便它可以“确定意图数据的 MIME 类型”。关于 startActivity
如何使用上下文的整个过程有点复杂,我不完全理解我自己的内部结构。我的主要观点只是说明需要如何访问应用程序范围的资源才能执行许多对应用程序至关重要的操作。Context
是提供对这些资源的访问权限的原因。一个更简单的示例可能是视图。我们都知道您通过扩展 RelativeLayout
或其他一些 View
类创建自定义视图,您必须提供一个将 Context
作为参数的构造函数。当您实例化自定义视图时,您将在上下文中传递. 为什么?因为 View 需要能够访问主题、资源和其他 View 配置详细信息。View 配置实际上就是一个很好的例子。每个 Context 都有各种设置的参数(Context
的实现中的字段)由操作系统本身用于诸如显示的尺寸或密度之类的事情是的。很容易看出为什么这些信息对于设置视图等很重要。
最后一句话:出于某种原因,Android 新手(甚至不那么新的人)在谈到 Android 时似乎完全忘记了面向对象编程。出于某种原因,人们试图将他们的 Android 开发转变为先入为主的范式或习得的行为。
Android 有它自己的范式和一定的模式,如果放下你的先入为主的观念,只需阅读文档和开发指南,它实际上是相当一致的。然而,我的真正观点是,虽然“获取正确的上下文”有时可能很棘手,但人们会毫无道理地恐慌,因为他们遇到了需要上下文但认为自己没有上下文的情况。再一次,Java 是一种具有继承设计的面向对象的语言。
您只在 Activity 中“拥有”上下文,因为您的 Activity 本身继承自 Context。它没有魔法(除了操作系统自己设置各种参数和正确“配置”你的上下文的所有东西)。因此,抛开内存/性能问题(例如,当您不需要时持有对上下文的引用或以对内存有负面影响的方式执行它等),上下文是一个像其他任何对象一样的对象,它可以被传递就像任何 POJO(普通旧 Java 对象)一样。有时您可能需要做一些聪明的事情来检索该上下文,但是任何从 Object 本身扩展而来的常规 Java 类都可以以可以访问上下文的方式编写;只需公开一个接受上下文的公共方法,然后根据需要在该类中使用它。这并不是对 Context 或 Android 内部的详尽处理,但我希望它有助于揭开 Context 的神秘面纱。
上下文是系统的句柄;它提供诸如解析资源、获取对数据库和首选项的访问权限等服务。 Android 应用程序具有活动。 Context 就像您的应用程序当前运行的环境的句柄。活动对象继承了 Context 对象。
有关详细信息,请查看 Introduction to Android development with Android Studio - Tutorial。
Context
是有关应用程序环境的全局信息的“接口”。在实践中,Context
实际上是一个抽象类,其实现由 Android 系统提供。
它允许访问特定于应用程序的资源和类,以及对应用程序级操作的向上调用,例如启动活动、广播和接收意图等。
在下图中,您可以看到类的层次结构,其中 Context
是该层次结构的根类。特别值得强调的是,Activity
是 Context
的后代。
https://i.stack.imgur.com/mn21A.png
Context
到底是什么?
根据 Android 参考文档,它是一个代表各种环境数据的实体。它提供对本地文件、数据库、与环境关联的类加载器、服务(包括系统级服务)等的访问。在整本书中,以及在您使用 Android 进行的日常编码中,您会看到上下文频繁地传递。
来自“Android in Practice”一书,p。 60.
一些 Android API 需要 Context
作为参数
如果您查看各种 Android API,您会注意到其中许多都将 android.content.Context
对象作为参数。您还会看到 Activity 或 Service 通常用作 Context
。这是因为这两个类都从 Context
扩展而来。
在 android 中理解 context
的简单示例:
每个老板都有一个助手来照顾,做所有不那么重要和耗时的任务。如果需要文件或喝杯咖啡,助理就会跑来跑去。有些老板几乎不知道办公室里发生了什么,所以他们也向他们的助理询问了这件事。他们自己做一些工作,但对于大多数其他事情,他们需要助手的帮助。
在这种情况下,
Boss – 是安卓应用
助手 - 是一个上下文
文件/一杯咖啡——是资源
当我们需要获取有关应用程序不同部分(如活动、应用程序等)的信息时,我们通常调用上下文。
涉及上下文的一些操作(需要助手的事情):
加载公共资源
创建动态视图
显示 Toast 消息
开展活动等
获取上下文的不同方法:
getContext()
getBaseContext()
getApplicationContext()
this
Context 表示获取环境数据的句柄。
Context 类本身被声明为抽象,其实现由 android OS 提供。
上下文就像电视的遥控器,电视中的频道是资源,服务等。
你能用它做什么?
加载资源。
启动一项新活动。
创建视图。
获取系统服务。
获取上下文的方法:
获取应用程序上下文()
获取上下文()
getBaseContext()
只是把它放在那里给新手;
所以首先了解 Word Context :
在英语库中。它的意思是:
“构成事件、陈述或想法的背景,并据此可以充分理解和评估的环境。” “文字或口语中紧接在单词或段落之前和之后并阐明其含义的部分。”
现在对编程世界采取同样的理解:
应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序另一部分(活动、包/应用程序)的信息
您可以通过调用 getApplicationContext()
、getContext(), getBaseContext()
或 this
(在活动类中时)来获取上下文。
要在应用程序中的任何位置获取上下文,请使用以下代码:
在您的 android 应用程序中创建新类 AppContext
public class AppContext extends Application {
private static Context context;
public void onCreate(){
super.onCreate();
AppContext.context = getApplicationContext();
}
public static Context getAppContext() {
return AppContext.context;
}
}
现在,任何时候你想在非活动类中使用应用程序上下文,调用这个方法,你就有了应用程序上下文。
希望这有帮助;)
可以将其视为已隔离应用程序或服务运行的进程的 VM。隔离环境可以访问一堆底层系统信息和某些允许的资源。您需要该上下文来获得这些服务。
上下文是对当前对象的引用。上下文还允许访问有关应用程序环境的信息。
android.content.Context
类提供与 Android 系统和项目资源的连接。它是有关应用程序环境的全局信息的接口。
上下文还提供对 Android 服务的访问,例如位置服务。
活动和服务扩展了 Context
类。
上下文 是有关应用程序环境的全局信息的接口。它是一个抽象类,其实现由 Android
系统提供。
Context
允许访问特定于应用程序的资源和类,以及调用应用程序级操作,例如 launching activities, broadcasting and receiving intents, etc.
这是示例
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
Context 是 android.content.Context 类的实例,提供与执行应用程序的 Android 系统的连接。例如,您可以通过 Context 查看当前设备显示的大小。
它还提供对项目资源的访问。它是有关应用程序环境的全局信息的接口。
Context 类还提供对 Android 服务的访问,例如触发基于时间的事件的警报管理器。
活动和服务扩展了 Context 类。因此它们可以直接用于访问上下文。
上下文是应用程序/对象当前状态的上下文。它是代表各种环境数据的实体。上下文有助于当前活动与外部 android 环境交互,例如本地文件、数据库、与环境关联的类加载器、包括系统级服务在内的服务等。
上下文是系统的句柄。它提供诸如解析资源、获取对数据库和首选项的访问权限等服务。一个 android 应用程序有活动。它就像您的应用程序当前运行的环境的句柄。活动对象继承了 Context 对象。
获取上下文的不同调用方法 1. getApplicationContext()、2. getContext()、3. getBaseContext() 4. 或 this(在活动类中时)。
上下文基本上是用于资源访问和获取应用程序(用于应用程序上下文)或活动(用于活动上下文)或任何其他的环境细节......
为了避免内存泄漏,您应该为每个需要上下文对象的组件使用应用程序上下文......更多请点击 here
Context 是 Android 提供的一个抽象类,因此,它的工作是将您的应用程序代码与 Android 系统连接起来。通过从上下文(活动、服务和您的应用程序)继承的类,您的应用程序获得了访问只有操作系统才能访问的资源和功能的能力。
当上下文后代对象被操作系统实例化(通过操作系统控制的实例化机制,如“意图”)时,它们将由操作系统管理,因此它们获得生命周期。
对于其他任何事情,在方法调用中将上下文作为参数传递,允许此方法使用上下文作为与操作系统通信的通道,以便到达操作系统并要求它执行某些操作或返回某些资源。
将上下文与清单一起可视化
https://i.stack.imgur.com/qAwEQ.jpg
为了可视化运行中的 Android 上下文和清单,一个旧的呼叫中心交换机是一个很好的类比。
基础是 Android 系统,连接每个正在运行的应用程序的所有应用程序组件的所有线路都出现在这里。
每个“交换机应用程序”都包含一些插件孔,它们代表应用程序的清单组件声明。因此,通过清单声明,Android 系统了解这些插件的存在,因此它可以通过意图创建对象来插入新的上下文线路。每条线都代表一个连接到应用程序的某些可启动组件或应用程序本身的 Android 上下文。您可以使用现有的线,因为它与Android系统连接,以请求需要通过操作系统来完成的各种事情。你可以假设当一个活动被破坏时,它的电线被拔掉了。当构建另一个活动(或另一个组件)时,会出现一条新线并连接到正确的清单声明的插头孔。
我写了一篇解释 how the Context couples your app to the android system 的整篇文章:
Context
是我们大多数人所说的应用程序。它是由 Android 系统制作的,只能做应用程序能够做的事情。在 Tomcat 中,上下文也就是我所说的应用程序。
有一个 Context 可以容纳多个 Activity,每个 Activity 可能有多个 View。
显然,有些人会说它不适合因为这个或那个,他们可能是对的,但是说 Context 是您当前的应用程序将帮助您了解您在方法参数中放入的内容。
上下文意味着 Android 了解我应该从事哪些活动或采取行动。
1 - Toast.makeText(context, "Enter All Details", Toast.LENGTH_SHORT).show();
它用于此。 Context context = ActivityName.this;
2 -startActivity(new Intent(context,LoginActivity.class));
在这种情况下,意味着您想从哪个活动转到其他活动。 context 或 ActivityName.this 比 getContext 和 getApplicatinContext 更快。
老板助理类比
在深入探讨 Context 的技术性之前,让我们先做一个小类比
每个老板都有一个助手或某人(跑腿)为他做不那么重要和更耗时的事情。例如,如果他们需要文件或咖啡,那么助手就会运行。 Boss 不会知道后台发生了什么,但文件或任务将被传递 So Here Boss - Android 应用程序助手 - 上下文文件或一杯咖啡 - 资源
官方 Android 开发者网站对 Context 的评价
上下文是应用程序相关资源的访问点
让我们看看一些这样的资源或任务
启动一项活动。
获取文件系统上特定于应用程序的缓存目录的绝对路径。
确定系统中运行的特定进程和用户 ID 是否允许给定权限。
检查您是否已被授予特定权限。
以此类推。
因此,如果一个 Android 应用程序想要启动一个 Activity,它会直接转到 Context
(接入点),然后 Context
类将资源返回给他(在本例中为 Intent)。
与任何其他类一样,Context
类具有字段和方法。
您可以在官方文档中探索有关 Context
的更多信息,它几乎涵盖了所有内容、可用的方法、字段,甚至是如何将字段与方法一起使用。
简而言之,Android Context
是一团乱麻,除非您不再担心,否则您不会爱上它。
Android Context
是:
神物。
当您开始为 Android 开发时,您想要传递所有应用程序的东西,但当您更接近编程、测试和 Android 本身时会避免这样做。依赖不明确。内存泄漏的常见来源。用于测试的 PITA。
依赖不明确。
内存泄漏的常见来源。
用于测试的 PITA。
Android 系统用于调度权限、资源、偏好、服务、广播、样式、显示对话框和膨胀布局的实际上下文。并且对于一些单独的事情,您需要不同的 Context 实例(显然,您不能显示来自应用程序或服务上下文的对话框;从应用程序和活动上下文扩展的布局可能会有所不同)。
android.content.Context 类的实例提供与执行应用程序的 Android 系统的连接。例如,您可以通过 Context 查看当前设备显示的大小。
它还提供对项目资源的访问。它是有关应用程序环境的全局信息的接口。
Context 类还提供对 Android 服务的访问,例如触发基于时间的事件的警报管理器。
活动和服务扩展了 Context 类。因此它们可以直接用于访问上下文。
上下文是每个 app-s Sandbox 的 android 特定 api,它提供访问应用程序私有数据,如资源、数据库、私有文件目录、首选项、设置......
对于一个应用程序的所有活动/服务/广播侦听器,大多数私有数据都是相同的。
由于 Application、Activity、Service 实现了 Context 接口,它们可以用于 api 调用需要 Context 参数的地方
如果您想将 Context 与 Android 中其他熟悉的类联系起来,请记住以下结构:
上下文 < ContextWrapper < 应用程序上下文 < ContextWrapper < ContextThemeWrapper < Activity 上下文 < ContextWrapper < ContextThemeWrapper < Activity < ListActivity 上下文 < ContextWrapper < 服务上下文 < ContextWrapper < 服务 < IntentService
所以,所有这些类都是以它们自己的方式的上下文。如果您愿意,可以将 Service 和 ListActivity 转换为 Context。但是如果你仔细观察,一些类也继承了主题。在活动或片段中,您希望将主题应用于您的视图,但不关心它,例如服务类。
我解释了上下文here中的差异。
Context
表示不同时间段的组件(或应用程序)。如果我确实在下午 1 点到 2 点之间吃了这么多食物,那么我那段时间的上下文将用于访问我在那段时间使用的所有方法(或资源)。内容是特定时间的组件(应用程序)。应用程序的组件Context
会根据组件或应用程序的底层生命周期不断变化。例如,在 Activity
的 onCreate() 内,
getBaseContext()
- 给出由 Activity 的构造函数设置(创建)的 Activity
的 context
。 getApplicationContext()
- 在创建应用程序期间提供 Context
设置(已创建)。
注意:<application>
包含所有 Android 组件。
<application>
<activity> .. </activity>
<service> .. </service>
<receiver> .. </receiver>
<provider> .. </provider>
</application>
这意味着,当您从任何组件内部调用 getApplicationContext()
时,您正在调用整个应用程序的公共上下文。
Context
系统会根据组件的生命周期不断修改。
Context
到底是什么?
根据 Android 参考文档,它是一个代表各种环境数据的实体。它提供对本地文件、数据库、与环境关联的类加载器、服务(包括系统级服务)等的访问。在整本书中,以及在您使用 Android 进行的日常编码中,您会看到上下文频繁地传递。
来自“Android in Practice”一书,p。 60.
一些 Android API 需要 Context
作为参数
如果您查看各种 Android API,您会注意到其中许多都将 android.content.Context
对象作为参数。您还会看到 Activity 或 Service 通常用作 Context
。这是因为这两个类都从 Context
扩展而来。
将 Context 想象成一个包含不同资源的盒子:字符串、颜色和字体。如果您需要资源,请转到此框。当您旋转屏幕时,此框会更改,因为方向更改为横向。
有关上下文的更多详细信息,请阅读 this 文章。我将简要解释一下。
如果您想知道上下文是什么,您必须知道它的作用……例如 getContext() 是检索上下文的方法之一。在 getContext() 中,Context 与 Activity 及其生命周期相关联。我们可以将 Context 想象成位于 Activity 后面的层,它会随着 Activity 的存在而存在。 Activity 消亡的那一刻,Context 也会消亡。此方法提供了活动的功能列表,例如:
Load Resource Values,
Layout Inflation,
Start an Activity,
Show a Dialog,
Start a Service,
Bind to a Service,
Send a Broadcast,
Register BroadcastReceiver.
现在想象一下:
上下文是一个层(接口),它位于其组件(活动、应用程序……)和组件生命周期的后面,它提供对应用程序环境和 Android 框架支持的各种功能的访问。
Context
表示当前。 Context
用于对当前屏幕进行操作。例如
<强> 1。 getApplicationContext()
<强> 2。 getContext()
Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();
context.getSystemService(LAYOUT_INFLATER_SERVICE)
中,context
在哪里以及如何定义?