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

What is 'Context' on Android?

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

我在开发者网站上读到过,但是我不能清楚地理解它。


简单来说:

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

您可以通过调用getApplicationContext()getContext()getBaseContext()this来获取上下文(在从Context扩展的类中,例如应用程序类、活动类、服务类和intentservice类)。

上下文的典型用法:

  • 创建新对象:创建新视图、适配器、侦听器:

    1
    2
    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
  • 访问标准公共资源:布局充气服务、共享参考等服务:

    1
    2
    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
  • 隐式访问组件:关于内容提供者、广播、意图

    1
    getApplicationContext().getContentResolver().query(uri, ...);


上下文定义

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

简单术语(例1)

  • 假设Person-X是一家初创软件公司的CEO。

  • 公司里有一位首席架构师,这位首席架构师公司所有涉及数据库、用户界面等工作吗?等。

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

  • 是建筑师告诉我们新雇的人的责任根据新员工的技能,他是否会处理数据库或用户界面等。

简单术语(例2)

  • 这就像Android活动对应用程序资源的访问。

  • 这类似于当你参观酒店时,你想要早餐、午餐和;在合适的时间吃饭,对吗?

  • 在逗留期间还有许多其他你喜欢的事情。你怎么拿到这些东西了吗?

  • 你让客房服务人员把这些东西带给你。

  • 这里是客房服务人员的背景,考虑到您是单一活动和酒店将成为您的应用程序,最后是早餐、午餐和;晚餐必须是资源。

涉及上下文的内容包括:

  • 加载资源。
  • 启动新活动。
  • 创建视图。
  • 获取系统服务。
  • Context是活动、服务、应用程序等的基类

    描述这一点的另一种方法是:将上下文视为电视频道在电视中的遥控器,包括资源、服务、使用意图等——这里,遥控器用作访问前景中所有不同资源的访问。

    • 因此,Remote可以访问资源、服务、使用意图等渠道……

    • 同样地…任何有权访问远程的人都可以自然地访问所有的东西,如资源、服务、使用意图等。

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

    • getApplicationContext()
    • getContext()
    • getBaseContext()
    • this(在活动类中时)

    例子:

    1
    TextView TV=new TextView(this);

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


    来源好的。

    许多人似乎对Android中的上下文主题感到困惑。人们只知道,在Android中做一些基本的事情通常需要上下文。人们有时会惊慌失措,因为他们试图执行一些需要上下文的操作,却不知道如何"获取"正确的上下文。我将试图解开安卓环境的概念。对这个问题的全面处理超出了本文的范围,但我将尝试给出一个总体的概述,以便您了解上下文是什么以及如何使用它。为了理解上下文,我们来看一下源代码:好的。

    https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/context.java好的。

    上下文究竟是什么?好的。

    好吧,文档本身提供了一个相当直接的解释:上下文类是一个"关于应用程序环境的全局信息的接口"。好的。

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

    你现在可以很好地理解为什么这个名字是上下文。因为就是那样。如果愿意,上下文为活动、服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而允许访问全局应用程序环境。换言之:上下文提供了组件问题的答案:"我与应用程序的关系到底在哪里?我如何访问/与应用程序的其余部分通信?""如果这一切看起来有点混乱,那么快速查看Context类所公开的方法,可以提供一些关于其真实性质的进一步线索。好的。

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

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

    换句话说,上下文将引用它的组件挂接到应用程序环境的其余部分。例如,如果某个活动、服务或任何知道如何访问这些资源的方法,则可以在应用程序中使用资产(例如,您项目中的/assets'文件夹)。EDCOX1的1个方面也一样,它允许做像EDCOX1,6个这样的事情,这将把你带入EDOCX1 7资源中(不用介意AAPT允许通过Java代码访问资源,这是一个单独的问题)。好的。

    结果是,Context支持访问系统资源,并将组件连接到"更大的应用程序"中。让我们看看Context的子类,这些类提供抽象Context类的实现。最明显的类是Activity类。Activity继承ContextThemeWrapper继承ContextWrapper继承Context本身。这些类对于更深入地理解事物是很有用的,但是现在已经足够知道ContextThemeWrapperContextWrapper的发音差不多了。它们通过"包装"上下文(实际上下文)并将这些函数委托给该上下文来实现Context类本身的抽象元素。一个例子很有用——在ContextWrapper类中,Context类的抽象方法getAssets实现如下:好的。

    1
    2
    3
    4
    @Override
        public AssetManager getAssets() {
            return mBase.getAssets();
        }

    mBase只是一个由构造函数设置到特定上下文的字段。因此,一个上下文被包装,ContextWrapper将其getassets方法的实现委托给该上下文。让我们回到检查最终从Context继承的Activity类,看看这一切是如何工作的。好的。

    你可能知道一个活动是什么,但是回顾一下——它基本上是‘用户可以做的一件事’。它负责提供一个窗口,用于放置用户与之交互的UI。熟悉其他API的开发人员,甚至是非开发人员,可能会把它当作一个"屏幕",这在技术上是不准确的,但对于我们的目的来说并不重要。那么,ActivityContext是如何相互作用的?它们的继承关系到底是怎么回事?好的。

    同样,看看具体的例子也很有帮助。我们都知道如何开展活动。如果你有开始活动的"背景",你只需称之为startActivity(intent),其中意图描述了你开始活动的背景以及你想开始的活动。这就是我们熟悉的startActivity(this, SomeOtherActivity.class)。好的。

    那么什么是thisthis是您的活动,因为Activity类继承了Context类。全文如下:当您调用startActivity时,最终Activity类执行如下操作:好的。

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

    因此,它使用了来自Instrumentation类的execStartActivity(实际上来自Instrumentation中称为ActivityResult的内部类)。好的。

    在这一点上,我们开始了解系统内部。好的。

    这就是操作系统处理所有事情的地方。那么,仪器如何准确地启动活动呢?好吧,上面execStartActivity方法中的参数this是你的活动,即上下文,execStartActivity利用了这个上下文。好的。

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

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

    为了让Android做到这一点,它需要访问Context提供的信息。具体来说,系统需要访问ContentResolver,以便"确定意图数据的mime类型"。关于startActivity如何使用上下文的这一点有点复杂,我自己也不完全理解其内部结构。我的主要观点只是为了说明如何访问应用程序范围内的资源,以便执行对应用程序至关重要的许多操作。Context提供了访问这些资源的途径。一个简单的例子是视图。我们都知道您通过扩展RelativeLayout或其他View类来创建自定义视图的内容,您必须提供一个以Context为参数的构造函数。当您实例化自定义视图时,您将在上下文中传递。为什么?因为视图需要能够访问主题、资源和其他视图配置详细信息。视图配置实际上是一个很好的例子。每个上下文都有不同的参数(Context的实现中的字段),这些参数由操作系统本身为显示的尺寸或密度等设置。很容易理解为什么这些信息对于设置视图等很重要。好的。

    最后一句话:出于某种原因,刚接触到Android的人(甚至还不是很新的人)在谈到Android时似乎完全忘记了面向对象编程。出于某种原因,人们试图将他们的Android开发转向预先设想的模式或学习的行为。好的。

    Android有它自己的模式和特定的模式,如果放弃你预先设想的概念,只需阅读文档和开发指南,这实际上是相当一致的。然而,我的真正观点是,虽然"获得正确的背景"有时很棘手,但人们不合理地感到恐慌,因为他们遇到了一种需要背景的情况,认为自己没有背景。Java又是一种具有继承性设计的面向对象语言。好的。

    您只"拥有"活动内部的上下文,因为您的活动本身继承自上下文。它没有魔力(除了操作系统本身设置各种参数和正确"配置"上下文所做的所有事情)。因此,把内存/性能问题放在一边(例如,当你不需要或者在对内存有负面影响的情况下引用上下文时),上下文就像任何其他对象一样,它可以像任何波霍(普通的Java对象)一样传递。有时,您可能需要做一些聪明的事情来检索上下文,但是任何从对象本身之外扩展的规则Java类都可以以访问上下文的方式编写;只需公开一个上下文的公共方法,然后根据需要在该类中使用它。这并不是对上下文或Android内部进行详尽的处理,但我希望它有助于解除上下文的神秘化。好的。好啊。


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

    有关更多信息,请参阅Android Studio开发简介-教程。


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

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

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

    Activity diagram


    究竟是什么?

    Per the Android reference documentation, it's an entity that represents various environment data. It provides access to local files, databases, class loaders associated to the environment, services (including system-level services), and more. Throughout this book, and in your day-to-day coding with Android, you'll see the Context passed around frequently.

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

    一些Android API需要一个Context作为参数

    如果您浏览各种Android API,您将注意,他们中的许多人把android.content.Context对象作为参数。您还将看到一个活动或服务通常用作Context。这是因为这两个类都从Context扩展而来。


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

    如果你的android应用是一个web应用,你的上下文将类似于ServletContext(我在这里没有做一个确切的比较)。

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


    了解Android中Context的简单示例:

    每个老板都有一个助理来照顾,做所有不那么重要和费时的工作。如果需要一个文件或一杯咖啡,助理就在跑着。有些老板几乎不知道办公室里发生了什么事,所以他们也向助手询问这件事。他们自己做一些工作,但大多数其他事情他们需要助手的帮助。

    在这种情况下,

    boss–是Android应用程序

    助理——IS背景

    文件/咖啡杯-是资源

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

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

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

    获取上下文的不同方式:

    1
    2
    3
    4
    5
    6
    7
    getContext()

    getBaseContext()

    getApplicationContext()

    this

    • Context表示获取环境数据的句柄。
    • Context类本身声明为抽象类,其实现由android操作系统提供。
    • Context就像电视的遥控器,电视中的频道是资源、服务等。enter image description here

    你能用它做什么?

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

    获取上下文的方法:

    • getApplicationContext()
    • getContext()
    • getBaseContext()enter image description hereenter image description here


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

    所以首先要了解单词的上下文:

    英语库。它的意思是:

    "The circumstances that form the setting for an event, statement, or
    idea, and in terms of which it can be fully understood and assessed."

    "The parts of something written or spoken that immediately precede and
    follow a word or passage and clarify its meaning."

    现在让我们对编程界有同样的理解:

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

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

    要在应用程序中的任何位置获取上下文,请使用以下代码:

    在Android应用程序中创建新的类AppContext

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class AppContext extends Application {

        private static Context context;

        public void onCreate(){
            super.onCreate();
            AppContext.context = getApplicationContext();
        }

        public static Context getAppContext() {
            return AppContext.context;
        }
    }

    现在,只要您想在非活动类中使用应用程序上下文,就可以调用这个方法,这样就有了应用程序上下文。

    希望能帮上忙;)


    把它想象成一个虚拟机,它孤立了应用程序或服务运行的过程。Siloed环境可以访问一系列底层系统信息和某些允许的资源。您需要这个上下文来获取这些服务。


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


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

    上下文还提供对Android服务的访问,例如定位服务。

    活动和服务扩展了Context类。


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

    Context允许访问特定于应用程序的资源和类,以及调用应用程序级操作,如launching activities, broadcasting and receiving intents, etc.

    下面是例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     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类还提供对Android服务的访问,例如警报管理器,以触发基于时间的事件。

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


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

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

    不同的调用方法,通过这些方法可以获取上下文1。getApplicationContext(),2。获取上下文()三。GetBaseContext()。4。或者这个(在活动类中)。


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

    为了避免内存泄漏,您应该为每个需要上下文对象的组件使用应用程序上下文….有关更多信息,请单击此处


    我们大多数人都称之为应用程序。它是由安卓系统制造的,只能做应用程序所能做的。在Tomcat中,上下文也是我所称的应用程序。

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

    显然,有些人会说它不适合,因为这或那,他们可能是正确的,但说上下文是您当前的应用程序将帮助您理解您在方法参数中放入了什么。


    老板助理类比

    让我们在深入了解上下文的技术性之前做一个小的类比。

    Every Boss has an assistant or someone( errand boy) who does less
    important and more time-consuming things for him. For example, if they
    need a file or coffee then an assistant will be on run. Boss will not
    know what is going on in the background but the file or the task will
    be delivered

    So Here
    Boss - Android Application
    Assistant - Context
    File or cup of coffee - Resource

    Android官方开发者网站对环境的评价

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

    让我们看看这些资源或任务

    • 启动活动。

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

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

    • 正在检查是否已授予您特定的权限。

    等等。因此,如果一个Android应用程序想要启动一个活动,它会直接进入Context(访问点),Context类会将资源返回给他(本例中的意图)。

    和其他类一样,Context类也有字段和方法。您可以在官方文档中了解更多关于Context的内容,它几乎涵盖了所有内容、可用方法、字段,甚至包括如何将字段与方法一起使用。


    上下文意味着android可以知道我应该在哪个活动中进行或采取行动。

    1-toast.maketext(context,"输入所有详细信息",toast.length_short).show();它用在这个里面。context context=activityname.this;

    2-StartActivity(new intent(context,loginactivity.class));

    在这种情况下,意味着要从哪个活动转到其他活动。context或activityname。这比getContext和getApplicationContext更快。


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

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

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

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


    如果您想将上下文与Android中其他熟悉的类连接起来,请记住此结构:

    Context < ContextWrapper < Application

    Context < ContextWrapper < ContextThemeWrapper < Activity

    Context < ContextWrapper < ContextThemeWrapper < Activity < ListActivity

    Context < ContextWrapper < Service

    Context < ContextWrapper < Service < IntentService

    所以,所有这些类都以自己的方式成为上下文。如果愿意,可以将服务和listactivity强制转换为上下文。但是如果仔细观察,一些类也继承了主题。在活动或片段中,您希望将主题化应用到视图中,但不关心IT服务类。

    我在这里解释上下文的差异。


    上下文是每个app-s沙盒的特定于Android的API。它提供访问应用程序的私有数据,如资源、数据库、私有文件目录、首选项、设置…

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

    由于应用程序、活动、服务实现了上下文接口,因此可以在API调用需要上下文参数的地方使用它们。


    简单地说,除非你不再担心,否则你不会喜欢的一团乱麻。

    安卓ContextS是:

    • 上帝的客体。

    • 当你开始为Android开发时,你想要传递你所有的应用程序,但是当你更接近编程、测试和Android本身时,你会避免这样做。

      • 依赖性不明确。

      • 常见的内存泄漏源。

      • 用于测试的PITA。

    • Android系统用于分配权限、资源、首选项、服务、广播、样式、显示对话框和展开布局的实际上下文。对于一些单独的事情,您需要不同的Context实例(显然,您不能显示来自应用程序或服务上下文的对话框;应用程序和活动上下文膨胀的布局可能有所不同)。


    Context是指在不同时间段内的组件(或应用程序)。如果我在下午1点到2点之间吃了那么多的食物,那么我在那段时间里使用的所有方法(或资源)都是我的上下文。内容是特定时间的组件(应用程序)。应用程序组件的Context根据组件或应用程序的底层生命周期不断变化。例如,在Activity的onCreate()中,

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

    注:包含所有android组件。

    1
    2
    3
    4
    5
    6
    7
    8
         .. </activity>

        <service>  .. </service>

        <receiver> .. </receiver>

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

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

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


     ;Context表示电流。Context用于对当前屏幕进行操作。前任。1。获取应用程序上下文()2。获取上下文()

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

    在Java中,我们说这个关键字是指应用程序当前对象的状态。同样,在另一个版本中,我们在Android开发中使用了Context

    这可以定义为显式或隐式,

    1
    2
    3
    4
    5
    6
    7
    Context con = this;

    getApplicationContext();

    getBaseContext();

    getContext();


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