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