Answers:
简单地说:
顾名思义,它是应用程序/对象当前状态的上下文。它使新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序另一部分(活动和程序包/应用程序)的信息。
您可以通过调用获取上下文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, ...);
context.getSystemService(LAYOUT_INFLATER_SERVICE)
,在何处以及如何context
定义?
考虑到Person-X是一家新兴软件公司的首席执行官。
公司中有一名首席架构师,该首席设计师负责公司中涉及数据库,UI等的所有工作。
现在,首席执行官雇用了一名新开发人员。
正是架构师根据新员工的技能告诉新员工的责任,即他将从事数据库还是UI等工作。
这就像是通过android活动访问应用程序的资源一样。
这类似于您访问酒店时想要在适当的时间享用早餐,午餐和晚餐,对吗?
在住宿期间,您还喜欢其他许多事情。你怎么得到这些东西?
您要求客房服务人员为您带来这些东西。
考虑到您是单身活动,而酒店是您的应用程序,因此这里的客房服务人员是您的应用程序,最后早餐,午餐和晚餐必须作为资源。
涉及上下文的事物是:
描述这种情况的另一种方式:将上下文视为电视,电视中频道的远程资源,服务,使用意图等---在这里,远程是一种访问所有不同资源的途径。
因此,远程可以访问诸如资源,服务,使用意图等通道。
同样...有权访问远程控制的人自然可以访问所有事物,例如资源,服务,使用意图等
获取上下文的不同方法
getApplicationContext()
getContext()
getBaseContext()
this
(在活动课程中)例:
TextView tv = new TextView(this);
关键字this
是指当前活动的上下文。
getApplicationContext()
,getContext()
,getBaseContext()
.....参见本- >(stackoverflow.com/a/10641257)
SomeActivityName.this
。在实例的线程中,this
是指线程而不是活动
Android中的Context主题似乎使许多人感到困惑。人们只是知道,在Android中执行基本操作经常需要使用Context。人们有时会惊慌,因为他们试图执行一些需要上下文的操作,而他们却不知道如何“获得”正确的上下文。我将尝试揭开Android中上下文的概念的神秘色彩。对该问题的完整处理不在本文的讨论范围之内,但是我将尝试给出一般概述,以便使您对Context是什么以及如何使用它有所了解。要了解什么是上下文,让我们看一下源代码:
上下文到底是什么?
好吧,文档本身提供了一个相当简单的解释:Context类是“有关应用程序环境的全局信息的接口”。
Context类本身被声明为抽象类,其实现由Android OS提供。该文档进一步提供了上下文“……允许访问特定于应用程序的资源和类,以及对应用程序级操作(如启动活动,广播和接收意图等)的调用。”
现在,您可以很好地理解为什么名称是Context。这是因为仅此而已。上下文(如果需要)为活动,服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而可以访问全局应用程序环境。换句话说:上下文为以下组件问题提供了答案:“我相对于应用程序一般在哪里,我如何与应用程序的其余部分进行访问/通信?” 如果这一切似乎有点令人困惑,那么快速查看一下Context类公开的方法,可以进一步了解其真实性质。
这是这些方法的随机抽样:
getAssets()
getResources()
getPackageManager()
getString()
getSharedPrefsFile()
所有这些方法有什么共同点?它们都使任何有权访问上下文的人都能够访问应用程序范围的资源。
换句话说,上下文将对它有引用的组件挂钩到其余的应用程序环境。例如,只要活动,服务或任何知道如何访问这些资源的资源,资产(例如项目中的“ / 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
,并将getAssets方法的实现委托给该上下文。让我们回到检查Activity
最终继承自该类的类,Context
以了解这一切如何工作。
您可能知道什么是活动,但要进行回顾-这基本上是用户可以做的一件事情。它负责提供一个窗口,在其中放置用户与之交互的UI。熟悉其他API的开发人员,甚至是非开发人员,也可能将其视为“屏幕”。从技术上讲这是不准确的,但这对我们的目的并不重要。那么,如何才能Activity
和Context
相互作用,并在他们的继承关系到底是怎么回事?
同样,查看特定示例也很有帮助。我们都知道如何开展活动。只要您具有启动活动的“上下文”,只需调用即可startActivity(intent)
,其中Intent描述了您从中启动活动的上下文以及您要启动的活动。这是熟悉的startActivity(this, SomeOtherActivity.class)
。
那是this
什么?this
是您的Activity,因为Activity
该类从继承Context
。完整的信息如下:当您调用时startActivity
,Activity
该类最终将执行以下操作:
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
因此,它利用了execStartActivity
从Instrumentation
类(实际上是从一个内部类Instrumentation
叫ActivityResult
)。
在这一点上,我们开始窥视系统内部。
这是OS实际处理所有内容的地方。那么Instrumentation如何准确地启动Activity?那么,帕拉姆this
在execStartActivity
上述方法是你的活动,即环境,并且execStartActivity
利用这一背景下的。
这是30,000个概述:Instrumentation类跟踪其监视的Activity列表以完成其工作。该列表用于协调所有活动,并确保在管理活动流程时一切顺利进行。
我还没有完全研究某些操作来协调线程和进程问题。最终,会ActivityResult
使用本机操作- ActivityManagerNative.getDefault().startActivity()
使用Context
您调用时传入的startActivity
。如果需要,您传入的上下文将用于帮助“意图解决”。意图解析是系统可以确定意图目标(如果未提供)的过程。(有关更多详细信息,请参见此处的指南)。
为了使Android能够做到这一点,它需要访问所提供的信息Context
。具体来说,系统需要访问a,ContentResolver
以便它可以“确定意图数据的MIME类型”。关于如何startActivity
使用上下文的整个过程有点复杂,我自己并不完全了解内部结构。只是为了说明如何访问应用程序范围的资源,以执行应用程序必不可少的许多操作。Context
是提供对这些资源的访问权限的一种方法。一个简单的示例可能是视图。我们都知道您创建了一个通过扩展自定义视图 RelativeLayout
或其他一些View
类,您必须提供一个采用Context
作为争论。实例化自定义视图时,您将传递上下文。为什么?因为View需要能够访问主题,资源和其他View配置详细信息。视图配置实际上是一个很好的例子。每个Context具有各种参数(Context
的实现中的字段),这些参数由OS本身为诸如显示器的尺寸或密度之类的东西设置。很容易看出为什么此信息对于设置视图等很重要。
最后一句话: 由于某些原因,刚接触Android的人(甚至不是那么陌生的人)似乎完全忘记了面向对象的编程。由于某些原因,人们试图将他们的Android开发转变为预想的范例或学习的行为。
如果放开您的先入为主的概念并仅阅读文档和开发指南,Android便拥有自己的范例和一定的模式,实际上是相当一致的。但是,我的真实观点是,尽管“获取正确的上下文”有时会有些棘手,但人们会陷入无可救药的恐慌之中,因为他们遇到了需要上下文并认为自己没有上下文的情况。Java再次是具有继承设计的面向对象语言。
您仅“拥有”活动内部的上下文,因为您的活动本身是从上下文继承的。它没有任何魔力(除了操作系统本身所做的所有工作以设置各种参数并正确“配置”您的上下文)。因此,撇开内存/性能问题(例如,在不需要时保留对上下文的引用或以对内存有负面影响的方式进行操作等),上下文就像其他对象一样可以被传递就像任何POJO(普通的旧Java对象)一样。有时您可能需要做一些聪明的事情来检索该上下文,但是任何从Object本身扩展而来的常规Java类都可以用可以访问上下文的方式来编写。只需公开一个采用上下文的公共方法,然后根据需要在该类中使用它。
上下文是系统的句柄;它提供诸如解析资源,获得对数据库和首选项的访问等服务。一个Android应用包含活动。上下文就像是您的应用程序当前正在运行的环境的句柄。活动对象继承了Context对象。
有关更多信息,请参见使用Android Studio进行Android开发简介-教程。
Context
是有关应用程序环境的全局信息的“接口”。实际上,Context
实际上是一个抽象类,其实现由Android系统提供。
它允许访问特定于应用程序的资源和类,以及对应用程序级操作(例如启动活动,广播和接收意图等)的调用。
在下图中,您可以看到类的层次结构,其中Context
是该层次结构的根类。特别值得一提的Activity
是的后代Context
。
到底Context
是什么
根据Android参考文档,它是代表各种环境数据的实体。它提供对本地文件,数据库,与环境关联的类加载器,服务(包括系统级服务)等的访问。在本书中,以及使用Android进行日常编码时,您都会看到Context经常传递。
摘自《实践中的Android》一书。60
多个Android API需要使用Context
as参数
查看各种Android API,您会发现其中许多将android.content.Context
对象作为参数。您还将看到,通常将Activity或Service用作
Context
。之所以有效,是因为这两个类都从扩展Context
。
context
在android中理解的简单示例:
每个老板都有一个助手来照顾,以完成所有次要的,耗时的工作。如果需要一杯咖啡或一杯咖啡,则需要一位助手。一些老板几乎不知道办公室里发生了什么,所以他们也询问助手。他们自己做一些工作,但在其他大多数事情上,则需要助手的帮助。
在这种情况下,
老板–是Android应用程序
助手–是上下文
文件/杯咖啡–资源
当我们需要获取有关应用程序不同部分(例如活动,应用程序等)的信息时,通常将其称为上下文。
涉及上下文的一些操作(需要助手的操作):
获取上下文的不同方式:
getContext()
getBaseContext()
getApplicationContext()
this
你能用它做什么?
获取上下文的方法:
只是把它放在那里给新手;
因此,首先了解Word Context:
在英语库中。它的意思是:
“构成事件,陈述或想法的设置的环境,可以据以充分理解和评估。”
“书面或口语中紧接在单词或段落之前和之后的部分,并阐明其含义。”
现在对编程世界有相同的理解:
应用程序/对象当前状态的上下文。它使新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序另一部分(活动,程序包/应用程序)的信息
您可以通过调用获取上下文getApplicationContext()
,getContext(), getBaseContext()
或this
(在活动课的时候)。
要在应用程序中获取Context Anywhere,请使用以下代码:
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;
}
}
现在,只要您想在非活动类中使用应用程序上下文,都可以调用此方法,并获得应用程序上下文。
希望这个帮助;)
上下文是有关应用程序环境的全局信息的接口。这是一个抽象类,其实现由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环境进行交互,例如本地文件,数据库,与该环境关联的类加载器,包括系统级服务的服务等。
上下文是系统的句柄。它提供诸如解析资源,获得对数据库和首选项的访问等服务。android应用有活动。这就像您的应用程序当前正在运行的环境的句柄。活动对象继承了Context对象。
可以使用不同的调用方法来获取上下文1. getApplicationContext(),2。getContext(),3。getBaseContext()4.或此方法(在活动类中)。
上下文意味着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。
A Context
是我们大多数人所说的Application。它是由Android系统制作的,只能执行应用程序能够执行的操作。在Tomcat中,上下文也称为应用程序。
有一个上下文包含许多活动,每个活动可能具有许多视图。
显然,有人会说因为这个或那个原因不合适,但他们可能是正确的,但是说Context是您当前的应用程序将帮助您了解要在方法参数中添加的内容。
在深入探讨Context的技术性之前,让我们先做个小比喻
每个老板都有一个助手或某人(差事男孩)为他做些次要的事情,并且耗时更多。例如,如果他们需要文件或咖啡,则助手将在运行中。老板不知道后台发生了什么,但是文件或任务将被交付
所以在这里
老板-Android应用程序
助手-上下文
文件或一杯咖啡-资源
上下文是您与应用程序相关的资源的访问点
让我们看一些这样的资源或任务
启动活动。
获取文件系统上应用程序特定的缓存目录的绝对路径。
确定给定的权限是否允许系统中运行的特定进程和用户ID。
检查您是否被授予特定权限。
等等。
因此,如果Android应用程序要启动活动,则直接转到Context
(Access Point),Context
该类将资源返还给他(在这种情况下为Intent)。
像任何其他类一样,Context
类也具有字段和方法。
您可以Context
在官方文档中了解更多信息,其中涵盖了几乎所有内容,可用方法,字段,甚至如何将字段与方法一起使用。
如果要将Context与Android中其他熟悉的类连接,请记住以下结构:
上下文<ContextWrapper <应用程序
上下文<ContextWrapper <ContextThemeWrapper <活动
上下文<ContextWrapper <ContextThemeWrapper <活动<ListActivity
上下文<ContextWrapper <服务
上下文<ContextWrapper <服务<IntentService
因此,所有这些类以它们自己的方式都是上下文。如果愿意,可以将Service和ListActivity强制转换为Context。但是,如果仔细观察,某些类也会继承主题。在活动或片段中,您希望将主题应用于您的视图,但例如,不必关心Service类。
我在这里解释上下文的不同。
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
表示当前。
Context
用于对当前屏幕进行操作。例如
1. getApplicationContext()
2. getContext()
Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();
很好的解释!为了补充上述所有内容,我发现MindOrks的这一功能非常有帮助,甚至展示了一些基本用例来使您的想法得以发展:
此属性声明默认情况下此布局与哪个活动相关联。