Android上的“上下文”是什么?
在Android编程中, Context
类是什么,它用于什么?
我在开发者网站上阅读了它,但我无法清楚地理解它。
简单来说:
顾名思义,它是应用程序/对象当前状态的上下文。 它可以让新创建的对象了解正在发生的事情。 通常,您可以通过它来获取有关程序的另一部分(活动和程序包/应用程序)的信息。
您可以通过调用getApplicationContext()
, getContext()
, getBaseContext()
或this
(在从Context
扩展的类中,如Application,Activity,Service和IntentService类)来获取Context
。
上下文的典型用途:
创建新对象 :创建新视图,适配器,侦听器:
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聘请了一位新开发人员。
建筑师根据新人的技能来讲述新雇用人员的责任,不管他是否会从事数据库或UI等工作。
简单的术语::
这就像android活动访问应用程序的资源。
这与您访问酒店时相似,您需要在适当的时间点享用早餐,午餐和晚餐,对吗?
在逗留期间,您还喜欢其他许多东西。 你如何得到这些东西?
你问房间服务人员为你带来这些东西。
这里的客房服务人员是考虑到你是单身活动和酒店是你的应用程序的情况下,最后的早餐,午餐和晚餐必须是资源。
涉及上下文的事情是:
上下文是Activity,Service,Application ....等的基类
描述这种情况的另一种方式是:考虑上下文,因为电视中的电视和频道的远程资源,服务,使用意图等。 - 这里,远程用作访问,以将所有不同资源访问到前景中。
您可以通过不同的方法获取上下文
getApplicationContext()
getContext()
getBaseContext()
this
(当在活动课上的时候) 例:
TextView TV=new TextView(this);
this
- >指的是当前活动的上下文。
资源
Android上下文的主题似乎让很多人感到困惑。 人们只是知道在Android中做基本的事情经常需要Context。 人们有时会感到恐慌,因为他们试图执行一些需要上下文的操作,而他们不知道如何“获得”正确的上下文。 我将试着去揭示Android中Context的概念。 对这个问题的全面处理超出了本文的范围,但我会尽量给出一个总体概述,以便您了解Context是什么以及如何使用它。 要理解Context是什么,我们来看看源代码:
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java
Context是什么?
那么,文档本身就提供了一个相当直接的解释:Context类是“关于应用程序环境的全局信息的接口”。
Context类本身被声明为抽象类,其实现由Android OS提供。 该文档进一步提供了上下文“...允许访问特定于应用程序的资源和类,以及对诸如启动活动,广播和接收意图等应用程序级操作的上调。”
你现在可以很好地理解,为什么这个名字是上下文。 这是因为它。 如果您愿意,Context为活动,服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而可以访问全局应用程序环境。 换句话说,上下文为组件问题提供了答案:“我通常和应用程序相关的地方,以及如何访问应用程序的其余部分/如何与应用程序的其余部分通信?”如果这一切看起来有点混乱,快速看看Context类暴露的方法提供了一些关于它的真实性质的进一步线索。
以下是这些方法的随机抽样:
getAssets()
getResources()
getPackageManager()
getString()
getSharedPrefsFile()
所有这些方法有什么共同点? 它们都可以让任何访问Context的人都能够访问应用程序范围内的资源。
换句话说,上下文将具有引用的组件挂接到其余的应用程序环境。 例如,资产(您的项目中的“资产”文件夹)可在整个应用程序中使用,前提是活动,服务或任何知道如何访问这些资源的资源。 getResources()
同样适用于getResources().getColor()
,它可以将你colors.xml
到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
类,看看这是如何工作的。
你可能知道一个活动是什么,但要回顾 - 基本上是用户可以做的一件事。 它负责提供一个放置用户交互界面的窗口'。 熟悉其他API甚至非开发人员的开发人员可能会认为它是一个“屏幕”。这在技术上是不准确的,但对我们的目的无关紧要。 那么Activity
和Context
如何相互作用,以及它们的继承关系究竟发生了什么?
再次看看具体的例子是有帮助的。 我们都知道如何开展活动。 如果您有启动活动的“上下文”,则只需调用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
的内部类)。
在这一点上,我们开始窥视系统内部。
这是OS实际处理所有事情的地方。 那么,Instrumentation如何准确启动活动? 那么,帕拉姆this
在execStartActivity
上述方法是你的活动,即上下文和execStartActivity
利用这个上下文。
一个30,000的概述是这样的:Instrumentation类跟踪它监视的活动列表,以便完成它的工作。 此列表用于协调所有活动,并确保在管理活动流程中一切顺利进行。
有一些操作我没有完全看到哪些协调线程和进程问题。 最终, ActivityResult
使用本机操作 - ActivityManagerNative.getDefault().startActivity()
,它使用您在调用startActivity
时传入的Context
。 如果需要,您传入的上下文用于协助“意向解决”。 意向解析是系统可以在没有提供时确定意图的目标的过程。 (查看指南在这里了解更多详情)。
为了让Android做到这一点,它需要访问由Context
提供的信息。 具体而言,系统需要访问ContentResolver
以便“确定意图数据的MIME类型”。关于startActivity
如何使用上下文的整个过程有点复杂,我自己也不完全理解内部结构。要点是说明如何访问应用程序范围内的资源,以便执行许多对应用程序来说至关重要的操作。 Context
是提供对这些资源的访问的一种方式,更简单的例子可能是Views。我们都知道你通过扩展RelativeLayout
或者其他一些View
类来创建一个自定义的视图,你必须提供一个构造函数,它将Context
作为一个参数,当你实例化你自定义的视图时,你会在上下文中传递,为什么?因为View需要能够拥有访问主题,资源和其他视图配置细节,视图配置实际上是一个很好的例子,每个上下文都有不同的参数( Context
在其实现中的字段),这些参数由操作系统自己设置 例如显示器的尺寸或密度。 很容易明白为什么这些信息对于设置视图等很重要。
最后一句话:出于某种原因,Android新手(甚至不是那么新的人)似乎完全忘记了面向对象的编程。 出于某种原因,人们试图将其Android开发转变为预先设想的范式或学习行为。
Android有它自己的范例和一个特定的模式,如果放弃你预先设想的概念并简单阅读文档和开发指南,它实际上是非常一致的。 然而,我的真正意义在于,“获得正确的背景”有时会比较棘手,人们无理地恐慌,因为他们遇到了需要背景并认为他们没有这种背景的情况。 Java再一次是一种具有继承设计的面向对象语言。
你只在活动内部有“上下文”,因为你的活动本身是从上下文继承的。 没有什么魔力(除了操作系统自行设置各种参数以及正确“配置”你的上下文的所有东西)。 因此,抛开内存/性能问题(例如,当你不需要或者以对内存产生负面影响的方式执行时,保持对上下文的引用等),Context是一个与其他任何对象类似的对象,它可以传递就像任何POJO(普通Java对象)一样。 有时候你可能需要做一些聪明的事情来检索这个上下文,但是除了Object自身以外的任何普通的Java类都可以通过访问上下文的方式来编写; 只需公开一个接受上下文的公共方法,然后根据需要在该类中使用它。 这并不是对上下文或Android内部的详尽处理,但我希望它有助于对上下文进行一些解密。
链接地址: http://www.djcxy.com/p/2655.html上一篇: What is 'Context' on Android?
下一篇: "Debug certificate expired" error in Eclipse Android plugins