Android之Context理解篇

文章链接:http://blog.csdn.net/qq_16628781/article/details/68928198

知识点:

  1. Context的简介;
  2. Context的子类和作用;
  3. Context的作用域;
  4. getApplication()和getApplicationContext()区别;
  5. Context引起的内存泄漏问题;
  6. 新名词记录{ContextWrapper:Context的包装类;ContextImpl:Context的主要功能实现类;ContextThemeWrapper:activity继承的Context类,包含activity的主题样式;}

概览

Activity activity = new Activity() 能不能这样做?

Android应用模型是基于组件的应用设计模式,组件的运行要有一个完整的Android工程环境,在这个环境下,Activity、Service等系统组件才能够正常工作,而这些组件并不能采用普通的Java对象创建方式,new一下就能创建实例了,而是要有它们各自的上下文环境,也就是我们这里讨论的Context。

Context翻译为:语境; 上下文; 背景; 环境,在开发中我们经常说称之为“上下文”,那么这个“上下文”到底是指什么意思呢?在程序中,可以理解为当前对象在程序中所处的一个环境,一个与系统交互的过程。比如微信聊天,此时的“环境”是指聊天的界面以及相关的数据请求与传输,Context在加载资源、启动Activity、获取系统服务、创建View等操作都要参与。

一个应用程序可以认为是一个工作环境,用户在这个环境中会切换到不同的场景。在不同的环境中,我们所做的事情也会有所不同。比如程序猿在座位上可能就是写代码,然后到了会议室工作就是开会撕逼了,在领导办公室那就要汇报工作了。那么程序猿就可以说是一个应用程序,其中分了好多个页面,需要写代码、开会和汇报工作。

QUOT:源码中的注释是这么来解释Context的:Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。就是说,它描述一个应用程序环境的信息(即上下文);是一个抽象类,Android提供了该抽象类的具体实现类;通过它我们可以获取应用程序的资源和类(包括应用级别操作,如启动Activity,发广播,接受Intent等)。

Context类是一个abstract抽象类,它有两个具体的实现子类:ContextImpl 和 ContextWrapper。

ContextWrapper类:是context的包装类,利用attachBaseContext()方法可以为ContextWrapper对象指定真正的context对象。

ContextThemeWrapper类:包含了与主题相关的接口。因为只有activity才需要主题。

Service和Application不需要没有用户界面,不需要主题,所以service继承自ContextWrapper。

ContextImpl类:实现了Context中的所以函数,应用程序中所调用的各种Context类的方法,其实现均来自于该类。

总结:Context的两个子类分工明确,其中ContextImpl是Context的具体实现类,ContextWrapper是Context的包装类。

所以,在应用中,Context数量=Activity数量+Service数量+1。说明:Broadcast Receiver,Content Provider这几个所用到的context都是从其他地方传入的,所以并不计入Context总数。

context的作用:

new 组件,例如Button btn = new Button(context);

得到系统服务:conteext.getSystemService(Context.AUDIO_SERVICE);

得到存储空间:context.getSharedPreferences(name, mode);

查询数据库:context.getContentResolver().query(uri, …);

启动activity:context.startActivity(intent);

启动service:context.startService(intent);

发送广播:context.sendBroadcast(intent);

不适用情况

比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。

getApplication()和getApplicationContext()

实际上,这两个方法获取到的都是同一个对象,可以打印一下他们的内存地址,是指向同一个地址的。区别是:getApplication()方法是用来获取Application实例的,此只有在Activity和Service中才能调用的到。大多数情况,我们都会使用到这个方法。

那么getApplicationContext()方法呢?用在其它场景,在例如是广播BroadcastReceiver类中,我们想获取到Application,就需要用到此方法。

引用context引起的内存泄漏问题

如果context被一个长于它本身的对象引用了,那么当需要释放该context时,因为还有对象引用它,GC就不会去进行回收,从而造成内存泄漏。具体的内存泄漏请参看常见的内存泄漏。只要我们正确的理解和使用context,就能够更好的使用它。毕竟在Android开发中,它是无所不在的一个对象。


总结

context类很重要,context类很重要,context类很重要,希望大家可以好好地去理解。不要因为context太常用而忽视了它的存在。

如有任何问题,请及时与我联系。谢谢。

更多相关文章

  1. Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
  2. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  3. 环境搭建安卓开发频解说
  4. Eclipse配置Android开发环境
  5. android之MediaPalyer
  6. Android(安卓)中Intent的putExtra()方法的值传递
  7. android调用springmvc写的restful
  8. PC安卓模拟器PANIC: Could not open:C:\Documents and Settings
  9. Android架构组件-ViewModel

随机推荐

  1. Android使用https链接
  2. Android绘制平面上的多边形
  3. android 雨松开发大合集
  4. Android控件属性全解
  5. Android(安卓)Studio导入第三方库报错处
  6. android hosts
  7. Android获取app应用程序大小的方法
  8. 解决打开Android(安卓)SDK Manager时出现
  9. Android(安卓)面试之某些公司的面试题
  10. Android(安卓)对话框 (二)ProgressDialog