您的位置:首页 > 移动开发 > Android开发

android内核剖析 Context理解读书笔记

2015-08-31 22:14 501 查看
Context在Android开发中相当重要,也相当常见。

我们在Activity的开发过程当中,在需要用到Context的时候,一般都会使用this,比如在调用getResource的时候,我们其实是this.getResource

在Fragment的开发当中,我们一般需要context的时候,会调用getActivity()

但不同Activity的context得到的resources总是一份相同的

首先让我们来看看什么是Context



这里说了很清楚,context是一个关于应用环境的全局信息。它是一个抽象类,由android系统提供的。

这个抽象类定义了许多许多抽象方法,既然是一个抽象类,它一定有继承的类



我们可以看到,我们使用的Activity和Service都是context的子类,所以我们的Activity可以当作一个Context来使用

可我们刚才就发现了,所有Activity的getResource方法都能得到同一个Resource

这时候,让我们来看以下ContextWrapper这个类



从字面意思讲,warrper是外壳的意思

我们看到无论是ContextWarrper的构造方法还是attachBaseContext()方法都有传入一个base的context

然后它实现的抽象方法都其实是base实现的方法

那么新的问题又来了Base这个Context是哪来的,它又是干吗的?

其实很简单attachBaseContext()这个方法会传入一个ContextImpl对象,这个ContextImpl才是真正的实例化Context对象,contextWapper只是引用了ContextImpl

而ContextImpl中的重要对象PackageInfo又是由Ams传给本地,所以所有的context都指向同一份PackageInfo

这个也解决了我们之前的问题,得到的resources总是同一份的。

得到了答案,让我们来看下大致的过程,看下contextImpl是如何赋值给contextWapper的



我们可以看到在创建一个Activity对象之后,创建了一个ContextImpl对象,然后把这个对象通过Activity的attch方法传给activity对象

然后



activity又调用attchBaseContext方法



其实这里我有一个不理解的地方,Context mBase这个成员变量在ContextWrapper中已经定义了一边,然后在ThemeWrapper中又定义了一遍,2个成员变量还都赋值了,不知道为什么要这么设计,望大神解释下

抛开刚刚的疑问,这种设计是一种很优先的设计思想,轻量级的类实现的方法其实指向的是重量级类对象对应的方法,而轻量级类可以实现多个,但是包含的重量级类却是同一个,这样可以帮助节约很大的开销
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: