android内核剖析 Context理解读书笔记
2015-08-31 22:14
501 查看
Context在Android开发中相当重要,也相当常见。
我们在Activity的开发过程当中,在需要用到Context的时候,一般都会使用this,比如在调用getResource的时候,我们其实是this.getResource
在Fragment的开发当中,我们一般需要context的时候,会调用getActivity()
但不同Activity的context得到的resources总是一份相同的
首先让我们来看看什么是Context
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/31/9154d9dcf8645d6ee60d77695e79c1a5)
这里说了很清楚,context是一个关于应用环境的全局信息。它是一个抽象类,由android系统提供的。
这个抽象类定义了许多许多抽象方法,既然是一个抽象类,它一定有继承的类
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/31/922dbff8fea6d3f8a58a39e2c8a17edd)
我们可以看到,我们使用的Activity和Service都是context的子类,所以我们的Activity可以当作一个Context来使用
可我们刚才就发现了,所有Activity的getResource方法都能得到同一个Resource
这时候,让我们来看以下ContextWrapper这个类
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/31/4f85e785e9fec4c7267053360dc620b6)
从字面意思讲,warrper是外壳的意思
我们看到无论是ContextWarrper的构造方法还是attachBaseContext()方法都有传入一个base的context
然后它实现的抽象方法都其实是base实现的方法
那么新的问题又来了Base这个Context是哪来的,它又是干吗的?
其实很简单attachBaseContext()这个方法会传入一个ContextImpl对象,这个ContextImpl才是真正的实例化Context对象,contextWapper只是引用了ContextImpl
而ContextImpl中的重要对象PackageInfo又是由Ams传给本地,所以所有的context都指向同一份PackageInfo
这个也解决了我们之前的问题,得到的resources总是同一份的。
得到了答案,让我们来看下大致的过程,看下contextImpl是如何赋值给contextWapper的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/31/78138a18ef706e202a517fcc4a740167)
我们可以看到在创建一个Activity对象之后,创建了一个ContextImpl对象,然后把这个对象通过Activity的attch方法传给activity对象
然后
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/31/ff99496ed115bd069b4289b74de7e0fb)
activity又调用attchBaseContext方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/31/4b5812adae6c349c57bdce3fa50b605c)
其实这里我有一个不理解的地方,Context mBase这个成员变量在ContextWrapper中已经定义了一边,然后在ThemeWrapper中又定义了一遍,2个成员变量还都赋值了,不知道为什么要这么设计,望大神解释下
抛开刚刚的疑问,这种设计是一种很优先的设计思想,轻量级的类实现的方法其实指向的是重量级类对象对应的方法,而轻量级类可以实现多个,但是包含的重量级类却是同一个,这样可以帮助节约很大的开销
我们在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个成员变量还都赋值了,不知道为什么要这么设计,望大神解释下
抛开刚刚的疑问,这种设计是一种很优先的设计思想,轻量级的类实现的方法其实指向的是重量级类对象对应的方法,而轻量级类可以实现多个,但是包含的重量级类却是同一个,这样可以帮助节约很大的开销
相关文章推荐
- eeyes总结
- android内核剖析 Framework 读书笔记
- Android Api Demos登顶之路(五十四)Service IsolateService Controller
- Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件
- Android学习之带图片的Button
- Android APK反编译详解(附图)
- Android layout属性大全
- 编写android HAL代码
- Android中的Drawable资源
- 【转载】Android设计中的.9.png
- Android画图demo
- Android中如何获取系统应用程序列表与AndroidManifest.xml信息
- android开发步步为营之72:右滑关闭Activity
- FrameLayout的使用——android开发之xml布局文件
- android传递数据方式3--通过剪切板传类
- android:layout_weight属性的工作原理
- 如何调试Android中的Sqlite数据
- android传递数据方式2--通过剪切板传数据
- xml文件解析并显示到Android手机 spinner的应用
- Android 笔记 5