问:
在 Android 编程中,Context 类到底是什么?它的用途是什么?
我在 developer site 上读到了它,但我无法清楚地理解它。
答1:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
简单地说:
顾名思义,它是应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序的另一部分(活动和包/应用程序)的信息。
您可以通过调用 getApplicationContext()、getContext()、getBaseContext() 或 this 来获取上下文(在从 Context 扩展的类中,例如 Application、Activity、Service 和 IntentService 类)。
上下文的典型用法:
创建新对象:创建新视图、适配器、监听器:TextView tv = new TextView(getContext()); ListAdapter 适配器 = 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 在哪里以及如何定义?
很好地解释了为什么我们在动态创建文本视图时需要上下文。但是在动态创建文本视图数组时,我们不必提及任何上下文。为什么呢 ? TextView[] textview = new TextView[10];
@AbhinavArora 在定义数组时,您实际上并没有构建任何文本视图的实例(您基本上只是为它们创建空间进入)。在您将任何值放入该数组时,您要么需要预先创建的 TextView,要么需要一个 Context 来允许您创建它们。
为什么视图需要上下文?例如,如果 TextView 没有上下文,它不能做什么?
一段没有“上下文”的代码可以在每个具有 JVM 的操作系统上运行。但是如果有上下文,它应该在 Android 上运行。如果你想使用 Android 特定的东西(访问设备位置、拍照、运行后台服务等),你需要一个上下文虽然你不需要http 请求。上下文可以被认为是 Java 和 Android 之间的桥梁。
答2:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
上下文的定义
上下文表示环境数据
它提供对数据库等事物的访问
更简单的术语(示例 1)
考虑一下 Person-X 是一家初创软件公司的 CEO。
公司有一位首席架构师,这位首席架构师负责公司的所有工作,包括数据库、用户界面等。
现在 CEO 聘请了一位新的开发人员。
架构师根据新人的技能来告诉新人的职责,他是否将在数据库或UI等方面工作。
更简单的术语(示例 2)
这就像访问应用程序资源的 android 活动一样。
这就像您访问酒店时,您想要在合适的时间享用早餐,午餐和晚餐,对吧?
逗留期间还有很多其他喜欢的东西。你怎么得到这些东西?
您要求客房服务人员为您带来这些东西。
考虑到您是单一活动,酒店是您的应用程序,这里的客房服务人员是上下文,最后早餐、午餐和晚餐必须是资源。
涉及上下文的事情是:
加载资源。启动一项新活动。创建视图。获取系统服务。
Context是Activity、Service、Application等的基类
另一种描述方式:将上下文视为电视的远程,电视中的频道是资源、服务、使用意图等 - - 这里远程充当访问前台所有不同资源的访问权限。
因此,Remote 可以访问资源、服务、使用意图等渠道…
同样…有权访问远程的人自然可以访问所有事物,例如资源、服务、使用意图等
获取上下文的不同方法
获取应用程序上下文()
获取上下文()
getBaseContext()
或者这个(在活动课上时)
例子:
TextView tv = new TextView(this);
关键字 this 指的是当前活动的上下文。
好的,所以从 Activity 派生的类本身就是一个上下文。这就是为什么通过将 this 传递给新创建的视图,我们传递了上下文。
我想知道从这么多不同的地方访问上下文是否是一个好的设计决策?在我看来,应用程序中的一个静态 getContext() 就足够了。
@Trilarion ...这取决于您要如何使用上下文getApplicationContext(),getContext(),getBaseContext() .....请参阅此-> (stackoverflow.com/a/10641257)
只是通过创建文本视图来扩展最后一部分:在某些情况下,可能需要调用 SomeActivityName.this。在实例的线程中,this 指的是线程而不是活动
上下文对象对于 apk 或 Android 操作系统是唯一的吗?一个应用程序可以有两个不同的上下文吗?
答3:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
Source
Android中的上下文这个话题似乎让很多人感到困惑。人们只知道在 Android 中做一些基本的事情经常需要 Context。人们有时会因为试图执行一些需要上下文的操作而感到恐慌,但他们不知道如何“获取”正确的上下文。我将尝试揭开 Android 中 Context 的神秘面纱。对该问题的全面处理超出了本文的范围,但我将尝试给出一个总体概述,以便您了解 Context 是什么以及如何使用它。要了解什么是 Context,我们来看一下源码:
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java
上下文到底是什么?
好吧,文档本身提供了一个相当简单的解释: Context 类是“应用程序环境的全局信息的接口”。
Context 类本身被声明为一个抽象类,其实现由 Android 操作系统提供。该文档进一步提供了 Context “…允许访问特定于应用程序的资源和类,以及对应用程序级操作的调用,例如启动活动、广播和接收意图等”。
你可以很好地理解,现在,为什么叫Context。这是因为它就是这样。如果您愿意,上下文为活动、服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而能够访问全局应用程序环境。换句话说:上下文提供了组件问题的答案:“我与应用程序的关系到底在哪里,我如何访问/与应用程序的其余部分通信?”如果这一切看起来有点令人困惑,那么快速查看 Context 类公开的方法可以提供一些关于其真实性质的进一步线索。
以下是这些方法的随机抽样:
getAssets() getResources() getPackageManager() getString() getSharedPrefsFile()
所有这些方法有什么共同点?它们都使有权访问上下文的任何人都能够访问应用程序范围的资源。
换句话说,上下文将引用它的组件与应用程序环境的其余部分挂钩。例如,资产(想想项目中的“/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,因为 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 配置详细信息。View 配置实际上就是一个很好的例子。每个 Context 都有各种设置的参数(Context 的实现中的字段)由操作系统本身用于诸如显示的尺寸或密度之类的事情是的。很容易看出为什么这些信息对于设置视图等很重要。
最后一句话:出于某种原因,Android 新手(甚至不那么新的人)在谈到 Android 时似乎完全忘记了面向对象编程。出于某种原因,人们试图将他们的 Android 开发转变为先入为主的范式或习得的行为。
Android 有它自己的范式和一定的模式,如果放下你的先入为主的观念,只需阅读文档和开发指南,它实际上是相当一致的。然而,我的真正观点是,虽然“获取正确的上下文”有时可能很棘手,但人们会毫无道理地恐慌,因为他们遇到了需要上下文但认为自己没有上下文的情况。再一次,Java 是一种具有继承设计的面向对象的语言。
您只在 Activity 中“拥有”上下文,因为您的 Activity 本身继承自 Context。它没有魔法(除了操作系统自己设置各种参数和正确“配置”你的上下文的所有东西)。因此,抛开内存/性能问题(例如,当您不需要时持有对上下文的引用或以对内存有负面影响的方式执行它等),上下文是一个像其他任何对象一样的对象,它可以被传递就像任何 POJO(普通旧 Java 对象)一样。有时您可能需要做一些聪明的事情来检索该上下文,但是任何从 Object 本身扩展而来的常规 Java 类都可以以可以访问上下文的方式编写;只需公开一个接受上下文的公共方法,然后根据需要在该类中使用它。这并不是对 Context 或 Android 内部的详尽处理,但我希望它有助于揭开 Context 的神秘面纱。
这是一个很好的答案。比公认的要好得多,后者只说出每个人都凭直觉知道的东西。
这是您正在寻找的长答案!很好解释
嗯,对我来说,这一切听起来就像我们老前辈用来调用全局变量的东西,当面向对象进入场景时,人们对此非常不满 8-)
很容易理解,有一个类 Context 暴露了一堆方法。困难的部分是如果有一个单一的全局应用程序上下文,或者数百个子上下文等,这就是混淆的地方。如果你只是 grep 一个代码库,你会看到数百个不同的 getContext、getBaseContext、getBlaBlaContext。所有这些都只返回一个全局上下文,还是什么?这就是为什么人们“害怕获得正确的上下文”。如果只有一个应用程序上下文,它可以由任何注入框架来处理,而不是这种混乱。
这是一个很长的答案,因为 Android 框架的作者无耻地违反了 Liskov 替换原则。这就是为什么我们需要了解他们真正想要达到的目标的直觉?基本上,上下文可能是应用程序、活动(特别是活动)和其他组件的内部类。但是现在在这个时间点,我们现在“习惯于”思考 android 的实现方式,因此许多人会与我的观点相矛盾。
答4:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
上下文是系统的句柄;它提供诸如解析资源、获取对数据库和首选项的访问权限等服务。 Android 应用程序具有活动。 Context 就像您的应用程序当前运行的环境的句柄。活动对象继承了 Context 对象。
有关详细信息,请查看 Introduction to Android development with Android Studio - Tutorial。
答5:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
Context 是有关应用程序环境的全局信息的“接口”。在实践中,Context 实际上是一个抽象类,其实现由 Android 系统提供。
它允许访问特定于应用程序的资源和类,以及对应用程序级操作的向上调用,例如启动活动、广播和接收意图等。
在下图中,您可以看到类的层次结构,其中 Context 是该层次结构的根类。特别值得强调的是,Activity 是 Context 的后代。
https://i.stack.imgur.com/mn21A.png
这张照片是怎么生成的?
同样的内容,谁偷了谁? ericyang505.github.io/android/Context.html
答6:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
Context 到底是什么?
根据 Android 参考文档,它是一个代表各种环境数据的实体。它提供对本地文件、数据库、与环境关联的类加载器、服务(包括系统级服务)等的访问。在整本书中,以及在您使用 Android 进行的日常编码中,您会看到上下文频繁地传递。
来自“Android in Practice”一书,p。 60.
一些 Android API 需要 Context 作为参数
如果您查看各种 Android API,您会注意到其中许多都将 android.content.Context 对象作为参数。您还会看到 Activity 或 Service 通常用作 Context。这是因为这两个类都从 Context 扩展而来。
答7:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
在 android 中理解 context 的简单示例:
每个老板都有一个助手来照顾,做所有不那么重要和耗时的任务。如果需要文件或喝杯咖啡,助理就会跑来跑去。有些老板几乎不知道办公室里发生了什么,所以他们也向他们的助理询问了这件事。他们自己做一些工作,但对于大多数其他事情,他们需要助手的帮助。
在这种情况下,
Boss – 是安卓应用
助手 - 是一个上下文
文件/一杯咖啡——是资源
当我们需要获取有关应用程序不同部分(如活动、应用程序等)的信息时,我们通常调用上下文。
涉及上下文的一些操作(需要助手的事情):
加载公共资源
创建动态视图
显示 Toast 消息
开展活动等
获取上下文的不同方法:
getContext()
getBaseContext()
getApplicationContext()
this
答8:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
Android Context 是一个 Interface(一般意义上,不是 Java 意义上的;在 Java 中,Context 实际上是一个抽象类!),它允许访问应用程序特定的资源和类以及有关应用程序环境的信息。
如果您的 android 应用程序是网络应用程序,那么您的上下文将类似于 ServletContext(我没有在此进行精确比较)。
您的 Activity 和服务也扩展了 Context,因此它们继承了所有这些方法来访问应用程序运行所在的环境信息。
答9:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
Context 表示获取环境数据的句柄。
Context 类本身被声明为抽象,其实现由 android OS 提供。
上下文就像电视的遥控器,电视中的频道是资源,服务等。
你能用它做什么?
加载资源。
启动一项新活动。
创建视图。
获取系统服务。
获取上下文的方法:
获取应用程序上下文()
获取上下文()
getBaseContext()
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
答10:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
只是把它放在那里给新手;
所以首先了解 Word Context :
在英语库中。它的意思是:
“构成事件、陈述或想法的背景,并据此可以充分理解和评估的环境。” “文字或口语中紧接在单词或段落之前和之后并阐明其含义的部分。”
现在对编程世界采取同样的理解:
应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序另一部分(活动、包/应用程序)的信息
您可以通过调用 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;
}
}
现在,任何时候你想在非活动类中使用应用程序上下文,调用这个方法,你就有了应用程序上下文。
希望这有帮助;)
答11:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
可以将其视为已隔离应用程序或服务运行的进程的 VM。隔离环境可以访问一堆底层系统信息和某些允许的资源。您需要该上下文来获得这些服务。
原文链接:https://www.huntsbot.com/qa/3V0x/what-is-context-on-android?lang=zh_CN&from=csdn
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!