Android中对于Context的理解
2015-10-14 10:50
330 查看
在Android中,Context到底是个什么鬼东西,它到底是干嘛使得,我读了很多篇文档,然而并不能清除的理解它的含义。
答案:
简单来说,就像它的名字(上下文)一样,他是项目当前的状态的一个标识,他可以让新创建出来,新加入进来的对象或组件知道当前项目的进度,处于一个什么状态,这样我们就可以容易理解上下文的意思了把,上文就是自己知道了之前项目已经处于一个什么样的状态,下文就是告诉后来的对象或者组件当前项目处于一个什么状态。
你可以通过getApplication()、getContext()、getBaseContext()或者this(在当前的Activity中时)来获取context上下文。
通常使用Context的地方:
创建一个新的对象时:
1.创建新的View、adapter、listener
2.获取资源文件:例如 LAYOUT_INFLATER_SERVICE, SharedPreferences:
3.隐式访问组件
如果还不明白不用担心,现在我们开始翻译Context in Andorid – INSIGHT
Context大概是Android项目中最为常用的一个元素了
每个文档中都会有如下一句话:
“An android context is an interface to global information about an application environment”
意思是Android的context是一个沟通全局信息和程序环境的一个接口
当我找一些介绍context的文章时,我发现少之又少,所以我将我看到的一些文章做一个整理。
这里的接口不是java中接口interface的意思,这个接口就是连接的意思,连接两个组件。
更准确说它是一个代表了各种环境数据的实体。
android.content.context使resources(资源文件)、数据库、文件系统、activity、系统服务等组件之间有了可以访问的入口。
或者可以这样说:Context持有程序的状态、入口、权限、文件系统、等信息,并且是Activity、Service、Application等组件的父类。
在现实世界中我们可以这样描述Context:它就像一张门禁卡,通过这张门禁卡我们可以进入仓库、可以进入客厅、可以进入厨房获取我们想要的资源,这张门禁卡把几个分离的房间连接到一起了。
一个拥有门禁卡(Context)的人(Activity)可以获得各种系统的资源。
我们有3种方式可以获得context:
mContext = getApplicationContext();
这种方式获得的context是全局context,整个项目的生命中期中是唯一的且一直存在的,代表了所有activities的context
mContext = getContext()
这种方式获得的context当activity销毁时,context也会跟着销毁了
mContext = getBaseContext();
说实话我也没用过这种方式
何时使用getApplicationContext()或getContext()?
通过上面的分析我们知道了两个context一个是跟随activity的生命周期一个是跟随application的生命周期的。
因此,当你想获得一个长生命周期的context时,使用Application Context,例如当我们想要使用一个系统的服务时,这个系统服务的周期要比activity的生命周期长,如果我们使用getContext()的话,当activity销毁时,系统服务也就不能正常进行了,这时候我们就得使用getApplicationContext()
答案:
简单来说,就像它的名字(上下文)一样,他是项目当前的状态的一个标识,他可以让新创建出来,新加入进来的对象或组件知道当前项目的进度,处于一个什么状态,这样我们就可以容易理解上下文的意思了把,上文就是自己知道了之前项目已经处于一个什么样的状态,下文就是告诉后来的对象或者组件当前项目处于一个什么状态。
你可以通过getApplication()、getContext()、getBaseContext()或者this(在当前的Activity中时)来获取context上下文。
通常使用Context的地方:
创建一个新的对象时:
1.创建新的View、adapter、listener
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">TextView tv = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> TextView(getContext()); ListAdapter adapter = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> SimpleCursorAdapter(getApplicationContext(), ...);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
2.获取资源文件:例如 LAYOUT_INFLATER_SERVICE, SharedPreferences:
<code class="hljs delphi has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">context.getSystemService(LAYOUT_INFLATER_SERVICE) getApplicationContext().getSharedPreferences<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">(*name*, *mode*)</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
3.隐式访问组件
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">getApplicationContext().getContentResolver().query(uri, ...); </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
如果还不明白不用担心,现在我们开始翻译Context in Andorid – INSIGHT
Context大概是Android项目中最为常用的一个元素了
每个文档中都会有如下一句话:
“An android context is an interface to global information about an application environment”
意思是Android的context是一个沟通全局信息和程序环境的一个接口
当我找一些介绍context的文章时,我发现少之又少,所以我将我看到的一些文章做一个整理。
这里的接口不是java中接口interface的意思,这个接口就是连接的意思,连接两个组件。
更准确说它是一个代表了各种环境数据的实体。
android.content.context使resources(资源文件)、数据库、文件系统、activity、系统服务等组件之间有了可以访问的入口。
或者可以这样说:Context持有程序的状态、入口、权限、文件系统、等信息,并且是Activity、Service、Application等组件的父类。
在现实世界中我们可以这样描述Context:它就像一张门禁卡,通过这张门禁卡我们可以进入仓库、可以进入客厅、可以进入厨房获取我们想要的资源,这张门禁卡把几个分离的房间连接到一起了。
一个拥有门禁卡(Context)的人(Activity)可以获得各种系统的资源。
我们有3种方式可以获得context:
mContext = getApplicationContext();
这种方式获得的context是全局context,整个项目的生命中期中是唯一的且一直存在的,代表了所有activities的context
mContext = getContext()
这种方式获得的context当activity销毁时,context也会跟着销毁了
mContext = getBaseContext();
说实话我也没用过这种方式
何时使用getApplicationContext()或getContext()?
通过上面的分析我们知道了两个context一个是跟随activity的生命周期一个是跟随application的生命周期的。
因此,当你想获得一个长生命周期的context时,使用Application Context,例如当我们想要使用一个系统的服务时,这个系统服务的周期要比activity的生命周期长,如果我们使用getContext()的话,当activity销毁时,系统服务也就不能正常进行了,这时候我们就得使用getApplicationContext()
相关文章推荐
- ios、android开发入门事件处理的几种方式
- Android 开源项目源码解析 中 android-Ultra-Pull-To-Refresh 部分
- Android自定义Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)
- Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)
- android复习(二) Activity
- Android SupportDesign 只TabLayout使用详解
- android猜猜红桃A游戏源码
- android猜猜红桃A游戏源码
- android 请求服务器列表
- android判断EditText输入的数字、中文还是字母方法
- 解开Android应用程序组件Activity的"singleTask"之谜
- Android ProGuard 的作用、使用及bug分析
- Android Connectivity分析(1)- ConnectivityManager
- Android 屏幕适配相关的学习总结
- Android开发系列(十九个):至SimpleAdapter设置样式
- 【Android学习笔记】 碎片Fragment(1)
- [转]android 的injustdecodebounds
- Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读
- Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
- Android应用开发性能优化完全分析