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