一、一个应用程序包含多少个Context
应用程序有多少个Activity或者Service,就有多少个Context
二、Context相关类的继承关系
![](https://img-my.csdn.net/uploads/201302/15/1360903396_8280.png)
a.Context:
代表场景的一个抽象类
b.ContextWrapper:
Context的一个包装,构造函数中包含一个真正的Context引用,同时提attachBaseActivity函数为其指定一个真正的Context对象
c.ContextThemeWrapper:
内部包含主题相关的接口,即在AndroidManifest.xml中指定的android:theme
d.ContextImpl:
真正实现了Context中的所有函数,应用中调用的所以context方法均来自于此类
三、创建Context对象
i.Application对应的Context
a.程序启动时,Ams远程调用ActivityThread的bindApplication方法
![](https://img-my.csdn.net/uploads/201302/15/1360903426_5062.png)
b.然后调用handleBindApplication()
![](https://img-my.csdn.net/uploads/201302/15/1360903439_4125.png)
c.在
handleBindApplication中为AppBindData对象中的info域赋值,该info域的类型为LoadedApk,为ActivityThread类的全局对象,然后调用makeApplication方法获得ContextImpl
![](https://img-my.csdn.net/uploads/201302/15/1360903457_8936.png)
![](https://img-my.csdn.net/uploads/201302/15/1360903468_5121.png)
d.然后在makeApplication方法中通过init将该ContextImpl赋给data.info,进而使Application获得ContextImpl
![](https://img-my.csdn.net/uploads/201302/15/1360903481_4975.png)
ii.Activity对应的Context
a.启动Activity时,Ams通过IPC调用ActivityThread的scheduleLaunchActivity方法,该方法会创建ActivityRecord,ActivityThread使用其来管理Activity
![](https://img-my.csdn.net/uploads/201302/15/1360903496_3959.png)
b.接着调用handleLaunchActivity
![](https://img-my.csdn.net/uploads/201302/15/1360903509_4948.png)
C.接着调用performLaunchActivity
![](https://img-my.csdn.net/uploads/201302/15/1360903521_1025.png)
d.接着将contextImpl赋给packageinfo
![](https://img-my.csdn.net/uploads/201302/15/1360903538_9486.png)
iii.Service对应的Context
a.启动Service时,Ams首先通过IPC调用ActivityThread的scheduleCreateService方法
![](https://img-my.csdn.net/uploads/201302/15/1360903549_4720.png)
b.接着调用handleCreateService方法
![](https://img-my.csdn.net/uploads/201302/15/1360903564_9981.png)
c.在handleCreateService方法中同样将contextImpl赋给packageinfo
![](https://img-my.csdn.net/uploads/201302/15/1360903575_6599.png)