这次我用自己的话,分析了context
2018-05-03 本文已影响0人
Fakecoder_Sunis
![](https://img.haomeiwen.com/i11754331/bf0d1469d80bdb1d.jpeg)
先看Context的继承关系
![](https://img.haomeiwen.com/i11754331/62298fe9660d5922.png)
ContextWrapper直接继承了Context,但是它只是一个包装类,ContextWrapper中必须包含一个Context引用,而ContextWrapper的attachBaseContext()方法正是用于指定这个真正的Context对象。
ContextThemeWrapper类包含了与theme相关的接口。
所以Activity需要继承ContextThemeWrapper,而Service直接继承ContextWrapper(因为其不需要界面)。
ContextImpl是真正实现了Context所有方法,应用中调用context的方法,实际上均调用的ContextImpl类的实现
Context的创建
前面说过,Activity实际就是一个context,而Activity又基于ContextWrapper,ContextWrapper必须制定一个真正的Context对象,而真正实现了Context的是ContextImpl。
下面来看ContextImpl怎么创建并调用attachBaseContext()方法的。
ActivityThread中有下面几处出具体创建了ContextImpl
PackInfo.makeApplication()
performLauchActivity()
handleCreateBackupAgent()
handleCreateService()
handleBindApplication()
attach()方法
Application的创建(PackInfo.makeApplication()):
ActivityThread中多出调用makeApplication方法,而该方法在LoadedApk.java中![](https://img.haomeiwen.com/i11754331/41c3f899afe3164b.png)
Instrumentation中
![](https://img.haomeiwen.com/i11754331/54e870f2f005f96a.png)
![](https://img.haomeiwen.com/i11754331/4bd8b1fa1135a019.png)
而Application的attach方法
![](https://img.haomeiwen.com/i11754331/848d4676d7fd3e36.png)
Activity的创建(performLauchActivity())
ActivityThread中performLaunchActivity方法中![](https://img.haomeiwen.com/i11754331/ee7ddb2e4641196f.png)
![](https://img.haomeiwen.com/i11754331/a21666e0ab854bfb.png)
Activity的attach方法
![](https://img.haomeiwen.com/i11754331/bb00b33ac7b566ee.png)
handleCreateBackupAgent()
![](https://img.haomeiwen.com/i11754331/a21abe89b536e352.png)
![](https://img.haomeiwen.com/i11754331/1e952edc60b5068d.png)
Service的创建(handleCreateService())
![](https://img.haomeiwen.com/i11754331/ca18d72cd5c90e98.png)