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

在Android编程中, Context类到底是什么?它的用途是什么?

我在开发人员网站上阅读了有关它的内容,但我不清楚。


#1楼

Context到底是什么?

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

摘自《 实践中的Android 》一书。 60

多个Android API需要使用Context作为参数

查看各种Android API时,您会发现其中许多将android.content.Context对象作为参数。 您还将看到,通常将Activity或Service用作Context 。 之所以可行,是因为这两个类都是从Context扩展的。


#2楼

可以将其视为隔离了应用程序或服务正在运行的进程的VM。隔离的环境可以访问大量基础系统信息和某些允许的资源。 您需要那种背景才能获得这些服务。


#3楼

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

上下文还提供对Android服务(例如位置服务)的访问。

活动和服务扩展了Context类。


#4楼

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

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

在下图中,您可以看到类的层次结构,其中Context是该层次结构的根类。 特别值得一提的是, ActivityContext的后代。

活动图


#5楼

资源


Android中的Context主题似乎使许多人感到困惑。 人们只是知道,在Android中执行基本操作经常需要使用Context。 人们有时会感到恐慌,因为他们试图执行一些需要上下文的操作,而他们却不知道如何“获得”正确的上下文。 我将尝试揭开Android中上下文的概念的神秘色彩。 对该问题的完整处理不在本文的讨论范围之内,但是我将尝试给出一个总体概述,以便使您对Context是什么以及如何使用它有所了解。 要了解什么是上下文,让我们看一下源代码:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

上下文到底是什么?

好吧,文档本身提供了一个相当简单的解释:Context类是“有关应用程序环境的全局信息的接口”。

Context类本身被声明为抽象类,其实现由Android OS提供。 该文档还提供了上下文“……允许访问特定于应用程序的资源和类,以及对应用程序级操作(如启动活动,广播和接收意图等)的调用”。

现在,您可以很好地理解为什么名称为Context。 这是因为仅此而已。 上下文为活动,服务或任何其他组件提供了链接或挂钩(如果您愿意),从而将其链接到系统,从而可以访问全局应用程序环境。 换句话说:上下文为以下组件问题提供了答案:“我相对于应用程序到底在哪里,以及我如何与应用程序的其余部分进行访问/通信?”如果这一切似乎有点令人困惑,请快速查看Context类公开的方法可提供有关其真实性质的更多线索。

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

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

所有这些方法有什么共同点? 它们都使任何有权访问上下文的人都能够访问应用程序范围的资源。

换句话说,上下文将对它有引用的组件挂钩到其余的应用程序环境。 例如,只要活动,服务或任何知道如何访问这些资源的资源,资产(例如项目中的“ / assets”文件夹)就可以在整个应用程序中使用。 同样, getResources()也可以执行getResources().getColor() ,该操作会将您吸引到colors.xml资源中(请注意,aapt允许通过java代码访问资源,这是一个单独的问题)。

结果是Context是实现对系统资源的访问的要素,它使组件挂接到“更大的应用程序”。让我们看一下Context的子类,这些类提供了抽象Context类的实现。 Activity类, ActivityContextThemeWrapper继承,而ContextWrapper则从ContextThemeWrapper继承,而ContextWrapper则从Context本身继承。这些类对于深入了解事物很有用,但到目前为止,知道ContextThemeWrapperContextWrapper就足够了他们通过“包装”上下文(实际上下文)并将这些函数委派给该上下文来实现Context类本身的抽象元素,一个示例很有用-在ContextWrapper类中, Context类的抽象方法getAssets实现如下:

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

mBase只是构造函数设置为特定上下文的字段。 因此,包装了上下文,并且ContextWrapper将getAssets方法的实现委派给该上下文。 让我们回到检查Activity类,该类最终从Context继承,以了解其工作原理。

您可能知道什么是活动,但要进行回顾-这基本上是用户可以做的一件事情。 它负责提供一个窗口,在其中放置用户与之交互的UI。 熟悉其他API的开发人员甚至是非开发人员都可能从白话角度将其视为“屏幕”。从技术上讲这是不准确的,但这对我们的目的并不重要。 那么, ActivityContext如何相互作用,它们的继承关系到底是怎么回事?

同样,查看特定示例也很有帮助。 我们都知道如何开展活动。 如果您具有启动活动的“上下文”,则只需调用startActivity(intent) ,其中Intent描述了您从中启动活动的上下文以及要启动的活动。 这是熟悉的startActivity(this, SomeOtherActivity.class)

什么是thisthis是您的Activity,因为Activity类是从Context继承的。 完整的信息如下所示:调用startActivity ,最终Activity类将执行以下操作:

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

因此,它利用了Instrumentation类中的execStartActivity (实际上是从Instrumentation称为ActivityResult的内部类中)。

在这一点上,我们开始窥视系统内部。

这是OS实际处理所有事情的地方。 那么Instrumentation如何准确地启动Activity? 那么,帕拉姆thisexecStartActivity上面的方法是你的活动,即上下文和execStartActivity利用这个上下文。

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

我还没有完全研究某些操作来协调线程和进程问题。 最终, ActivityResult使用本机操作ActivityManagerNative.getDefault().startActivity() ,该操作使用您在调用startActivity时传递的Context 。 如果需要,您传入的上下文将用于帮助“意图解决”。 意图解析是系统可以确定意图目标(如果未提供)的过程。 (有关更多详细信息,请参见此处的指南)。

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

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

如果放开您的先入为主的概念并仅阅读文档和开发指南,Android就有自己的范例和某种模式,实际上是非常一致的。 但是,我的真实观点是,尽管“获取正确的上下文”有时可能很棘手,但人们会陷入无可救药的恐慌之中,因为他们遇到了需要上下文并认为自己没有上下文的情况。 Java再次是具有继承设计的面向对象语言。

您仅“拥有”活动内部的上下文,因为您的活动本身是从上下文继承的。 这没有什么魔力(除了操作系统本身所做的所有工作,它们可以设置各种参数并正确地“配置”您的上下文)。 因此,撇开内存/性能问题(例如,在不需要时保留对上下文的引用或以对内存有负面影响的方式进行操作等),上下文就像其他对象一样,可以被传递就像任何POJO(普通的旧Java对象)一样。 有时您可能需要做一些聪明的事情来检索该上下文,但是任何从Object本身扩展而来的常规Java类都可以用可以访问上下文的方式来编写。 只需公开一个采用上下文的公共方法,然后根据需要在该类中使用它。 这并不是要对Context或Android内部进行详尽的处理,但我希望它有助于对Context进行神秘化。


#6楼

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

因此,首先了解Word Context:

在英语库中。 它的意思是:

“构成事件,陈述或想法的设置的环境,可以据以充分理解和评估。”

“书面或口语中紧接在单词或段落之前和之后的部分,并阐明其含义。”

现在对编程世界有相同的理解:

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

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

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

希望这个帮助;)


#7楼

上下文的定义

  • 上下文代表环境数据
  • 它提供对诸如数据库之类的东西的访问

简单的术语(示例1)

  • 考虑到Person-X是一家新兴软件公司的首席执行官。

  • 公司中有一名首席架构师,该首席设计师负责公司中涉及数据库,UI等的所有工作。

  • 现在,首席执行官雇用了一名新开发人员。

  • 正是架构师根据新员工的技能告诉新员工的责任,即他将从事数据库还是UI等工作。

比较简单的词(示例2)

  • 这就像是通过android活动访问应用程序的资源一样。

  • 这类似于您访问酒店时想要在适当的时间享用早餐,午餐和晚餐,对吗?

  • 在住宿期间,您还喜欢其他许多事情。 你怎么得到这些东西?

  • 您要求客房服务人员为您带来这些东西。

  • 考虑到您是单身活动,而酒店是您的应用程序,因此这里的客房服务人员是您的应用程序,最后早餐,午餐和晚餐必须作为资源。


涉及上下文的事物是:

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

上下文是ActivityServiceApplication等的基类

描述这种情况的另一种方式:将上下文视为电视,电视和电视中的频道的远程资源,服务,使用意图等---这里的远程充当访问所有不同资源的途径。

  • 因此,远程可以访问诸如资源,服务,使用意图等通道。

  • 同样地...有权访问远程控制的人自然可以访问所有事物,例如资源,服务,使用意图等


获取上下文的不同方法

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • this (在活动课程中)

例:

TextView TV=new TextView(this);

this ->指当前活动的上下文。


#8楼

Context就是我们大多数人所说的Application 。 它是由Android系统制作的,只能执行应用程序能够执行的操作。 在Tomcat中,上下文也称为应用程序。

有一个上下文包含许多活动,每个活动可能具有许多视图。

显然,有人会说因为这个或那个原因不合适,并且他们可能是正确的,但是说Context是您当前的应用程序将帮助您了解要在方法参数中添加的内容。


#9楼

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

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

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


#10楼

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

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

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

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


#11楼

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

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

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

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


#12楼

上下文是有关应用程序环境的全局信息的接口。 这是一个抽象类,其实现由Android系统提供。

Context允许访问特定于应用程序的资源和类,以及对应用程序级操作(如launching activities, broadcasting and receiving intents, etc.调用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


#13楼

简单地说:

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

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

#14楼

上下文是系统的句柄; 它提供诸如解析资源,获得对数据库和首选项的访问等服务。 一个Android应用包含活动。 上下文就像是您的应用程序当前正在运行的环境的句柄。活动对象继承了Context对象。

有关更多信息,请参见使用Android Studio进行Android开发简介-教程


#15楼

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

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

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


#16楼

理解android中context简单示例:

每个老板都有一个助手来照顾,以完成所有次要的,耗时的工作。 如果需要一杯咖啡或一杯咖啡,则需要一位助手。 一些老板几乎不知道办公室里发生了什么,所以他们也询问助手。 他们自己做一些工作,但在其他大多数事情上,则需要助手的帮助。

在这种情况下,

老板–是Android应用程序

助手–是上下文

文件/杯咖啡–资源

当我们需要获取有关应用程序不同部分(例如活动,应用程序等)的信息时,通常将其称为上下文。

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

  • 加载公共资源
  • 创建动态视图
  • 显示吐司消息
  • 开展活动等

获取上下文的不同方式:

getContext()

getBaseContext()

getApplicationContext()

this

#17楼

在Java中,我们说关键字指的是应用程序当前对象的状态。
同样,在另一种情况下,我们在Android开发中具有Context

这可以显式或隐式定义,

Context con = this;

getApplicationContext();

getBaseContext();

getContext();

#18楼

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

上下文<ContextWrapper <应用程序

上下文<ContextWrapper <ContextThemeWrapper <活动

上下文<ContextWrapper <ContextThemeWrapper <活动<ListActivity

上下文<ContextWrapper <服务

上下文<ContextWrapper <服务<IntentService

因此,所有这些类以它们自己的方式都是上下文。 如果愿意,可以将ServiceListActivity强制转换Context 。 但是,如果仔细观察,某些类也会继承主题。 在活动或片段中,您希望将主题应用于您的视图,但例如,不必关心Service类。

我在这里解释上下文的不同。


#19楼

上下文是每个应用程序沙箱的android特定api,可提供访问应用程序私有数据,如资源,数据库,私有文件目录,首选项,设置...

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

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


#20楼

简而言之,直到您不再担心,Android Context都是您不会喜欢的烂摊子。

Android Context是:

  • 上帝的对象。

  • 当您开始为Android开发时,您想要遍历所有应用程序的东西,但是当您更接近编程,测试和Android本身时,可以避免这样做。

    • 依赖关系不清楚。

    • 常见的内存泄漏源。

    • 用于测试的PITA。

  • Android系统用于分配权限,资源,首选项,服务,广播,样式,显示对话框和夸大布局的实际上下文。 而且,对于某些单独的事情,您需要不同的Context实例(显然,您无法从应用程序或服务上下文中显示对话框;从应用程序和活动上下文中夸大的布局可能会有所不同)。


#21楼

Context是当前的。 Context用于对当前屏幕进行操作。 例如
1. getApplicationContext()
2. getContext()

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

#22楼

  • Context表示获取环境数据的句柄。
  • Context类本身被声明为抽象,其实现由android OS提供。
  • Context就像是远程电视,而电视中的频道就是资源,服务等。 在此处输入图片说明

你能用它做什么?

  • 正在加载资源。
  • 启动新活动。
  • 创建视图。
  • 获取系统服务。

获取上下文的方法:

  • getApplicationContext()
  • getContext()
  • getBaseContext() 在此处输入图片说明 在此处输入图片说明

#23楼

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


#24楼

老板助理类比

在深入探讨Context的技术性之前,让我们先做个小比喻

每个老板都有一个助手或某人(差事男孩)为他做些次要的事情,并且耗时更多。 例如,如果他们需要文件或咖啡,则助手将在运行中。 老板不知道后台发生了什么,但是文件或任务将被交付

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

什么官方Android开发者网站说,大约上下文

上下文是您与应用程序相关的资源的访问点

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

  • 启动活动。

  • 获取文件系统上应用程序特定的缓存目录的绝对路径。

  • 确定给定的权限是否允许系统中运行的特定进程和用户ID。

  • 检查您是否被授予特定权限。

等等。
因此,如果Android应用程序要启动活动,则直接转到Context (访问点),并且Context类将资源退还给他(在这种情况下为Intent)。

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


#25楼

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

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

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

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

    <service>  .. </service>

    <receiver> .. </receiver>

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

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

系统会根据组件的生命周期不断修改Context


#26楼

上下文意味着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。


#27楼

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


#28楼

上下文基本上是用于资源访问并获取应用程序(对于应用程序上下文)或活动(对于活动上下文)或任何其他...的环境详细信息。

为了避免内存泄露,你应该使用应用程序上下文的需要上下文对象的每个部件....更多点击这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值