安卓系统中的“Context”是什么?

2246
在Android编程中,Context类到底是什么,它有什么用途?
我在开发者网站上读到了相关内容,但我无法清楚地理解它。

21
关于这个问题的内容: Context在Java中通常是指Android应用程序中的上下文环境,它包含了应用程序的信息,比如资源和类加载器等。Context也提供了访问Android系统服务的接口,比如访问文件系统或者获取系统服务等。Context可以通过构造函数或者getApplicationContext()方法来获得。 - Christopher Perry
32个回答

1694
简单来说,它是应用程序/对象当前状态的上下文。它让新创建的对象了解已经发生了什么。通常情况下,您会调用它来获取有关程序的另一部分(活动和包/应用程序)的信息。您可以通过调用getApplicationContext()、getContext()、getBaseContext()或this(在扩展自Context的类中,例如Application、Activity、Service和IntentService类)来获取上下文。
典型的上下文使用方式:
1. 创建新对象: 创建新视图、适配器和监听器:
  • 创建新对象
 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, ...);
    

    60
    在您的示例中context.getSystemService(LAYOUT_INFLATER_SERVICE)context 是在代码中定义的一个变量或参数,指向当前的上下文对象。 - Dennis
    3
    我认为应该是上下文(Context类)。 - ibaguio
    10
    动态创建文本视图时需要上下文的原因已经很清楚了。但是在动态创建文本视图数组时,我们不必提及任何上下文。为什么会这样呢? TextView[] textview = new TextView[10];答:在创建文本视图数组时,上下文通常是由其父级视图提供的,因此不需要明确指定上下文。在这种情况下,可以使用默认上下文或者从父级视图中获取上下文。上面的代码创建了一个包含10个TextView的数组,这些TextView将使用它们所属的父级视图的上下文。 - Abhinav Arora
    44
    定义数组时,实际上并没有创建任何TextView的实例(你只是在创建存放TextView的空间)。当你需要将任何值放入该数组时,你要么需要预先创建TextViews,要么需要上下文来允许你创建它们。 - mc1arke
    33
    为什么视图需要上下文?例如,如果TextView没有上下文,它将无法完成哪些任务? - dinosaur
    24
    如果一段代码没有"Context"(上下文)的话,它可以在安装了JVM的任何操作系统上运行。但如果有上下文,它应该在Android上运行。如果你想使用Android特定的功能(比如访问设备位置、拍照、运行后台服务等),你就需要一个上下文。但如果你进行http请求,你就不需要上下文。上下文可以被认为是Java和Android之间的桥梁。 - Faruk Toptas

    579

    上下文的定义

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

    更简单的解释(示例1)

    • 假设Person-X是一家初创软件公司的首席执行官。

    • 公司中有一位首席架构师,他负责公司中涉及数据库、用户界面等方面的所有工作。

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

    • 根据新人的技能以及他是否将在数据库或用户界面等方面工作,由首席架构师告知新员工的责任。

    更简单的解释(示例2)

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

    • 就像当你去酒店时,你希望在合适的时间吃早餐、午餐和晚餐,对吧?

    • 在逗留期间,还有很多其他你喜欢的东西。你如何得到这些东西呢?

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

    • 在这里,客房服务人员是上下文,考虑到你是单一的活动,酒店是你的应用程序,最后早餐、午餐和晚餐必须是资源。


    涉及上下文的事物包括:
    1. 加载资源。
    2. 启动新的活动。
    3. 创建视图。
    4. 获取系统服务。

    上下文是ActivityServiceApplication等的基类

    另一种描述方式:将上下文视为电视的遥控器,电视中的频道是资源、服务、使用意图等——遥控器作为访问前台中所有不同资源的通道。

    • 因此,遥控器可以访问诸如资源、服务、使用意图等频道...

    • 同样地...谁拥有遥控器的访问权限,自然而然地拥有对诸如资源、服务、使用意图等的访问权限


    不同的方法可以获取上下文
    - getApplicationContext() - getContext() - getBaseContext() - 或者this(当在活动类中时)

    例子:

    TextView tv = new TextView(this);
    

    关键字this指的是当前活动的上下文。

    6
    好的,从 Activity 类派生出来的类本身就是一个上下文。因此,通过将它传递给新创建的视图,我们传递了上下文。 - 0leg
    13
    这个设计决策让上下文从多个地方都可以访问,我不确定这是否是一个好的设计决策。在我看来,应用程序中有一个静态的getContext()足以满足需求。 - Trilarion
    2
    @Trilarion... 这取决于您想如何使用上下文 getApplicationContext()getContext()getBaseContext() ..... 参考此链接->(https://dev59.com/Imgv5IYBdhLWcg3wYv2i#10641257) - Devrath
    1
    仅仅是为了扩展上一个部分,创建一个TextView:在某些情况下,可能需要调用SomeActivityName.this。例如,在线程中,this指的是线程而不是活动。 - Zoe stands with Ukraine
    3
    上下文对象(Context Object)对于一个Apk包或者Android操作系统来说是唯一的吗?一个应用程序可以拥有两个不同的上下文对象吗? - valijon
    显示剩余3条评论

    131

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

    要了解更多信息,请查看使用Android Studio进行Android开发介绍 - 教程


    102

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

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

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

    Activity diagram


    9
    这张照片是如何生成的? - d0ye
    同样的内容在这里,谁从谁那里偷了?https://ericyang505.github.io/android/Context.html - Marian Paździoch

    76

    什么是Context

    根据Android参考文档,它是表示各种环境数据的实体。它提供了访问本地文件、数据库、与环境相关联的类加载器、服务(包括系统级服务)等功能。在本书和您日常的Android编码中,您会经常看到Context被频繁传递。

    来自于《Android in Practice》书籍第60页。

    几个Android API需要一个Context参数

    如果您浏览各种Android API,您会注意到其中许多需要一个android.content.Context对象作为参数。您还会发现Activity或Service通常被用作Context。这是因为这两个类都从Context继承而来。


    68

    Android中理解context的简单示例:

    每个老板都有一个助手来照顾,完成所有不太重要且耗时的任务。如果需要文件或一杯咖啡,助手会马上去准备。有些老板几乎不知道办公室里发生了什么事情,因此他们也会向他们的助手询问。他们自己做一些工作,但对于大部分其它事情,他们需要助手的帮助。

    在这种情况下,

    老板 - 是Android应用程序

    助手 - 是一个context

    文件/咖啡杯 - 是资源

    当我们需要获取关于应用程序不同部分(如活动、应用程序等)的信息时,通常称之为context。

    某些使用context的操作(需要助手的地方):

    • 加载共同的资源
    • 创建动态视图
    • 显示Toast消息
    • 启动活动等

    获取context的不同方式:

    getContext()
    
    getBaseContext()
    
    getApplicationContext()
    
    this
    

    52

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

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

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


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

    你可以用它做什么?

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

    获取上下文的方法:

    • getApplicationContext()
    • getContext()
    • getBaseContext()在此输入图片描述在此输入图片描述

    23

    这里提供给初学者一些提示:

    首先要理解“单词上下文”:

    在英语中,它的意思是:

    “事件、陈述或想法发生的环境,以及可以完全理解和评估其中内容的术语。”

    “立即跟随单词或段落的某些书面或口头表述,并阐明其意义的部分。”

    现在将同样的理解应用到编程世界中:

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

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

    现在,如果您想在非活动类中获取应用程序上下文,请调用此方法,即可获得应用程序上下文。

    希望这可以帮到您;)


    20

    Context是指当前对象this的引用。同时,context允许访问有关应用程序环境的信息。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接