什么是Android上的“上下文”?

问题描述 投票:1766回答:28

在Android编程中,究竟什么是Context类以及它用于什么?

我在developer site上读到了它,但我无法理解它。

android android-context
28个回答
1385
投票

简单地说:

顾名思义,它是应用程序/对象当前状态的上下文。它允许新创建的对象了解正在发生的事情。通常,您可以调用它来获取有关程序其他部分(活动和包/应用程序)的信息。

您可以通过调用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, ...);

16
投票

只是把它放在那里给新手;

首先要了解Word上下文:

在英语 - lib。它的意思是:

“形成事件,陈述或想法背景的环境,以及可以充分理解和评估的环境。”

“在一个词或段落之前和之后立即书写或说出的部分内容,并澄清其含义。”

现在对编程世界采取同样的理解:

应用程序/对象的当前状态的上下文。它允许新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序其他部分的信息(活动,包/应用程序)

您可以通过调用getApplicationContext()getContext(), getBaseContext()this(在活动类中时)来获取上下文。

要在应用程序中使用以下代码获取Context Anywhere:

在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;
    }
}

现在,只要您想在非活动类中使用应用程序上下文,请调用此方法并获得应用程序上下文。

希望这个帮助;)


15
投票

将其视为已经运行应用程序或服务的进程的虚拟机。孤立的环境可以访问大量底层系统信息和某些允许的资源。您需要该上下文来获取这些服务。


15
投票

Context是对当前对象的引用。上下文还允许访问有关应用程序环境的信息。


12
投票

android.content.Context提供与Android系统的连接和项目的资源。它是有关应用程序环境的全局信息的接口。

Context还提供对Android服务的访问,例如位置服务。

活动和服务扩展了Context课程。


8
投票

Context是类的实例android.content.Context提供与执行应用程序的Android系统的连接。例如,您可以通过上下文检查当前设备显示的大小。

它还可以访问项目的资源。它是有关应用程序环境的全局信息的接口。

Context类还提供对Android服务的访问,例如,警报管理器以触发基于时间的事件。

活动和服务扩展了Context类。因此,它们可以直接用于访问Context。


8
投票

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


7
投票

Context主要用于资源访问和获取应用程序(用于应用程序上下文)或活动(用于活动上下文)或任何其他的环境详细信息...

为了避免内存泄漏,您应该为需要上下文对象的每个组件使用应用程序上下文....更多单击here


7
投票

上下文是应用程序/对象的当前状态的上下文。它是表示各种环境数据的实体。 Context帮助当前活动与外部android环境交互,如本地文件,数据库,与环境相关的类加载器,服务(包括系统级服务)等。

Context是系统的句柄。它提供诸如解析资源,获取对数据库和首选项的访问等服务。 Android应用程序有活动。它就像是当前运行应用程序的环境的句柄。活动对象继承Context对象。

可以通过不同的调用方法获取上下文1. getApplicationContext(),2。getContext(),3。getBaseContext()4。或者此(在活动类中时)。


5
投票

一个Context是我们大多数人称之为应用程序。它由Android系统制作,只能执行应用程序的功能。在Tomcat中,Context也是我称之为应用程序的东西。

有一个Context包含许多Activity,每个Activity可能有很多Views。

显然,有些人会说它不适合因为这个或那个并且它们可能是正确的,但是说Context是你当前的应用程序将帮助你理解你在方法参数中的含义。


5
投票

Boss Assistant Analogy

在深入探讨Context的技术性之前,让我们先进行一些类比

每个Boss都有一个助手或一个(差事男孩),他为他做了不那么重要和耗时的事情。例如,如果他们需要文件或咖啡,那么助理将会运行。老板不会知道后台发生了什么,但文件或任务将被交付

所以在这里 老板 - Android应用程序 助理 - 上下文 文件或杯咖啡 - 资源

什么是官方的Android开发者网站关于Context的说法

Context是应用程序相关资源的访问点

让我们看看一些这样的资源或任务

  • 发起一项活动。
  • 获取文件系统上特定于应用程序的缓存目录的绝对路径。
  • 确定是否允许在系统中运行的特定进程和用户标识的给定权限。
  • 检查您是否已获得特定权限。

等等。 因此,如果一个Android应用程序想要启动一个活动,它会直接进入Context(Access Point),而Context类会让他返回资源(在本例中为Intent)。

像任何其他类一样,Context类也有字段和方法。 您可以在官方文档中了解有关Context的更多信息,它涵盖了几乎所有内容,可用方法,字段甚至如何使用方法中的字段。


465
投票

Definition of Context

  • 上下文表示环境数据
  • 它提供对数据库等内容的访问

Simpler terms (example 1)

  • 考虑到Person-X是一家初创软件公司的首席执行官。
  • 公司中有一位首席架构师,这位首席架构师负责公司的所有工作,包括数据库,UI等。
  • 现在,CEO聘请了一位新的开发人员。
  • 建筑师根据新人的技能告诉新雇员的责任,他是否会在数据库或用户界面等方面工作。

Simpler terms (example 2)

  • 这就像访问Android活动到应用程序的资源。
  • 这与你去酒店时的情况类似,你想在适当的时间吃早餐,午餐和晚餐,对吧?
  • 入住期间,您还有许多其他的事情。你怎么得到这些东西?
  • 您要求客房服务人员为您带来这些东西。
  • 在这里,客房服务人员是考虑到您是单一活动和酒店作为您的应用程序的背景,最后早餐,午餐和晚餐必须是资源。

涉及背景的事情是:

  1. 加载资源。
  2. 发起一项新活动。
  3. 创建视图。
  4. 获得系统服务。

Context is the base class for Activity, Service, Application, etc

另一种描述这种情况的方法:考虑上下文作为电视中的电视和频道的遥控器是资源,服务,使用意图等 - - 这里遥控器作为访问以访问所有不同资源到前台的访问。

  • 因此,Remote可以访问资源,服务,使用意图等渠道....
  • 同样......有权访问远程的人自然可以访问所有的东西,如资源,服务,使用意图等

您可以通过不同的方法获取上下文

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • this(在活动课上)

例:

TextView TV=new TextView(this);

this - >指的是当前活动的背景。


4
投票

android.content.Context类的实例提供与执行应用程序的Android系统的连接。例如,您可以通过上下文检查当前设备显示的大小。

它还可以访问项目的资源。它是有关应用程序环境的全局信息的接口。

Context类还提供对Android服务的访问,例如,警报管理器以触发基于时间的事件。

活动和服务扩展了Context类。因此,它们可以直接用于访问Context。


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更快。


2
投票

如果您想将Context与Android中其他熟悉的类连接,请记住以下结构:

Context <ContextWrapper <应用程序

Context <ContextWrapper <ContextThemeWrapper <Activity

Context <ContextWrapper <ContextThemeWrapper <Activity <ListActivity

Context <ContextWrapper <Service

Context <ContextWrapper <Service <IntentService

所以,所有这些类都以自己的方式出现。如果您愿意,可以将Service和ListActivity强制转换为Context。但是如果仔细观察,一些类也会继承主题。在活动或片段中,您希望将主题应用于您的视图,但不要关心它的服务类。

我在背景中解释here的区别。


2
投票

简单来说,Androids Context是一个混乱,你不会喜欢,直到你不再担心。

Android Contexts是:

  • 神的对象。
  • 当你开始为Android开发时,你希望传递所有应用程序,但是当你更接近编程,测试和Android本身时,它会避免这样做。 依赖性不明确。 常见的内存泄漏源。 PITA进行测试。
  • Android系统用于调度权限,资源,首选项,服务,广播,样式,显示对话框和膨胀布局的实际上下文。并且您需要针对某些单独的事物使用不同的Context实例(显然,您无法显示来自应用程序或服务上下文的对话框;从应用程序和活动上下文中填充的布局可能不同)。

2
投票

Context是每个app-s Sandbox的android特定api,提供访问应用私有数据,如资源,数据库,私有档案,偏好,设置......

对于一个应用程序的所有活动/服务/广播用户,大多数私有数据都是相同的。

由于Application,Activity,Service实现了Context接口,因此可以在api调用需要Context参数的地方使用它们


1
投票

Context表示不同时间段的组件(或应用程序)。如果我在下午1点到2点之间吃了这么多的食物,那么我的那段时间用于访问我在那段时间使用的所有方法(或资源)。内容是特定时间的组件(应用程序)。应用程序组件的Context会根据组件或应用程序的基础生命周期不断变化。例如,在Activity的onCreate()中,

getBaseContext() - 给出由活动构造函数设置(创建)的contextActivitygetApplicationContext() - 在创建应用程序期间提供Context设置(创建)。

注意:<application>拥有所有Android组件。

<application>
    <activity> .. </activity> 

    <service>  .. </service>

    <receiver> .. </receiver>

    <provider> .. </provider>
</application> 

这意味着,当您从任何组件内部调用getApplicationContext()时,您正在调用整个应用程序的公共上下文。

Context一直根据组件的生命周期进行系统修改。


-1
投票

Context意味着当前。 Context用于对当前屏幕进行操作。恩。 1. getApplicationContext() 2. getContext()

Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();

-6
投票

此属性声明默认情况下此布局与哪个活动相关联。


-6
投票

在Java中,我们说这个关键字指的是应用程序当前对象的状态。 同样,在另一个替代方案中,我们在Android开发中有Context

这可以明确地或隐含地定义,

Context con = this;

getApplicationContext();

getBaseContext();

getContext();

308
投票

Source


Android中的Context主题似乎让很多人感到困惑。人们只知道在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。这是因为就是这样。 Context(如果您愿意)为活动,服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而允许访问全局应用程序环境。换句话说:上下文提供了组件问题的答案:“我到底与app有什么关系?我如何访问/与应用程序的其余部分进行通信?”如果这一切看起来有点令人困惑,请快速查看Context类公开的方法提供了一些关于其真实性质的进一步线索。

以下是这些方法的随机抽样:

  1. getAssets()
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

所有这些方法有什么共同之处?它们都允许有权访问Context的任何人能够访问应用程序范围的资源。

换句话说,上下文将具有对它的引用的组件挂钩到应用程序环境的其余部分。例如,资产(例如,项目中的'/ assets'文件夹)可在整个应用程序中使用,前提是活动,服务或其他任何知道如何访问这些资源。同样适用于getResources(),它允许执行像getResources().getColor()这样的事情,它会将你挂钩到colors.xml资源(永远不要说aapt允许通过java代码访问资源,这是一个单独的问题)。

结果是Context能够访问系统资源,并将其组件挂钩到“更大的应用程序”。让我们看一下Context的子类,这些类提供了抽象Context类的实现。最明显的类是Activity类.Activity继承自ContextThemeWrapper,继承自ContextWrapper本身。继承自Context本身。这些类有助于在更深层次上理解事物,但现在知道ContextThemeWrapperContextWrapper几乎就是他们的东西就足够了它们通过“包装”上下文(实际上下文)并将这些函数委托给该上下文来实现Context类本身的抽象元素。一个例子很有用 - 在ContextWrapper类中,来自getAssets类的抽象方法Context实施如下:

@Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

mBase只是构造函数为特定上下文设置的字段。因此,上下文被包装,并且ContextWrapper将其getAssets方法的实现委托给该上下文。让我们回过头来看看最终继承自ActivityContext类,看看这一切是如何运作的。

您可能知道什么是活动,但要审查 - 它基本上是“用户可以做的一件事”。它负责提供一个窗口,用于放置用户与之交互的UI。熟悉其他API甚至非开发人员的开发人员可能会将其视为“屏幕”。这在技术上是不准确的,但对我们的目的而言并不重要。那么ActivityContext如何相互作用以及它们的继承关系究竟发生了什么?

同样,查看具体示例也很有帮助。我们都知道如何发起活动。如果你有“上下文”,你正在从中开始活动,你只需要调用startActivity(intent),其中Intent描述了你开始一个Activity的上下文和你想要开始的Activity。这是熟悉的startActivity(this, SomeOtherActivity.class)

什么是thisthis是你的活动,因为Activity类继承自Context。完整的独家新闻是这样的:当你调用startActivity时,最终Activity类执行这样的事情:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);

所以它利用了来自execStartActivity类的Instrumentation(实际上来自Instrumentation的内部类,称为ActivityResult)。

在这一点上,我们开始看到系统内部。

这是操作系统实际处理一切的地方。那么Instrumentation如何准确地启动Activity呢?好吧,上面的this方法中的参数execStartActivity是你的Activity,即Context,而execStartActivity使用这个上下文。

这是一个30,000概述:Instrumentation类跟踪它正在监视的活动列表,以便完成它的工作。此列表用于协调所有活动,并确保在管理活动流程时一切顺利进行。

有些操作我还没有完全了解哪个坐标线程和进程问题。最终,ActivityResult使用本机操作 - ActivityManagerNative.getDefault().startActivity()使用你在调用Context时传入的startActivity。您传入的上下文用于协助“意图解决”(如果需要)。意图解析是系统在未提供意图目标时确定目标的过程。 (有关详细信息,请查看此处的指南)。

为了让Android执行此操作,它需要访问Context提供的信息。具体来说,系统需要访问ContentResolver,因此它可以“确定意图数据的MIME类型”。这一点关于startActivity如何利用上下文有点复杂,我自己并不完全理解内部。我的重点是说明如何访问应用程序范围的资源以执行对应用程序至关重要的许多操作.Context提供对这些资源的访问。一个更简单的例子可能是Views。我们都知道什么你可以通过扩展RelativeLayout或其他一些View类来创建一个自定义视图,你必须提供一个构造函数,它将Context作为一个参数。当你实例化自定义视图时,你会传入上下文。为什么?因为视图需要能够拥有访问主题,资源和其他View配置细节。查看配置实际上是一个很好的例子。每个Context都有各种参数(Context实现中的字段),由OS本身设置诸如显示器的尺寸或密度之类的东西。很容易理解为什么这些信息对于设置视图等非常重要。

最后一句话:出于某种原因,Android的新手(甚至是不那么新的人)似乎完全忘记了Android的面向对象编程。出于某种原因,人们试图将他们的Android开发转变为预先设想的范例或学习行为。

Android拥有它自己的范例和某种模式,如果放弃你预先设想的概念并简单阅读文档和开发指南,它实际上是非常一致的。然而,我的真实观点是,虽然“获得正确的背景”有时候会很棘手,但人们会因为遇到需要上下文并认为自己没有上下文的情况而无理恐慌。 Java是一种面向对象的语言,具有继承设计。

您只有“拥有”Activity内部的上下文,因为您的活动本身继承自Context。它没有什么神奇之处(除了操作系统自己设置各种参数和正确“配置”你的上下文)所做的所有事情。因此,将内存/性能问题放在一边(例如,当您不需要或以对内存产生负面影响的方式执行上下文时保持对上下文的引用等),Context就像任何其他对象一样,它可以传递给它就像任何POJO(Plain Old Java Object)一样。有时您可能需要做一些聪明的事情来检索该上下文,但是除了Object本身之外的任何其他常规Java类都可以以可访问上下文的方式编写;简单地公开一个带有上下文的公共方法,然后根据需要在该类中使用它。这不是对Context或Android内部的详尽处理,但我希望它有助于揭开Context的神秘感。


111
投票

Context是系统的句柄;它提供诸如解析资源,获取对数据库和首选项的访问等服务。 Android应用有活动。 Context类似于当前运行应用程序的环境的句柄。活动对象继承Context对象。

有关更多信息,请查看Introduction to Android development with Android Studio - Tutorial


79
投票

Context是关于应用程序环境的全局信息的“接口”。在实践中,Context实际上是一个抽象类,其实现由Android系统提供。

它允许访问特定于应用程序的资源和类,以及应用程序级操作的上调,例如启动活动,广播和接收意图等。

在下图中,您可以看到类的层次结构,其中Context是此层次结构的根类。特别值得强调的是,ActivityContext的后裔。


65
投票

什么是Context究竟是什么?

根据Android参考文档,它是一个表示各种环境数据的实体。它提供对本地文件,数据库,与环境相关的类加载器,服务(包括系统级服务)等的访问。在本书以及使用Android的日常编码中,您将看到Context经常传递。

来自“Android in Practice”一书,p。 60。

一些Android API需要Context作为参数

如果您查看各种Android API,您会发现其中许多都将android.content.Context对象作为参数。您还会看到活动或服务通常用作Context。这是有效的,因为这两个类都来自Context


44
投票

Android Context是一个Interface(一般意义上,不是Java意义上的;在Java中,Context实际上是一个抽象类!),它允许访问特定于应用程序的资源以及有关应用程序环境的类和信息。

如果您的Android应用程序是一个Web应用程序,您的上下文将类似于ServletContext(我不是在这里进行精确比较)。

您的活动和服务还扩展了Context,因此它们继承了所有这些方法来访问运行应用程序的环境信息。


40
投票

简单的例子来理解android中的context

每个老板都有一个助手照顾,做所有不那么重要和耗时的任务。如果需要一个文件或一杯咖啡,一个助手正在运行。有些老板几乎不知道办公室里发生了什么,所以他们也会问他们的助手。他们自己做一些工作,但对于大多数其他事情,他们需要助手的帮助。

在这种情况下,

老板 - 是Android应用程序

助理 - 是背景

文件/一杯咖啡 - 是资源

当我们需要获取有关应用程序的不同部分的信息时,我们通常会调用上下文,如活动,应用程

涉及上下文的一些操作(需要助手的事情):

  • 加载公共资源
  • 创建动态视图
  • 显示Toast消息
  • 发起活动等

获取背景的不同方式:

getContext()

getBaseContext()

getApplicationContext()

this

26
投票
  • Context代表获取环境数据的句柄。
  • Context类本身被声明为抽象,其实现由android OS提供。
  • Context就像电视和频道中遥远的电视是资源,服务等.enter image description here

你能用它做什么?

  • 加载资源。
  • 发起一项新活动。
  • 创建视图。
  • 获得系统服务。

获取背景的方法:

  • getApplicationContext()
  • getContext()
  • getBaseContext()enter image description hereenter image description here
© www.soinside.com 2019 - 2024. All rights reserved.