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. */
你可能知道什么是活动,但要审查 - 它基本上是'a single thing the user can do. It takes care of providing a window in which to place the UI that the user interacts with' . 熟悉其他API甚至非开发人员的开发人员可能会将其视为“屏幕” . 这在技术上是不准确的,但对我们的目的而言并不重要 . 那么 Activity 和 Context 如何进行交互以及它们的继承关系究竟发生了什么?
28 回答
Context是系统的句柄;它提供诸如解析资源,获取对数据库和首选项的访问等服务 . Android应用程序有活动 . Context类似于当前运行应用程序的环境的句柄 . 活动对象继承Context对象 .
有关更多信息,请查看Introduction to Android development with Android Studio - Tutorial .
上下文是应用程序/对象的当前状态的上下文 . 它是表示各种环境数据的实体 . Context帮助当前活动与外部android环境交互,如本地文件,数据库,与环境关联的类加载器,服务(包括系统级服务)等 .
Context是系统的句柄 . 它提供诸如解析资源,获取对数据库和首选项的访问等服务 . Android应用程序有活动 . 它就像是当前运行应用程序的环境的句柄 . 活动对象继承Context对象 .
您可以通过不同的调用方法获取上下文1. getApplicationContext(),2 . getContext(),3 . getBaseContext()4.或者此(在活动类中时) .
Context 是有关应用程序环境的全局信息的接口 . 它是一个抽象类,其实现由
Android
系统提供 .Context
允许访问特定于应用程序的资源和类,以及对应用程序级操作的调用,例如launching activities, broadcasting and receiving intents, etc.
这是例子
有关详细信息,请访问http://developer.android.com/reference/android/content/Context.html
Context主要用于资源访问和获取应用程序(用于应用程序上下文)或活动(用于活动上下文)或任何其他的环境详细信息...
为了避免内存泄漏,您应该为需要上下文对象的每个组件使用应用程序上下文....更多单击here
上下文的定义
Context表示环境数据
它提供对数据库等内容的访问
更简单的术语(例1)
考虑Person-X是一家初创软件公司的首席执行官 .
公司中有一位首席架构师,这位首席架构师负责公司的所有工作,包括数据库,UI等 .
现在首席执行官聘请了一位新的开发人员 .
建筑师根据新人的技能告诉新雇员的责任,他是否会在数据库或用户界面等方面工作 .
更简单的术语(例2)
这就像访问Android活动到应用程序的资源一样 .
这与你去酒店时的情况类似,你想要在适当的时间吃早餐,午餐和晚餐,对吧?
您在入住期间还有许多其他的事情 . 你怎么得到这些东西?
您要求客房服务人员为您带来这些东西 .
这里的客房服务人员是考虑到您是单一活动和酒店作为您的应用程序的背景,最后早餐,午餐和晚餐必须是资源 .
Things that involve context are:
加载资源 .
启动新活动 .
创建视图 .
获取系统服务 .
Context是Activity,Service,Application等的基类
另一种描述这种情况的方法:考虑上下文作为电视中的电视和 Channels 的遥控器是资源,服务,使用意图等 - 这里,遥控器充当访问所有不同资源到前台的访问 .
因此,Remote可以访问资源,服务,使用意图等渠道....
同样......有权访问远程的人自然可以访问所有资源,服务,使用意图等内容
Different methods by which you can get context
getApplicationContext()
getContext()
getBaseContext()
或
this
(在活动类中时)例:
this
- >指当前活动的上下文 .Context是每个app-s Sandbox的android特定api,提供访问应用私有数据,如资源,数据库,私有档案,偏好,设置......
对于一个应用程序的所有活动/服务/广播用户,大多数私有数据都是相同的 .
由于Application,Activity,Service实现了Context接口,因此可以在api调用需要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更快 .
类
android.content.Context
提供与Android系统的连接和项目的资源 . 它是有关应用程序环境的全局信息的接口 .Context还提供对Android服务的访问,例如位置服务 .
活动和服务扩展
Context
类 .What's Context exactly?
从“Android in Practice”一书中,p . 60 .
Several Android APIs require a Context as parameter
如果您查看各种Android API,您会注意到其中许多都将
android.content.Context
对象作为参数 . 您还会看到活动或服务通常用作Context
. 这是有效的,因为这两个类都扩展自Context
.如果您想将Context与Android中其他熟悉的类连接,请记住以下结构:
所以,所有这些类都以自己的方式成为上下文 . 如果您愿意,可以将Service和ListActivity强制转换为Context . 但是如果你仔细观察,一些类也会继承主题 . 在活动或片段中,您希望将主题应用于您的视图,但不要关心它的服务类 .
我解释了上下文中的区别here .
简单来说,Androids
Context
是一个乱七八糟的东西,除非你不再担心,否则你不会喜欢 .Android
Context
s是:上帝的对象 .
当你开始为Android开发时想要传递所有应用程序的东西,但是当你更接近编程,测试和Android本身时,它会避免这样做 .
依赖性不明确 .
内存泄漏的常见来源 .
PITA进行测试 .
Android系统用于调度权限,资源,首选项,服务,广播,样式,显示对话框和膨胀布局的实际上下文 . 并且您需要针对某些单独的事物使用不同的
Context
实例(显然,您无法显示来自应用程序或服务上下文的对话框;从应用程序和活动上下文中填充的布局可能不同) .在Java中,我们说 this keyword指的是应用程序当前对象的状态 .
同样,在替代方案中,我们在Android开发中有
Context
.这可以明确地或隐含地定义,
Android Context是Interface(在一般意义上,不是Java意义上的;在Java中,
Context
实际上是一个抽象类!),它允许访问特定于应用程序的资源以及有关应用程序环境的类和信息 .如果您的Android应用程序是一个Web应用程序,您的上下文将类似于
ServletContext
(我没有在这里进行精确比较) .您的活动和服务也会扩展
Context
,因此它们会继承所有这些方法来访问运行应用程序的环境信息 .android.content.Context类的实例提供与执行应用程序的Android系统的连接 . 例如,您可以通过上下文检查当前设备显示的大小 .
它还可以访问项目的资源 . 它是有关应用程序环境的全局信息的接口 .
Context类还提供对Android服务的访问,例如,警报管理器以触发基于时间的事件 .
活动和服务扩展了Context类 . 因此,它们可以直接用于访问Context .
简单地说:
顾名思义,它是应用程序/对象当前状态的上下文 . 它允许新创建的对象了解正在发生的事情 . 通常,您可以调用它来获取有关程序其他部分(活动和包/应用程序)的信息 .
您可以通过调用
getApplicationContext()
,getContext()
,getBaseContext()
或this
(在从Context
扩展的类中,例如Application,Activity,Service和IntentService类)来获取上下文 .上下文的典型用法:
简单的例子来理解android中的
context
:每个老板都有一个助手照顾,做所有不那么重要和耗时的任务 . 如果需要一个文件或一杯咖啡,助手就在运行中 . 有些老板几乎不知道办公室里发生了什么,所以他们也会问他们的助手 . 他们自己做一些工作,但对于大多数其他事情,他们需要助手的帮助 .
在这种情况下,
老板 - 是Android应用程序
助理 - 是背景
文件/一杯咖啡 - 是资源
我们通常在需要时调用上下文有关应用程序不同部分的信息,如活动,应用程序等 .
涉及上下文的一些操作(需要助手的操作):
加载公共资源创建动态视图显示Toast消息启动活动等获取上下文的不同方式:
Context
是我们大多数人所说的 Application . 它由Android系统制作,只能执行应用程序的功能 . 在Tomcat中,Context也是我称之为应用程序的东西 .有一个Context包含许多Activity,每个Activity可能有很多Views .
显然,有些人会说它不适合因为这个或那个而且它们可能是正确的,但是说Context是你当前的应用程序将帮助你理解你在方法参数中的含义 .
Source
Android中的Context主题似乎让很多人感到困惑 . 人们只知道在Android中做基本的事情经常需要Context . 人们有时会感到恐慌,因为他们试图执行一些需要上下文的操作,他们不知道如何“获得”正确的上下文 . 我将尝试揭开Android中Context的神秘面纱 . 对该问题的完整处理超出了本文的范围,但我将尝试给出一般概述,以便您了解Context是什么以及如何使用它 . 要了解Context是什么,让我们来看看源代码:
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java
What exactly is Context?
好吧,文档本身提供了一个相当简单的解释:Context类是“关于应用程序环境的全局信息的接口” .
Context类本身被声明为抽象类,其实现由Android OS提供 . 该文档进一步规定Context“...允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动活动,广播和接收意图等” .
你现在可以理解为什么这个名字是Context . 这是因为就是这样 . Context(如果您愿意)为活动,服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而允许访问全局应用程序环境 . 换句话说:上下文提供了组件问题的答案:“我到底与app有什么关系?我如何访问/与应用程序的其余部分进行通信?”如果这一切看起来有点令人困惑,请快速查看Context类公开的方法提供了一些关于其真实性质的进一步线索 .
以下是这些方法的随机抽样:
getAssets()
getResources()
getPackageManager()
getString()
getSharedPrefsFile()
所有这些方法有什么共同之处?它们都允许有权访问Context的任何人能够访问应用程序范围的资源 .
换句话说,上下文将具有对它的引用的组件挂钩到应用程序环境的其余部分 . 例如,资产(例如项目中的'/ assets'文件夹)可在整个应用程序中使用,前提是活动,服务或其他任何知道如何访问这些资源的人 . 同样适用于
getResources()
,它允许执行像getResources().getColor()
这样的事情,它会将你挂钩到colors.xml
资源(永远不要说aapt允许通过java代码访问资源,这是一个单独的问题) .结果是
Context
是能够访问系统资源的东西,它是什么将组件挂钩到“更大的应用程序” . 让我们看一下Context
的子类,这些类提供了抽象Context
类的实现 . 最明显的类是Activity
class .Activity
继承自ContextThemeWrapper
,它继承自ContextWrapper
,它继承自Context
本身 . 这些类对于深入理解事物很有用,但现在知道ContextThemeWrapper
和ContextWrapper
几乎就是它们就足够了它们通过“包装”上下文(实际上下文)并将这些函数委托给该上下文来实现Context
类本身的抽象元素 . 一个例子很有用 - 在ContextWrapper
类中,来自Context
类的抽象方法getAssets
实施如下:mBase
只是构造函数设置为特定上下文的字段 . 因此,上下文被包装,ContextWrapper
将其getAssets方法的实现委托给该上下文 . 让我们回到检查最终继承自Context
的Activity
类,看看这一切是如何工作的 .你可能知道什么是活动,但要审查 - 它基本上是'a single thing the user can do. It takes care of providing a window in which to place the UI that the user interacts with' . 熟悉其他API甚至非开发人员的开发人员可能会将其视为“屏幕” . 这在技术上是不准确的,但对我们的目的而言并不重要 . 那么
Activity
和Context
如何进行交互以及它们的继承关系究竟发生了什么?再次,具体看看是有帮助的例子 . 我们都知道如何发起活动 . 如果你有“上下文”,你正在从中启动Activity,你只需调用
startActivity(intent)
,其中Intent描述了启动Activity的上下文和你想要启动的Activity . 这是熟悉的startActivity(this, SomeOtherActivity.class)
.什么是
this
?this
是您的活动,因为Activity
类继承自Context
. 完整的独家新闻是这样的:当你调用startActivity
时,最终Activity
类执行这样的事情:所以它利用
Instrumentation
类中的execStartActivity
(实际上来自Instrumentation
中的内部类,称为ActivityResult
) .在这一点上,我们开始看到系统内部 .
这是操作系统实际处理一切的地方 . 那么Instrumentation如何准确地启动Activity呢?好吧,上面
execStartActivity
方法中的paramthis
是你的Activity,即Context,execStartActivity
使用了这个上下文 .这是一个30,000概述:Instrumentation类跟踪它正在监视的活动列表,以便完成它的工作 . 此列表用于协调所有活动,并确保在管理活动流程时一切顺利进行 .
有些操作我还没有完全了解哪个坐标线程和进程问题 . 最终,
ActivityResult
使用本机操作 -ActivityManagerNative.getDefault().startActivity()
,它使用您在调用startActivity
时传入的Context
. 您传入的上下文用于在需要时协助“意图解决” . 意图解析是系统可以确定意图目标的过程(如果未提供意图) . (有关详细信息,请查看此处的指南) .为了让Android执行此操作,它需要访问
Context
提供的信息 . 具体来说,系统需要访问ContentResolver
所以它可以“确定意图数据的MIME类型” . 这一点关于startActivity
如何利用上下文有点复杂,我自己并不完全理解内部 . 我的重点是说明如何访问应用程序范围的资源以执行对应用程序至关重要的许多操作 .Context
提供对这些资源的访问 . 一个更简单的例子可能是Views . 我们都知道什么您通过扩展RelativeLayout
或其他View
类来创建自定义视图,您必须提供一个构造函数,该构造函数将Context
作为参数 . 当您实例化自定义视图时,您将传入上下文 . 为什么?因为视图需要能够拥有访问主题,资源和其他View配置细节 . 查看配置实际上是一个很好的例子 . 每个Context都有各种参数(Context
实现中的字段),由操作系统设置精灵用于显示器的尺寸或密度等 . 很容易理解为什么这些信息对于设置视图等非常重要 .One final word: 出于某种原因,Android新手(甚至是不那么新的人)在Android方面似乎完全忘记了面向对象的编程 . 出于某种原因,人们试图将他们的Android开发转变为预先设想的范例或学习行为 .
Android拥有它自己的范例和某种模式,如果放弃你预先设想的概念并简单阅读文档和开发指南,它实际上是非常一致的 . 然而,我的真实观点是,虽然“获得正确的背景”有时候会很棘手,但人们会因为遇到需要上下文并认为自己没有上下文的情况而无理恐慌 . Java是一种面向对象的语言,具有继承设计 .
您只有“拥有”Activity内部的上下文,因为您的活动本身继承自Context . 它没有什么神奇之处(除了操作系统自己设置各种参数和正确“配置”你的上下文)所做的所有事情 . 因此,将内存/性能问题放在一边(例如,当您不需要或以对内存产生负面影响的方式执行上下文时保持对上下文的引用等),Context就像任何其他对象一样,它可以传递给它就像任何POJO(Plain Old Java Object)一样 . 有时您可能需要做一些聪明的事情来检索该上下文,但是除了Object本身之外的任何其他常规Java类都可以以可访问上下文的方式编写;简单地公开一个带有上下文的公共方法,然后根据需要在该类中使用它 . 这不是对Context或Android内部的详尽处理,但我希望它有助于揭示Context的一点点 .
Context
表示不同时间段内的组件(或应用程序) . 如果我在下午1点到2点之间吃了这么多的食物,那么我的那段时间用于访问我在那段时间使用的所有方法(或资源) . 内容是特定时间的组件(应用程序) .Context
应用程序组件不断变化基于组件或应用程序的基础生命周期 . 例如,在Activity
的onCreate()内,getBaseContext()
- 给出由活动构造函数设置(创建)的Activity
的context
.getApplicationContext()
- 在创建应用程序期间提供Context
设置(已创建) .注意:
<application>
包含所有Android组件 .这意味着,当您从任何组件内部调用
getApplicationContext()
时,您正在调用整个应用程序的公共上下文 .系统根据组件的生命周期不断修改
Context
.Context
表示获取环境数据的句柄 .Context
类本身被声明为abstract,其实现由android OS提供 .Context
就像电视中的遥控器和电视 Channels 中的资源,服务等等 .你能用它做什么?
加载资源 .
启动新活动 .
创建视图 .
获取系统服务 .
获取背景的方法:
getApplicationContext()
getContext()
getBaseContext()
老板助理类比
在深入研究Context的技术性之前,让我们先进行一些类比
官方Android开发者网站关于Context的内容
Context is your access point 用于应用程序相关资源
让我们看看一些这样的资源或任务
启动活动 .
获取文件系统上特定于应用程序的缓存目录的绝对路径 .
确定是否允许在系统中运行的特定进程和用户标识的给定权限 .
检查您是否已被授予特定权限 .
等等 .
因此,如果Android应用程序想要启动一个活动,它会直接进入
Context
(访问点),而Context
类会为他提供资源(在这种情况下为Intent) .像任何其他类一样
Context
类也有字段和方法 .您可以在官方文档中了解有关
Context
的更多信息,它涵盖了几乎所有内容,可用方法,字段甚至如何使用方法中的字段 .Context
是有关应用程序环境的全局信息的"interface" . 在实践中,Context
实际上是一个抽象类,其实现由Android系统提供 .它允许访问特定于应用程序的资源和类,以及应用程序级操作的上调,例如启动活动,广播和接收意图等 .
在下图中,您可以看到类的层次结构,其中
Context
是此层次结构的根类 . 特别值得强调的是Activity
是Context
的后代 .此属性声明此布局与 by default 关联的活动 .
只是把它放在那里给新手;
首先要了解Word Context:
在英语 - lib . 它的意思是:
现在对编程世界采取同样的理解:
应用程序/对象的当前状态的上下文 . 它允许新创建的对象了解正在发生的事情 . 通常,您调用它来获取有关程序其他部分的信息(活动,包/应用程序)
您可以通过调用
getApplicationContext()
,getContext(), getBaseContext()
或this
(在活动类中时)来获取上下文 .要在应用程序中使用以下代码获取Context Anywhere:
在Android应用程序中创建新类
AppContext
现在,只要您希望在非活动类中使用应用程序上下文,请调用此方法并获得应用程序上下文 .
希望这个帮助;)
Context
表示当前 .Context
用于对当前屏幕进行操作 . 恩 .1. getApplicationContext()
2. getContext()
Context是类的实例android.content.Context提供与执行应用程序的Android系统的连接 . 例如,您可以通过上下文检查当前设备显示的大小 .
它还可以访问资源项目 . 它是有关应用程序环境的全局信息的接口 .
Context类还提供对Android服务的访问,例如,警报管理器以触发基于时间的事件 .
活动和服务扩展了Context类 . 因此,它们可以直接用于访问Context .
可以把它想象成已经运行应用程序或服务的进程的虚拟机 . 孤立的环境可以访问一堆底层系统信息和某些允许的资源 . 您需要该上下文来获取这些服务 .
Context是对当前对象的引用 . 上下文还允许访问有关应用程序环境的信息 .