在Android编程中,究竟什么是Context
类以及它用于什么?
我在developer site上看过它,但我无法理解它。
答案 0 :(得分:1374)
简单地说:
顾名思义,它是应用程序/对象当前状态的上下文。它允许新创建的对象了解正在发生的事情。通常,您可以通过调用它来获取有关程序其他部分(活动和包/应用程序)的信息。
您可以通过调用getApplicationContext()
,getContext()
,getBaseContext()
或this
(在类似于Context
的类中)来获取上下文,例如应用程序,活动,服务和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, ...);
答案 1 :(得分:462)
考虑到Person-X是一家初创软件公司的首席执行官。
公司中有一位首席架构师,这位首席架构师 完成公司中涉及数据库,UI等所有工作 等
现在首席执行官聘请了一位新的开发人员。
建筑师告诉新雇员的责任 基于新人技能的人,他是否愿意 在数据库或用户界面等方面工作。
这就像访问Android活动到应用程序的资源一样。
这与您访问酒店时的情况类似,您需要早餐,午餐和早餐。 晚餐在适当的时间,对吗?
入住期间,您还有很多其他的事情。你怎么 得到这些东西?
您要求客房服务人员为您带来这些东西。
这里的客房服务人员是考虑到你的情况 单项活动和酒店成为您的应用程序,最后是早餐,午餐和 晚餐必须是资源。
涉及背景的事情是:
另一种描述这种情况的方法:将上下文视为电视和电视的遥控器。电视中的频道是资源,服务,使用意图等 - - - 这里遥控器作为访问权限,可以访问前景中的所有不同资源。
因此,Remote可以访问资源,服务,使用意图等渠道....
同样......有权访问远程的人自然可以访问所有资源,服务,使用意图等内容
您可以通过不同方法获取上下文
getApplicationContext()
getContext()
getBaseContext()
this
(在活动课程中时)示例:的
TextView TV=new TextView(this);
this
- >指当前活动的背景。
答案 2 :(得分:301)
Android中的Context主题似乎让很多人感到困惑。人们只知道在Android中做基本的事情经常需要Context。人们有时会感到恐慌,因为他们试图执行一些需要上下文的操作,他们不知道如何“获得”正确的上下文。我将尝试揭开Android中Context的神秘面纱。对该问题的完整处理超出了本文的范围,但我将尝试给出一般概述,以便您了解Context是什么以及如何使用它。要了解Context是什么,让我们来看看源代码:
什么是上下文?
嗯,文档本身提供了一个相当直接的解释:Context类是“关于应用程序环境的全局信息的接口"。
Context类本身被声明为抽象类,其实现由Android OS提供。该文档进一步规定Context“...允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动活动,广播和接收意图等等#34;。
现在,您可以很好地理解为什么名称是Context。这是因为就是这样。 Context(如果您愿意)为活动,服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而允许访问全局应用程序环境。 换句话说:上下文提供了组件问题的答案:“我到底与app有什么关系?我如何访问/与应用程序的其余部分进行通信?”如果这一切看起来有点令人困惑,请快速查看Context类公开的方法提供了一些关于其真实性质的进一步线索。
以下是这些方法的随机抽样:
getAssets()
getResources()
getPackageManager()
getString()
getSharedPrefsFile()
所有这些方法有什么共同之处?它们都允许有权访问Context的任何人能够访问应用程序范围的资源。
换句话说,上下文将具有对它的引用的组件挂钩到应用程序环境的其余部分。例如,资产(例如项目中的'/ assets'文件夹)可在整个应用程序中使用,前提是活动,服务或其他任何知道如何访问这些资源的人。 同样适用于getResources()
,它允许执行诸如getResources().getColor()
之类的事情,它会将你挂钩到colors.xml
资源(永远不要说aapt允许通过java代码访问资源,这是一个单独的问题)。
结果是Context
能够访问系统资源,以及它将组件挂钩到“更大的应用程序”中。
让我们看一下Context
的子类,这些类提供了抽象Context
类的实现。
最明显的类是Activity
类。 Activity
继承自ContextThemeWrapper
,继承自ContextWrapper
,Context
继承自ContextThemeWrapper
。
这些类对于在更深层次上理解事物很有用,但是现在知道ContextWrapper
和Context
几乎就是它们听起来就足够了。
它们通过“包装”上下文(实际上下文)并将这些函数委托给该上下文来实现ContextWrapper
类本身的抽象元素。
一个示例很有用 - 在getAssets
类中,Context
类中的抽象方法@Override
public AssetManager getAssets() {
return mBase.getAssets();
}
实现如下:
mBase
ContextWrapper
只是构造函数为特定上下文设置的字段。
因此,上下文被包装,Activity
将其getAssets方法的实现委托给该上下文。让我们回过头来检查最终继承自Context
的{{1}}类,看看这一切是如何运作的。
您可能知道什么是活动,但要审查 - 它基本上是用户可以做的一件事。它负责提供一个窗口,用于放置用户与之交互的UI。
熟悉其他API甚至非开发人员的开发人员可能会将其本身视为“屏幕”。这在技术上是不准确的,但对我们的目的而言并不重要。那么Activity
和Context
如何相互作用以及它们的继承关系究竟发生了什么?
同样,查看具体示例会很有帮助。我们都知道如何发起活动。如果你有“上下文”,你正在从中开始活动,你只需调用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
的{{1}}中的内部类。)
此时,我们开始看一眼系统内部。
这是操作系统实际处理所有内容的地方。那么Instrumentation如何准确地启动Activity呢?好吧,上面ActivityResult
方法中的参数this
是您的活动,即上下文,execStartActivity
使用此上下文。
这是一个30,000概述:Instrumentation类保存它正在监视的活动列表的轨迹,以便它能够正常工作。此列表用于协调所有活动,并确保在管理活动流程时一切顺利进行。
有些操作我还没有完全了解哪个坐标线程和进程问题。最终,execStartActivity
使用原生操作ActivityResult
,它使用您在调用ActivityManagerNative.getDefault().startActivity()
时传入的Context
。您传入的上下文用于协助“意图解决”(如果需要)。意图解析是系统在未提供意图目标时确定目标的过程。 (有关详细信息,请查看此处的指南)。
为了让Android执行此操作,它需要访问startActivity
提供的信息。具体来说,系统需要访问Context
,以便它可以“确定意图数据的MIME类型"。
关于ContentResolver
如何利用上下文的这一点有点复杂,我自己并不完全理解内部。我的主要观点是说明如何访问应用程序范围的资源,以便执行对应用程序至关重要的许多操作。 startActivity
提供对这些资源的访问权限。
一个更简单的例子可能是Views。我们都知道您通过扩展Context
或其他RelativeLayout
类来创建自定义视图,您必须提供一个以View
作为参数的构造函数。实例化自定义视图时,您将传递上下文。
为什么?因为View需要能够访问主题,资源和其他View配置详细信息。
查看配置实际上是一个很好的例子。每个Context都有各种参数(Context
实现中的字段),这些参数由OS本身设置,用于显示的尺寸或密度等。很容易理解为什么这些信息对于设置视图等非常重要。
最后一句话: 出于某些原因,Android新手(甚至是不那么新的人)似乎完全忘记了面向对象编程的Android。出于某种原因,人们试图将他们的Android开发转变为预先设想的范例或学习行为。
Android拥有它自己的范例和某种模式,如果放下你预先构思的概念并只是阅读文档和开发指南,它实际上是非常一致的。然而,我的真实观点是,虽然“获得正确的背景”有时候会很棘手,但人们会因为遇到需要上下文并认为自己没有上下文的情况而无理恐慌。 Java是一种面向对象的语言,具有继承设计。
您只有“拥有”Activity内部的上下文,因为您的活动本身继承自Context。它没有什么神奇之处(除了操作系统自己设置各种参数和正确“配置”你的上下文)所做的所有事情。因此,将内存/性能问题放在一边(例如,当您不需要或以对内存产生负面影响的方式执行上下文时保持对上下文的引用等),Context就像任何其他对象一样,它可以传递给它就像任何POJO(Plain Old Java Object)一样。 有时您可能需要做一些聪明的事情来检索该上下文,但是除了Object本身之外的任何其他常规Java类都可以以可访问上下文的方式编写;简单地公开一个带有上下文的公共方法,然后根据需要在该类中使用它。这不是对Context或Android内部的详尽处理,但我希望它有助于揭开Context的神秘感。
答案 3 :(得分:109)
Context是系统的句柄;它提供诸如解析资源,获取对数据库和首选项的访问等服务。 Android应用有活动。 Context类似于当前运行应用程序的环境的句柄。活动对象继承Context对象。
有关详细信息,请查看 Introduction to Android development with Android Studio - Tutorial 。
答案 4 :(得分:77)
Context
是有关应用程序环境的全局信息的“接口”。在实践中,Context
实际上是抽象类,其实现由Android系统提供。
它允许访问特定于应用程序的资源和类,以及应用程序级操作的上调,例如启动活动,广播和接收意图等。
在下图中,您可以看到类的层次结构,其中Context
是此层次结构的根类。特别值得强调的是,Activity
是Context
的后代。
答案 5 :(得分:63)
究竟是什么Context
?
根据Android参考文档,它是表示各种环境数据的实体。它提供对本地文件,数据库,与环境相关的类加载器,服务(包括系统级服务)等的访问。在本书以及使用Android的日常编码中,您将看到Context经常传递。
从“Android in Practice”一书中,p。 60。
多个Android API需要Context
作为参数
如果您查看各种Android API,那么您将会这样做
请注意,他们中的许多人将android.content.Context
对象视为
参数。您还会看到活动或服务通常用作
Context
。这是有效的,因为这两个类都来自Context
。
答案 6 :(得分:43)
Android Context是Interface(在一般意义上,不是Java意义上的;在Java中,Context
实际上是一个抽象类!),允许访问特定于应用程序的有关应用环境的资源和类别及信息。
如果你的Android应用程序是一个网络应用程序,你的上下文将类似于ServletContext
(我在这里没有做出精确的比较)。
您的活动和服务也会扩展Context
,因此他们会继承所有这些方法来访问运行该应用的环境信息。
答案 7 :(得分:37)
理解android中的context
的简单示例:
每个老板都有一个助手照顾,做所有不太重要和耗时的任务。如果需要一个文件或一杯咖啡,一个助手正在运行。有些老板几乎不知道办公室里发生了什么,所以他们也会问他们的助手。他们自己做一些工作,但对于大多数其他事情,他们需要助手的帮助。
在这种情况下,
Boss - 是Android应用程序
助理 - 是上下文
文件/一杯咖啡 - 是资源
当我们需要获取有关应用程序不同部分的信息时,我们通常会调用上下文,例如“活动”,“应用程序”等。
涉及上下文的一些操作(需要助手的事情):
获取背景的不同方式:
getContext()
getBaseContext()
getApplicationContext()
this
答案 8 :(得分:24)
你能用它做什么?
获取背景的方法:
答案 9 :(得分:16)
只是把它放在新手那里;
首先了解Word Context:
英语 - lib。这意味着:
“形成事件,陈述或陈述的环境 这个想法,以及可以完全理解和评估的想法。“
“紧接在...之前的书面或口头的部分 遵循一个词或段落并澄清其含义。“
现在对编程世界采取同样的理解:
应用程序/对象的当前状态的上下文。它允许新创建的对象了解正在发生的事情。通常,您可以调用它来获取有关程序其他部分(活动,包/应用程序)的信息
您可以通过调用getApplicationContext()
,getContext(), getBaseContext()
或this
(在活动类中)来获取上下文。
使用以下代码在应用程序中使用Context Anywhere:
在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;
}
}
现在,只要您想在非活动类中使用应用程序上下文,请调用此方法并获得应用程序上下文。
希望这个帮助;)
答案 10 :(得分:15)
Context是对当前对象的引用。此外,上下文允许访问有关应用程序环境的信息。
答案 11 :(得分:15)
将其视为已经运行应用程序或服务的进程的虚拟机。孤立的环境可以访问大量底层系统信息和某些允许的资源。您需要该上下文才能获得这些服务。
答案 12 :(得分:12)
班级android.content.Context
提供与Android系统的连接和项目的资源。它是有关应用程序环境的全局信息的接口。
Context还提供对Android服务的访问,例如:位置服务。
活动和服务扩展了Context
课程。
答案 13 :(得分:8)
上下文是有关应用程序环境的全局信息的接口。它是一个抽象类,其实现由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
答案 14 :(得分:8)
Context是类的实例android.content.Context提供与执行应用程序的Android系统的连接。例如,您可以通过上下文检查当前设备显示的大小。
它还可以访问项目的资源。它是有关应用程序环境的全局信息的接口。
Context类还提供对Android服务的访问,例如,警报管理器可以触发基于时间的事件。
活动和服务扩展了Context类。因此,它们可以直接用于访问Context。
答案 15 :(得分:7)
Context是应用程序/对象当前状态的上下文。它是表示各种环境数据的实体。 Context帮助当前活动与外部android环境进行交互,如本地文件,数据库,与环境相关的类加载器,包括系统级服务在内的服务等。
Context是系统的句柄。它提供诸如解析资源,获取对数据库和首选项的访问等服务。 Android应用程序有活动。它就像是当前运行应用程序的环境的句柄。活动对象继承Context对象。
可以通过不同的调用方法获取上下文 1. getApplicationContext(), 2. getContext(), 3. getBaseContext() 4.或者这个(在活动课上)。
答案 16 :(得分:7)
Context基本上用于资源访问并获取应用程序(用于应用程序上下文)或活动(用于活动上下文)或任何其他内容的环境详细信息...
为了避免内存泄漏,您应该为需要上下文对象的每个组件使用应用程序上下文....更多点击here
答案 17 :(得分:5)
Context
是我们大多数人称之为应用的内容。它由Android系统制作,只能执行应用程序的功能。
在Tomcat中,Context也是我所称的应用程序。
有一个上下文包含许多活动,每个活动可能有很多视图。
显然,有些人会说它不适合因为这个或那个并且它们可能是正确的,但是说Context是你当前的应用程序将帮助你理解你在方法参数中的内容。
答案 18 :(得分:5)
在深入研究Context
的技术性之前,让我们进行一个小类比每个老板都有一个助手或一个做得少的人(差事男孩) 对他来说重要而且更耗时的事情。例如,如果他们 需要一个文件或咖啡,然后助理将在运行。老板不会 知道后台发生了什么但文件或任务会发生 交付
所以这里 老板 - Android应用程序
助理 - 上下文
文件或一杯咖啡 - 资源
上下文是您的访问点
让我们看看一些这样的资源或任务
发起活动。
获取特定于应用程序的缓存目录的绝对路径 文件系统。
确定是否允许特定的给定权限 系统中运行的进程和用户ID。
检查您是否获得了特定权限。
等等。
因此,如果Android应用程序想要启动一个活动,它会直接进入Context
(访问点),而Context
类会为他提供资源(在这种情况下为Intent)。
与任何其他类Context
类一样,类也有字段和方法
您可以在官方文档中详细了解Context
,它涵盖了几乎所有内容,可用方法,字段甚至如何使用方法中的字段。
答案 19 :(得分:4)
类android.content.Context的实例提供与执行应用程序的Android系统的连接。例如,您可以通过上下文检查当前设备显示的大小。
它还可以访问项目的资源。它是有关应用程序环境的全局信息的接口。
Context类还提供对Android服务的访问,例如,警报管理器可以触发基于时间的事件。
活动和服务扩展了Context类。因此,它们可以直接用于访问Context。
答案 20 :(得分:4)
上下文意味着Android知道我应该参加或参与的活动。
1-Toast.makeText(context, "Enter All Details", Toast.LENGTH_SHORT).show();
它用于此。
Context context = ActivityName.this;
2-{{1}}
在这种情况下,表示您想从哪个活动转到其他活动。 context或ActivityName。这比getContext和getApplicatinContext要快。
答案 21 :(得分:2)
如果您想将 Context 与Android中其他熟悉的类连接,请记住以下结构:
上下文< ContextWrapper<应用
上下文< ContextWrapper< ContextThemeWrapper<活性
上下文< ContextWrapper< ContextThemeWrapper<活动< ListActivity
上下文< ContextWrapper<服务
上下文< ContextWrapper<服务< IntentService
所以,所有这些类都以自己的方式成为上下文。如果您愿意,可以将服务和 ListActivity 投射到上下文。但是如果仔细观察,一些类也会继承主题。在活动或片段中,您希望将主题应用于您的视图,但不要关心它,例如 Service 类。
我在上下文中解释了差异here。
答案 22 :(得分:2)
Context是每个app-Sandbox的特定于Android的api 提供访问应用私有数据,如资源,数据库,私有档案,偏好,设置......
大多数privatedata对于一个应用程序的所有活动/服务/广播用户都是相同的。
由于Application,Activity,Service实现了Context接口,因此可以在api调用需要Context参数的地方使用它们
答案 23 :(得分:2)
简单来说,Androids Context
是一个混乱,你不会爱,直到你不再担心。
Android Context
是:
神的对象。
当你开始为Android开发时,想要传递所有应用程序,但是当你更接近编程,测试和Android本身时,它会避免这样做。
不明确的依赖。
内存泄漏的常见来源。
PITA进行测试。
Android系统用于分派权限,资源,首选项,服务,广播,样式,显示对话框和充气布局的实际上下文。对于某些单独的事物,您需要不同的Context
个实例(显然,您无法显示来自应用程序或服务上下文的对话框;从应用程序和活动上下文中填充的布局可能会有所不同)。
答案 24 :(得分:1)
Context
表示不同时间段的组件(或应用程序)。如果我在下午1点到2点之间吃了这么多的食物,那么我的那段时间用于访问我在那段时间使用的所有方法(或资源)。内容是特定时间的组件(应用程序)。应用程序组件的Context
会根据组件或应用程序的基础生命周期不断变化。
例如,在Activity
的onCreate()内部,
getBaseContext()
- 提供由活动构造函数设置(创建)的context
Activity
。
getApplicationContext()
- 在创建应用程序期间提供Context
设置(已创建)。
注意:<application>
包含所有Android组件。
<application>
<activity> .. </activity>
<service> .. </service>
<receiver> .. </receiver>
<provider> .. </provider>
</application>
这意味着,当您从任何组件内部调用getApplicationContext()
时,您正在调用整个应用程序的公共上下文。
Context
。
答案 25 :(得分:1)
将上下文视为具有不同资源的框:字符串,颜色和字体。如果需要资源,请转到此框。旋转屏幕时,此框会更改,因为方向更改为横向。
答案 26 :(得分:1)
Android中的上下文实际上是我们正在谈论的内容以及当前所处位置的上下文。随着我们的进行,这一点将变得更加清晰。
关于上下文的几个要点:
Context
在Android开发中几乎无处不在,这是Android开发中最重要的事情,因此我们必须理解正确使用它。
错误使用Context
很容易导致android应用程序中的内存泄漏。
由于Android中存在不同类型的上下文,因此作为Android开发人员,我们常常会在哪个位置使用哪个上下文感到困惑。因此,让我们了解一下这些是什么,如何使用它们以及何时使用哪个。
主要是两种类型的上下文:
应用上下文
这是一个单例实例,可以通过getApplicationContext()
在活动中进行访问。该上下文与应用程序的生命周期相关。当您需要一个生命周期与当前上下文分开的上下文时,或者在传递超出活动范围的上下文时,可以使用应用程序上下文。
示例用法:如果必须为应用程序创建一个单例对象,并且该对象需要上下文,请始终传递应用程序上下文。
如果在此处传递活动上下文,则会导致内存泄漏,因为它将保留对活动的引用,并且不会垃圾收集活动。
如果必须在活动中初始化库,请始终传递应用程序上下文,而不是活动上下文。
仅在知道需要getApplicationContext()
才能比其他可能使用的Context
寿命长的东西时才使用Context
。
答案 27 :(得分:1)
Context 是一个Android 提供的抽象类,因此,它的工作是将您的应用程序代码与 Android 系统连接起来。通过从 Context(活动、服务和您的应用)继承的类,您的应用能够访问只能由操作系统访问的资源和功能。
当上下文后代对象被操作系统实例化时(通过操作系统控制的实例化机制,如“意图”),它们由操作系统管理,因此,它们获得生命周期。
对于其他任何事情,在方法调用中将上下文作为参数传递,允许此方法使用上下文作为与操作系统通信的通道,以便到达操作系统并要求它执行一些操作或返回一些资源。
将上下文与清单一起可视化
要可视化运行中的 Android Context 和 Manifest,可以使用旧式呼叫中心总机进行类比。
基础是 Android 系统,其中连接每个正在运行的应用程序的所有应用程序组件的所有电线都出现了。
每个“交换机应用程序”都包含一些插件孔,它们代表应用程序的清单组件声明。因此,通过清单声明,Android 系统了解这些插件的存在,以便它可以通过意图创建对象来插入新的上下文线。
每条线代表一个 Android Context,连接到应用的某个可启动组件,或连接到应用本身。您可以使用现有的电线,因为它与Android系统相连,以便请求需要通过操作系统完成的各种事情。
你可以假设当一个活动被破坏时,它的电线被拔掉了。而在构建另一个活动(或另一个组件)时,会出现一条新线并连接到清单声明的正确插入孔。
我写了整篇文章来解释how the Context couples your app to the android system:
答案 28 :(得分:0)
有关上下文的更多详细信息,请阅读this文章。我将简要说明。
如果您想知道什么是上下文,则必须知道它的作用...
例如 getContext()是检索上下文的方法之一。在getContext()中,上下文与活动及其生命周期相关联。我们可以将上下文想象为活动背后的一层,并且只要活动存在,它就会一直存在。活动死亡的那一刻,上下文也将消失。此方法列出了活动的功能列表,例如:
Load Resource Values,
Layout Inflation,
Start an Activity,
Show a Dialog,
Start a Service,
Bind to a Service,
Send a Broadcast,
Register BroadcastReceiver.
现在想象一下:
上下文是一个位于其组件后面的层(接口) (活动,应用…)和组件的生命周期, 访问应用程序支持的各种功能 环境和Android框架。
答案 29 :(得分:-1)
Context
表示当前。
Context
用于对当前屏幕进行操作。
恩。
的 1。 getApplicationContext()强>
的 2。的getContext()强>
Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();
答案 30 :(得分:-6)
在Java中,我们说这个关键字指的是应用程序当前对象的状态。
同样,在替代方案中,我们在Android开发中有Context
。
这可以明确地或隐含地定义,
Context con = this;
getApplicationContext();
getBaseContext();
getContext();
答案 31 :(得分:-6)
此属性声明此布局与默认情况下相关联的活动。