
先看Context的继承关系

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中
Instrumentation中


而Application的attach方法

Activity的创建(performLauchActivity())
ActivityThread中performLaunchActivity方法中

Activity的attach方法

handleCreateBackupAgent()


Service的创建(handleCreateService())

网友评论