What is 'Context' on Android?
在android编程中,
我在开发者网站上读到过,但是我不能清楚地理解它。
简单来说:
顾名思义,它是应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序另一部分(活动和包/应用程序)的信息。
您可以通过调用
上下文的典型用法:
创建新对象:创建新视图、适配器、侦听器:
1
2TextView tv = new TextView(getContext());
ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);访问标准公共资源:布局充气服务、共享参考等服务:
1
2context.getSystemService(LAYOUT_INFLATER_SERVICE)
getApplicationContext().getSharedPreferences(*name*, *mode*);隐式访问组件:关于内容提供者、广播、意图
1getApplicationContext().getContentResolver().query(uri, ...);
上下文定义
- 上下文表示环境数据
- 它提供对数据库等事物的访问
简单术语(例1)
假设Person-X是一家初创软件公司的CEO。
公司里有一位首席架构师,这位首席架构师公司所有涉及数据库、用户界面等工作吗?等。
现在,首席执行官雇佣了一名新的开发人员。
是建筑师告诉我们新雇的人的责任根据新员工的技能,他是否会处理数据库或用户界面等。
简单术语(例2)
这就像Android活动对应用程序资源的访问。
这类似于当你参观酒店时,你想要早餐、午餐和;在合适的时间吃饭,对吗?
在逗留期间还有许多其他你喜欢的事情。你怎么拿到这些东西了吗?
你让客房服务人员把这些东西带给你。
这里是客房服务人员的背景,考虑到您是单一活动和酒店将成为您的应用程序,最后是早餐、午餐和;晚餐必须是资源。
涉及上下文的内容包括:
Context是活动、服务、应用程序等的基类
描述这一点的另一种方法是:将上下文视为电视频道在电视中的遥控器,包括资源、服务、使用意图等——这里,遥控器用作访问前景中所有不同资源的访问。
因此,Remote可以访问资源、服务、使用意图等渠道……
同样地…任何有权访问远程的人都可以自然地访问所有的东西,如资源、服务、使用意图等。
通过不同的方法可以获取上下文
getApplicationContext() getContext() getBaseContext() - 或
this (在活动类中时)
例子:
1 | TextView TV=new TextView(this); |
来源好的。
许多人似乎对Android中的上下文主题感到困惑。人们只知道,在Android中做一些基本的事情通常需要上下文。人们有时会惊慌失措,因为他们试图执行一些需要上下文的操作,却不知道如何"获取"正确的上下文。我将试图解开安卓环境的概念。对这个问题的全面处理超出了本文的范围,但我将尝试给出一个总体的概述,以便您了解上下文是什么以及如何使用它。为了理解上下文,我们来看一下源代码:好的。
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/context.java好的。
上下文究竟是什么?好的。
好吧,文档本身提供了一个相当直接的解释:上下文类是一个"关于应用程序环境的全局信息的接口"。好的。
上下文类本身声明为抽象类,其实现由Android OS提供。文档还提供了上下文"…允许访问特定于应用程序的资源和类,以及向上调用应用程序级操作,如启动活动、广播和接收意图等"。好的。
你现在可以很好地理解为什么这个名字是上下文。因为就是那样。如果愿意,上下文为活动、服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而允许访问全局应用程序环境。换言之:上下文提供了组件问题的答案:"我与应用程序的关系到底在哪里?我如何访问/与应用程序的其余部分通信?""如果这一切看起来有点混乱,那么快速查看Context类所公开的方法,可以提供一些关于其真实性质的进一步线索。好的。
以下是这些方法的随机抽样:好的。
所有这些方法有什么共同点?它们都使任何有权访问上下文的人都能够访问应用程序范围的资源。好的。
换句话说,上下文将引用它的组件挂接到应用程序环境的其余部分。例如,如果某个活动、服务或任何知道如何访问这些资源的方法,则可以在应用程序中使用资产(例如,您项目中的/assets'文件夹)。EDCOX1的1个方面也一样,它允许做像EDCOX1,6个这样的事情,这将把你带入EDOCX1 7资源中(不用介意AAPT允许通过Java代码访问资源,这是一个单独的问题)。好的。
结果是,
1 2 3 4 | @Override public AssetManager getAssets() { return mBase.getAssets(); } |
你可能知道一个活动是什么,但是回顾一下——它基本上是‘用户可以做的一件事’。它负责提供一个窗口,用于放置用户与之交互的UI。熟悉其他API的开发人员,甚至是非开发人员,可能会把它当作一个"屏幕",这在技术上是不准确的,但对于我们的目的来说并不重要。那么,
同样,看看具体的例子也很有帮助。我们都知道如何开展活动。如果你有开始活动的"背景",你只需称之为
那么什么是
1 2 3 4 | Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode); |
因此,它使用了来自
在这一点上,我们开始了解系统内部。好的。
这就是操作系统处理所有事情的地方。那么,仪器如何准确地启动活动呢?好吧,上面
30000概述是这样的:Instrumentation类跟踪它监视的活动列表,以便完成它的工作。此列表用于协调所有活动,并确保在管理活动流时一切顺利运行。好的。
有些操作我还没有完全研究过,它们协调线程和进程问题。最终,
为了让Android做到这一点,它需要访问
最后一句话:出于某种原因,刚接触到Android的人(甚至还不是很新的人)在谈到Android时似乎完全忘记了面向对象编程。出于某种原因,人们试图将他们的Android开发转向预先设想的模式或学习的行为。好的。
Android有它自己的模式和特定的模式,如果放弃你预先设想的概念,只需阅读文档和开发指南,这实际上是相当一致的。然而,我的真正观点是,虽然"获得正确的背景"有时很棘手,但人们不合理地感到恐慌,因为他们遇到了一种需要背景的情况,认为自己没有背景。Java又是一种具有继承性设计的面向对象语言。好的。
您只"拥有"活动内部的上下文,因为您的活动本身继承自上下文。它没有魔力(除了操作系统本身设置各种参数和正确"配置"上下文所做的所有事情)。因此,把内存/性能问题放在一边(例如,当你不需要或者在对内存有负面影响的情况下引用上下文时),上下文就像任何其他对象一样,它可以像任何波霍(普通的Java对象)一样传递。有时,您可能需要做一些聪明的事情来检索上下文,但是任何从对象本身之外扩展的规则Java类都可以以访问上下文的方式编写;只需公开一个上下文的公共方法,然后根据需要在该类中使用它。这并不是对上下文或Android内部进行详尽的处理,但我希望它有助于解除上下文的神秘化。好的。好啊。
上下文是系统的句柄;它提供诸如解析资源、获取对数据库和首选项的访问等服务。Android应用程序有活动。上下文类似于应用程序当前运行环境的句柄。活动对象继承上下文对象。
有关更多信息,请参阅Android Studio开发简介-教程。
它允许访问特定于应用程序的资源和类,以及向上调用应用程序级操作,例如启动活动、广播和接收意图等。
在下图中,您可以看到类的层次结构,其中
究竟是什么?
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需要一个
如果您浏览各种Android API,您将注意,他们中的许多人把
Android上下文是一个接口(在一般意义上,不是在Java意义上;在Java中,EDCOX1,4实际上是一个抽象类!)允许访问特定于应用程序的资源、类以及有关应用程序环境的信息。
如果你的android应用是一个web应用,你的上下文将类似于
您的活动和服务还扩展了
了解Android中
每个老板都有一个助理来照顾,做所有不那么重要和费时的工作。如果需要一个文件或一杯咖啡,助理就在跑着。有些老板几乎不知道办公室里发生了什么事,所以他们也向助手询问这件事。他们自己做一些工作,但大多数其他事情他们需要助手的帮助。
在这种情况下,
boss–是Android应用程序
助理——IS背景
文件/咖啡杯-是资源
当我们需要获取关于应用程序不同部分的信息时,我们通常调用上下文,如活动、应用程序等。
涉及上下文的一些操作(需要助手的操作):
- 加载公共资源
- 创建动态视图
- 显示Toast消息
- 发射活动等
获取上下文的不同方式:
1 2 3 4 5 6 7 | getContext() getBaseContext() getApplicationContext() this |
Context 表示获取环境数据的句柄。Context 类本身声明为抽象类,其实现由android操作系统提供。Context 就像电视的遥控器,电视中的频道是资源、服务等。
你能用它做什么?
- 正在加载资源。
- 启动新活动。
- 创建视图。
- 获取系统服务。
获取上下文的方法:
getApplicationContext() getContext() getBaseContext() 号
只是把它放在那里给新手看;
所以首先要了解单词的上下文:
英语库。它的意思是:
"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."
现在让我们对编程界有同样的理解:
应用程序/对象的当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序其他部分(活动、包/应用程序)的信息。
您可以通过调用
要在应用程序中的任何位置获取上下文,请使用以下代码:
在Android应用程序中创建新的类
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服务的访问,例如定位服务。
活动和服务扩展了
上下文是有关应用程序环境的全局信息的接口。它是一个抽象类,其实现由
下面是例子
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 deliveredSo Here
Boss - Android Application
Assistant - Context
File or cup of coffee - Resource
Android官方开发者网站对环境的评价
上下文是应用程序相关资源的访问点
让我们看看这些资源或任务
启动活动。
获取上特定于应用程序的缓存目录的绝对路径文件系统。
确定给定的权限是否允许用于特定的在系统中运行的进程和用户ID。
正在检查是否已授予您特定的权限。
等等。因此,如果一个Android应用程序想要启动一个活动,它会直接进入
和其他类一样,
上下文意味着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调用需要上下文参数的地方使用它们。
简单地说,除非你不再担心,否则你不会喜欢的一团乱麻。
安卓
上帝的客体。
当你开始为Android开发时,你想要传递你所有的应用程序,但是当你更接近编程、测试和Android本身时,你会避免这样做。
依赖性不明确。
常见的内存泄漏源。
用于测试的PITA。
Android系统用于分配权限、资源、首选项、服务、广播、样式、显示对话框和展开布局的实际上下文。对于一些单独的事情,您需要不同的
Context 实例(显然,您不能显示来自应用程序或服务上下文的对话框;应用程序和活动上下文膨胀的布局可能有所不同)。
注:
1 2 3 4 5 6 7 8 | .. </activity> <service> .. </service> <receiver> .. </receiver> <provider> .. </provider> </application> |
这意味着,当您从任何组件内部调用
系统根据组件的生命周期不断修改
 ;
1 | Toast.makeText(getApplicationContext(),"hello", Toast.LENGTH_SHORT).show(); |
在Java中,我们说这个关键字是指应用程序当前对象的状态。同样,在另一个版本中,我们在Android开发中使用了
这可以定义为显式或隐式,
1 2 3 4 5 6 7 | Context con = this; getApplicationContext(); getBaseContext(); getContext(); |
此属性声明此布局默认与哪个活动关联。