提问



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


我在开发者网站上看过它,但我无法理解它。

最佳参考


简单地说:


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


您可以通过调用getApplicationContext()getContext()getBaseContext()this来获取上下文(当在Context中扩展的类时,例如应用程序,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, ...);
    


其它参考1


Context ::

的定义


  • 上下文代表环境数据

  • 它提供对数据库
  • 等内容的访问


更简单的术语::




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

  • 公司中有一位首席架构师,这位首席架构师
    完成公司中涉及数据库,UI等所有工作
    等等

  • 现在首席执行官聘请了一位新的开发人员。

  • 建筑师告诉新雇员的责任
    基于新人技能的人,他是否愿意
    在数据库或UI等工作



更简单的术语::




  • 就像访问AndroidActivity到应用程序的资源一样。

  • 这与你去酒店时的情况类似,你想吃早餐,午餐和早餐。
    晚餐在合适的时间,对吧?

  • 入住期间,您还有许多其他的事情。你怎么
    得到这些东西?

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

  • 这里的客房服务人员是考虑到你的情况
    单项Activity和酒店成为您的应用程序,最后是早餐,午餐和
    晚餐必须是资源。






涉及背景的事情是:



  1. 加载资源。

  2. 启动新Activity。

  3. 创建视图。

  4. 获取系统服务。






Context是 Activity , Service , Application ....等的基类



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



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

  • 同样.....无论是谁有权访问遥控器,都可以访问资源,服务,使用意图等所有内容






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



  • getApplicationContext()

  • getContext()

  • getBaseContext()

  • this(在Activity课程中时)






示例:


TextView TV=new TextView(this);


this - >指当前Activity的背景。

其它参考2


[115]





Android中的Context主题似乎让很多人感到困惑。人们只知道在Android中做基本的事情经常需要Context。人们有时会感到恐慌,因为他们试图执行一些需要上下文的操作,他们不知道如何获得正确的上下文。我将尝试揭开Android中Context的神秘面纱。对该问题的完整处理超出了本文的范围,但我将尝试给出一般概述,以便您了解Context是什么以及如何使用它。要了解Context是什么,让我们来看看源代码:


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


什么是上下文?


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


Context类本身被声明为抽象类,其实现由Android OS提供。该文档进一步规定Context...允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动Activity,广播和接收意图等。


你现在可以理解为什么这个名字是Context。这是因为就是这样。 Context(如果您愿意)为Activity,服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而允许访问全局应用程序环境。
换句话说:上下文提供了组件问题的答案:我到底与app有什么关系?我如何访问/与应用程序的其余部分进行通信?如果这一切看起来有点令人困惑,请快速查看Context类公开的方法提供了一些关于其真实性质的进一步线索。


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



  1. getAssets()

  2. getResources()

  3. getPackageManager()

  4. getString()

  5. getSharedPrefsFile()



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


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


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


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


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


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


同样,查看具体示例也很有帮助。我们都知道如何发起Activity。如果你有上下文,你正在启动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类跟踪它正在监视的Activity列表,以便完成它的工作。此列表用于协调所有Activity,并确保在管理Activity流程时一切顺利进行。


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


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


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


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


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

其它参考3


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


有关更多信息,请参阅使用Android Studio进行Android开发简介 - 教程。[117]

其它参考4



  只要你想要思考,就要想大。



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


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




其它参考5


ANDROID AND CONTEXT


如果您查看各种Android API,您将会
请注意,他们中的许多人将android.content.Context对象视为
参数。您还会看到Activity或服务通常用作
语境。这是有效的,因为这两个类都从Context扩展。


究竟是什么背景?


根据Android参考文档,它是一个
表示各种环境数据的实体。它提供访问本地
文件,数据库,与环境关联的类加载器,包括系统级服务在内的服务等。在整本书中,以及在你的日常工作中
使用Android进行日编码,您会看到Context经常传递。
来自:Android in Practice一书。

其它参考6


Android Context是一个接口,允许访问特定于应用程序的资源以及有关应用程序环境的类和信息。[118] [119]



  如果您的Android应用程序是一个Web应用程序,
  你的背景会是什么
  类似于ServletContext(我这里没有做一个精确的比较)



您的Activity和服务还会将Context扩展为继承所有这些方法以访问运行应用程序的环境信息。

其它参考7


在android中理解context的简单示例:


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


在这种情况下,


老板 - 是Android应用程序


助理 - 是背景


文件/一杯咖啡 - 是资源


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


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


加载公共资源
创建动态视图
显示Toast消息
发起Activity等
获取上下文的不同方式:


getContext()

getBaseContext()

getApplicationContext()

this

其它参考8



  • Context表示获取环境数据的句柄。

  • Context类本身被声明为abstract,其实现由android OS提供。

  • 上下文就像是电视和电视的遥控器。电视中的频道是资源,服务等。



你能用它做什么?[120]



  • 加载资源。

  • 启动新Activity。

  • 创建视图。

  • 获取系统服务。



获取背景的方法:



  • getApplicationContext()

  • getContext()

  • getBaseContext()


其它参考9


只是把它放在那里给新手; [121] [122]


首先要了解Word Context:


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



  形成事件,陈述或者陈述的环境
  这个想法,以及可以充分理解和评估的想法。

  
  紧接在之前和之后的书面或口头的部分
  按照一个词或一段话澄清其含义。



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


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


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


要在应用程序中使用以下代码获取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;
    }
}


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


希望这个帮助;)

其它参考10


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

其它参考11


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

其它参考12


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


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


Activity和服务扩展了Context课程。

其它参考13


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


为了避免内存泄漏,您应该为需要上下文对象的每个组件使用应用程序上下文....更多请点击此处[123]

其它参考14


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


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


您可以通过不同的调用方法获取上下文
1. getApplicationContext(),
2. getContext(),
3. getBaseContext()
4.或者这个(在Activity课上)。

其它参考15


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


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


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


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

其它参考16


上下文是有关应用程序环境的全局信息的接口。它是一个抽象类,其实现由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 [124]

其它参考17


有关应用程序环境的全局信息的接口。这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动Activity,广播和接收意图等。

其它参考18


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


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


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


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

其它参考19


A Context是我们大多数人所说的应用程序。它由Android系统制作,只能做应用程序所能做的事情。
在Tomcat中,Context也是我称之为应用程序的东西。


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


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

其它参考20


Boss Assistant Analogy



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



  每个老板都有一个助手或一个做得少的人(差事男孩)
  对他来说重要且耗时的事情。例如,如果他们
  需要一份文件或咖啡,然后助理将在运行。老板不会
  知道后台发生了什么,但文件或任务会发生
  交付

  
  所以这里

    老板 - Android应用程序

     助理 - 上下文

  文件或杯咖啡 - 资源



官方Android Developper网站上有关Context的内容



应用相关资源的上下文是您的访问点 [125]


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



  • 启动Activity。

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

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

  • 检查您是否获得了特定权限。



等等。

因此,如果Android应用程序想要启动一个Activity,它会直接进入Context(接入点),而Context类会让他返回资源(在这种情况下为Intent)。


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

其它参考21


上下文意味着Android了解我应该去哪个Activity或者采取行动。


1 - Toast.makeText(context,Enter All Details,Toast.LENGTH_SHORT).show();
它用于此。
Context context=ActivityName.this;


2 -startActivity(new Intent(context,LoginActivity.class));


在这种情况下,意味着你想从哪个Activity去其他Activity。
context或ActivityName.this比getContext和getApplicatinContext更快。

其它参考22


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



  上下文< ContextWrapper<应用

  
  上下文< ContextWrapper< ContextThemeWrapper<Activity

  
  上下文< ContextWrapper< ContextThemeWrapper<Activity<
  ListActivity

  
  上下文< ContextWrapper<服务

  
  上下文< ContextWrapper<服务< IntentService



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


我在这里解释了背景的差异。[126]

其它参考23


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


Android Context是:



  • 神对象。

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



    • 依赖性不明确。

    • 内存泄漏的常见来源。

    • PITA进行测试。


  • Android系统用于分派权限,资源,首选项,服务,广播,样式,显示对话框和充气布局的实际上下文。并且您需要针对某些单独的事物使用不同的Context实例(显然,您无法显示来自应用程序或服务上下文的对话框;从应用程序和Activity上下文中填充的布局可能会有所不同)。


其它参考24


Context是每个app-Sandbox的特定于Android的api
提供访问应用私人数据,如资源,数据库,私人档案,偏好,设置... [127]


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


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

其它参考25


  Context表示当前。
Context用于对当前屏幕进行操作。
恩。

 &NBSP;的 1。 getApplicationContext()

 &NBSP;的 2。的getContext()


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

其它参考26


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


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


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


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

    <service>  .. </service>

    <receiver> .. </receiver>

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


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


Context基于组件的生命周期不断被系统修改。

其它参考27


Android中的上下文是关于应用程序环境的全局信息的接口。这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动Activity,广播和接收意图等。

其它参考28


此属性声明此布局与默认情况下相关联的Activity。

其它参考29


在Java中,我们说这个关键字指的是应用程序当前对象的状态。


同样,我们在Android开发中有Context


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


Context con = this;

getApplicationContext();

getBaseContext();

getContext();