Bri*_*ier 1872 android android-context
在Android编程中,究竟是什么Context类以及它用于什么?
我在开发者网站上看过它,但我无法理解它.
Sam*_*gal 1438
简单地说:
顾名思义,它是应用程序/对象当前状态的上下文.它允许新创建的对象了解正在发生的事情.通常,您可以调用它来获取有关程序其他部分(活动和包/应用程序)的信息.
您可以通过调用获取上下文getApplicationContext(),getContext(),getBaseContext()或this(当从扩展一个类Context,如应用程序,活动,服务和IntentService类).
上下文的典型用法:
创建新对象:创建新视图,适配器,侦听器:
TextView tv = new TextView(getContext());
ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
Run Code Online (Sandbox Code Playgroud)访问标准公共资源:LAYOUT_INFLATER_SERVICE,SharedPreferences等服务:
context.getSystemService(LAYOUT_INFLATER_SERVICE)
getApplicationContext().getSharedPreferences(*name*, *mode*);
Run Code Online (Sandbox Code Playgroud)隐式访问组件:关于内容提供者,广播,意图
getApplicationContext().getContentResolver().query(uri, ...);
Run Code Online (Sandbox Code Playgroud)Dev*_*ath 482
考虑到Person-X是一家初创软件公司的首席执行官.
公司中有一位首席架构师,这位首席架构师负责公司的所有工作,包括数据库,UI等.
现在,CEO聘请了一位新的开发人员.
建筑师根据新人的技能告诉新雇员的责任,他是否会在数据库或用户界面等方面工作.
这就像访问Android活动到应用程序的资源.
这与你去酒店时的情况类似,你想要在适当的时间吃早餐,午餐和晚餐,对吧?
入住期间,您还有许多其他的事情.你怎么得到这些东西?
您要求客房服务人员为您带来这些东西.
在这里,客房服务人员是考虑到您是单一活动和酒店作为您的应用程序的背景,最后早餐,午餐和晚餐必须是资源.
涉及背景的事情是:
另一种描述这种情况的方法:考虑上下文作为电视中的电视和频道的遥控器是资源,服务,使用意图等 - - 这里遥控器作为访问以访问所有不同资源到前台的访问.
因此,Remote可以访问资源,服务,使用意图等渠道....
同样......有权访问远程的人自然可以访问所有的东西,如资源,服务,使用意图等
您可以通过不同的方法获取上下文
getApplicationContext()getContext()getBaseContext()this(在活动课上时)例:
TextView TV=new TextView(this);
Run Code Online (Sandbox Code Playgroud)
this - >指当前活动的上下文.
Sou*_*rma 334
Android中的Context主题似乎让很多人感到困惑.人们只知道在Android中做基本的事情经常需要Context.人们有时会感到恐慌,因为他们试图执行一些需要上下文的操作,他们不知道如何"获得"正确的上下文.我将尝试揭开Android中Context的神秘面纱.对该问题的完整处理超出了本文的范围,但我将尝试给出一般概述,以便您了解Context是什么以及如何使用它.要了解Context是什么,让我们来看看源代码:
什么是Context?
好吧,文档本身提供了一个相当简单的解释:Context类是"关于应用程序环境的全局信息的接口".
Context类本身被声明为抽象类,其实现由Android OS提供.该文档进一步规定Context"...允许访问特定于应用程序的资源和类,以及对应用程序级操作的上调,例如启动活动,广播和接收意图等".
你现在可以理解为什么名称是Context.这是因为就是这样.Context(如果您愿意)为活动,服务或任何其他组件提供链接或挂钩,从而将其链接到系统,从而允许访问全局应用程序环境.换句话说:上下文提供了组件问题的答案:"我到底与app有什么关系?我如何访问/与应用程序的其余部分进行通信?"如果这一切看起来有点令人困惑,请快速查看Context类公开的方法提供了一些关于其真实性质的进一步线索.
以下是这些方法的随机抽样:
getAssets() getResources()getPackageManager()getString()getSharedPrefsFile()所有这些方法有什么共同之处?它们都允许有权访问Context的任何人能够访问应用程序范围的资源.
换句话说,上下文将具有对它的引用的组件挂钩到应用程序环境的其余部分.例如,资产(例如项目中的'/ assets'文件夹)可在整个应用程序中使用,前提是活动,服务或其他任何知道如何访问这些资源的人.同样的事情getResources()允许做一些事情getResources().getColor()会把你挂钩到colors.xml资源(永远不要说aapt允许通过java代码访问资源,这是一个单独的问题).
结果就是Context能够访问系统资源及其将组件挂钩到"更大的应用程序"的内容.让我们看一下Context提供抽象Context类实现的类的子类.最明显的类是Activity类.Activity继承来自ContextThemeWrapper,继承自ContextWrapper,继承自Context自己.这些类对于在更深层次上理解事物是有用的,但是现在它足以知道它们ContextThemeWrapper并且ContextWrapper几乎就是它们听起来的样子.它们实现了抽象元素.Context通过"包装"的上下文(实际的上下文)和委派那些功能到该上下文类本身的实例是有益的-在ContextWrapper类,抽象方法getAssets从Context类是如下实现的:
@Override
public AssetManager getAssets() {
return mBase.getAssets();
}
Run Code Online (Sandbox Code Playgroud)
mBase只是由构造函数设置为特定上下文的字段.因此,上下文被包装并将ContextWrappergetAssets方法的实现委托给该上下文.让我们回过头来检查Activity最终继承的类,Context看看这一切是如何运作的.
您可能知道什么是活动,但要审查 - 它基本上是"用户可以做的一件事".它负责提供一个窗口,用于放置用户与之交互的UI.熟悉其他API甚至非开发人员的开发人员可能会将其本身视为"屏幕".这在技术上是不准确的,但对我们的目的而言并不重要.那么如何做Activity和Context交互以及它们的继承关系究竟发生了什么?
同样,查看具体示例也很有帮助.我们都知道如何发起活动.如果你有"上下文",你正在启动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);
Run Code Online (Sandbox Code Playgroud)
因此,它利用了execStartActivity从Instrumentation类(实际上是从一个内部类Instrumentation叫ActivityResult).
在这一点上,我们开始看到系统内部.
这是操作系统实际处理一切的地方.那么Instrumentation如何准确地启动Activity呢?那么,帕拉姆this在execStartActivity上述方法是你的活动,即环境,并且execStartActivity利用这一背景下的.
这是一个30,000概述:Instrumentation类跟踪它正在监视的活动列表,以便完成它的工作.此列表用于协调所有活动,并确保在管理活动流程时一切顺利进行.
有些操作我还没有完全了解哪个坐标线程和进程问题.最终,ActivityResult使用本机操作 - ActivityManagerNative.getDefault().startActivity()使用Context您在调用时传入的操作startActivity.您传入的上下文用于协助"意图解决"(如果需要).意图解析是系统在未提供意图目标时确定目标的过程.(有关详细信息,请查看此处的指南).
为了让Android执行此操作,它需要访问由提供的信息Context.具体来说,系统需要访问一个ContentResolver所以它可以"确定意图数据的MIME类型".关于如何startActivity利用上下文的这一点有点复杂,我自己并不完全理解内部.我的主要观点只是为了说明如何访问应用程序范围的资源以执行对应用程序至关重要的许多操作.Context提供对这些资源的访问权限.一个更简单的例子可能是Views.我们都知道你创建了什么自定义通过扩展RelativeLayout或其他View类来查看 ,你必须提供一个构造函数Context作为参数.当你实例化自定义视图时,你传递上下文.为什么?因为视图需要能够访问主题,资源,查看配置实际上是一个很好的例子.每个Context都有各种参数(实现中的字段Context),这些参数由操作系统自身设置,用于显示的尺寸或密度等.很容易理解为什么 此信息对于设置视图等很重要.
最后一句话: 出于某些原因,Android的新手(甚至是不那么新的人)在Android方面似乎完全忘记了面向对象的编程.出于某种原因,人们试图将他们的Android开发转变为预先设想的范式或学习行为.
Android拥有它自己的范例和某种模式,如果放弃你预先设想的概念并简单阅读文档和开发指南,它实际上是非常一致的.然而,我的真实观点是,虽然"获得正确的背景"有时候会很棘手,但人们会因为遇到需要上下文并认为自己没有上下文的情况而不合理地恐慌.Java是一种面向对象的语言,具有继承设计.
您只有"拥有"Activity内部的上下文,因为您的活动本身继承自Context.它没有什么神奇之处(除了操作系统自己设置各种参数和正确"配置"你的上下文)所做的所有事情.因此,将内存/性能问题放在一边(例如,当您不需要或以对内存产生负面影响的方式执行上下文时保持对上下文的引用等),Context就像任何其他对象一样,它可以传递给它就像任何POJO(Plain Old Java Object)一样.有时您可能需要做一些聪明的事情来检索该上下文,但是除了Object本身之外的任何其他常规Java类都可以以可访问上下文的方式编写; 简单地公开一个带有上下文的公共方法,然后根据需要在该类中使用它.这不是对Context或Android内部的详尽处理,但我希望它有助于揭开Context的神秘感.
ang*_*guy 116
Context是系统的句柄; 它提供诸如解析资源,获取对数据库和首选项的访问等服务.Android应用有活动.Context类似于当前运行应用程序的环境的句柄.活动对象继承Context对象.
有关更多信息,请参阅Android Studio - Tutorial的Android开发简介.
Dmy*_*lyk 85
Context是关于应用程序环境的全局信息的"接口".在实践中,Context实际上是一个抽象类,其实现由Android系统提供.
它允许访问特定于应用程序的资源和类,以及应用程序级操作的上调,例如启动活动,广播和接收意图等.
在下图中,您可以看到类的层次结构,其中Context是此层次结构的根类.特别值得强调的是,它Activity是后代Context.

小智 70
到底是Context什么?
根据Android参考文档,它是一个表示各种环境数据的实体.它提供对本地文件,数据库,与环境关联的类加载器,服务(包括系统级服务)等的访问.在本书以及使用Android的日常编码中,您将看到Context经常传递.
来自" Android in Practice "一书,p.60.
有几个Android API需要Contextas参数
如果您查看各种Android API,您会发现其中许多都将android.content.Context对象作为参数.您还会看到活动或服务通常用作
Context.这是有效的,因为这两个类都扩展自Context.
Par*_*dik 48
context在android中理解的简单示例:
每个老板都有一个助手照顾,做所有不那么重要和耗时的任务.如果需要一个文件或一杯咖啡,一个助手正在运行.有些老板几乎不知道办公室里发生了什么,所以他们也会问他们的助手.他们自己做一些工作,但对于大多数其他事情,他们需要助手的帮助.
在这种情况下,
老板 - 是Android应用程序
助理 - 是背景
文件/一杯咖啡 - 是资源
当我们需要获取有关应用程序的不同部分的信息时,我们通常会调用上下文,如活动,应用程
涉及上下文的一些操作(需要助手的事情):
加载公共资源创建动态视图显示Toast消息启动活动等获取上下文的不同方式:
getContext()
getBaseContext()
getApplicationContext()
this
Run Code Online (Sandbox Code Playgroud)
sta*_*bit 18
只是把它放在那里给新手;
首先要了解Word上下文:
在英语 - lib.它的意思是:
"形成事件,陈述或想法背景的环境,以及可以充分理解和评估的环境."
"在一个词或段落之前和之后立即书写或说出的部分内容,并澄清其含义."
现在对编程世界采取同样的理解:
应用程序/对象的当前状态的上下文.它允许新创建的对象了解正在发生的事情.通常,您调用它来获取有关程序其他部分的信息(活动,包/应用程序)
您可以通过调用获取上下文getApplicationContext(),getContext(), getBaseContext()或this(在活动课的时候).
要在应用程序中使用以下代码获取Context Anywhere:
AppContext在Android应用程序中创建新类
public class AppContext extends Application {
private static Context context;
public void onCreate(){
super.onCreate();
AppContext.context = getApplicationContext();
}
public static Context getAppContext() {
return AppContext.context;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,只要您想在非活动类中使用应用程序上下文,请调用此方法并获得应用程序上下文.
希望这个帮助;)
ioa*_*isa 14
Context 是Android 提供的一个抽象类,因此,它的作用是将您的应用程序代码与 Android 系统连接起来。通过从 Context(活动、服务和应用程序)继承的类,您的应用程序能够访问只能由操作系统访问的资源和功能。
当上下文后代对象被操作系统实例化时(通过操作系统控制的实例化机制,如“意图”),它们由操作系统管理,因此,它们获得生命周期。
对于其他任何事情,在方法调用中将上下文作为参数传递,允许此方法使用上下文作为与操作系统通信的通道,以便到达操作系统并要求它执行某些操作或返回某些资源。
将上下文与清单一起可视化
为了可视化运行中的 Android 上下文和清单,旧的呼叫中心总机是一个很好的类比。
基础是 Android 系统,连接每个正在运行的应用程序的所有应用程序组件的所有电线都在其中出现。
每个“总机应用程序”都包含一些插件,它们代表应用程序的清单组件声明。因此,通过清单声明,Android 系统了解这些插头的存在,以便它可以通过意图创建对象来插入新的上下文线。
每条线代表一个连接到应用程序的某些可启动组件或应用程序本身的 Android 上下文。您可以使用现有的线路,因为它与 Android 系统连接,以便请求需要通过操作系统完成的各种事情。
您可以假设当一个 Activity 被销毁时,它的电线就会被拔掉。当构建另一个活动(或另一个组件)时,会出现一条新线并连接到正确的清单声明的插头。
我写了整篇文章来解释Context 如何将你的应用程序耦合到 Android 系统:
小智 13
该类android.content.Context提供与Android系统的连接和项目的资源.它是有关应用程序环境的全局信息的接口.
Context还提供对Android服务的访问,例如位置服务.
活动和服务扩展了Context课程.
小智 9
Context是类的实例android.content.Context提供与执行应用程序的Android系统的连接.例如,您可以通过上下文检查当前设备显示的大小.
它还可以访问项目的资源.它是有关应用程序环境的全局信息的接口.
Context类还提供对Android服务的访问,例如,警报管理器以触发基于时间的事件.
活动和服务扩展了Context类.因此,它们可以直接用于访问Context.
Context是有关应用程序环境的全局信息的接口.它是一个抽象类,其实现由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. */
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请访问http://developer.android.com/reference/android/content/Context.html
小智 8
上下文是应用程序/对象的当前状态的上下文.它是表示各种环境数据的实体.Context帮助当前活动与外部android环境交互,如本地文件,数据库,与环境相关的类加载器,服务(包括系统级服务)等.
Context是系统的句柄.它提供诸如解析资源,获取对数据库和首选项的访问等服务.Android应用程序有活动.它就像是当前运行应用程序的环境的句柄.活动对象继承Context对象.
可以通过不同的调用方法获取上下文1. getApplicationContext(),2.getContext(),3.getBaseContext()4.或者此(在活动类中时).
上下文意味着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。
A Context是我们大多数人称之为应用程序的东西.它由Android系统制作,只能执行应用程序的功能.在Tomcat中,Context也是我称之为应用程序的东西.
有一个Context包含许多Activity,每个Activity可能有很多Views.
显然,有些人会说它不适合因为这个或那个并且它们可能是正确的,但是说Context是你当前的应用程序将帮助你理解你在方法参数中的含义.
简单地说,AndroidContext是一团糟,除非您不再担心,否则您不会喜欢它。
AndroidContext是:
上帝-对象。
当您开始为 Android 开发时,您希望传递所有应用程序,但当您更接近编程、测试和 Android 本身时将避免这样做。
不明确的依赖。
内存泄漏的常见来源。
用于测试的 PITA。
Android 系统用于调度权限、资源、首选项、服务、广播、样式、显示对话框和膨胀布局的实际上下文。并且你需要不同的Context实例来处理一些单独的事情(显然,你不能显示来自应用程序或服务上下文的对话框;从应用程序和活动上下文膨胀的布局可能会有所不同)。
在深入探讨Context的技术性之前,让我们先进行一些类比
每个Boss都有一个助手或一个(差事男孩),他为他做了不那么重要和耗时的事情.例如,如果他们需要文件或咖啡,那么助理将会运行.老板不会知道后台发生了什么,但文件或任务将被交付
所以这里
老板 - Android应用程序
助手 - 上下文
文件或一杯咖啡 - 资源
Context是应用程序相关资源的访问点
让我们看看一些这样的资源或任务
发起一项活动.
获取文件系统上特定于应用程序的缓存目录的绝对路径.
确定是否允许在系统中运行的特定进程和用户标识的给定权限.
检查您是否已获得特定权限.
等等.
因此,如果一个Android应用程序想要启动一个活动,它会直接进入Context(Access Point),并且Context该类会为他提供资源(在这种情况下为Intent).
像任何其他类Context类一样,也有字段和方法.
您可以Context在官方文档中了解更多信息,它涵盖了几乎所有内容,可用方法,字段甚至如何使用方法中的字段.
android.content.Context类的实例提供与执行应用程序的Android系统的连接。例如,您可以通过上下文检查当前设备显示的大小。
它还可以访问项目的资源。它是有关应用程序环境的全局信息的接口。
Context类还提供对Android服务的访问,例如,警报管理器以触发基于时间的事件。
活动和服务扩展了Context类。因此,它们可以直接用于访问上下文。
如果您想将Context与 Android 中其他熟悉的类连接起来,请记住以下结构:
上下文 < ContextWrapper < 应用程序
上下文 < ContextWrapper < ContextThemeWrapper < 活动
上下文 < ContextWrapper < ContextThemeWrapper < 活动 < ListActivity
上下文 < ContextWrapper < 服务
上下文 < ContextWrapper < 服务 < IntentService
因此,所有这些类都是以自己的方式存在的上下文。如果您愿意,您可以将Service和ListActivity强制转换为Context 。但如果仔细观察,某些类也继承了主题。在活动或片段中,您希望将主题应用到您的视图,但不关心它,例如服务类。
我在这里解释了上下文的差异。
Context表示不同时间段内的组件(或应用程序)。如果我在下午 1 点到 2 点之间确实吃了很多食物,那么我那段时间的上下文将用于访问我在那段时间使用的所有方法(或资源)。内容是特定时间的组件(应用程序)。应用程序的组件的数量Context根据组件或应用程序的底层生命周期不断变化。例如,在 onCreate() 的内部Activity,
getBaseContext()-- 给出由活动构造函数设置(创建)的
context。-- 给出在创建应用程序期间创建的设置。ActivitygetApplicationContext()Context
注意:<application>包含所有 Android 组件。
<application>
<activity> .. </activity>
<service> .. </service>
<receiver> .. </receiver>
<provider> .. </provider>
</application>
Run Code Online (Sandbox Code Playgroud)
这意味着,当您从任何组件内部调用时getApplicationContext(),您正在调用整个应用程序的公共上下文。
Context系统根据组件的生命周期不断修改。
| 归档时间: |
|
| 查看次数: |
654422 次 |
| 最近记录: |