先看Context的继承关系
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中 image.pngInstrumentation中 image.png
image.png
而Application的attach方法 image.png
Activity的创建(performLauchActivity())
ActivityThread中performLaunchActivity方法中 image.png image.pngActivity的attach方法 image.png
handleCreateBackupAgent()
handleCreateBackupAgent()方法中BackupAgent的attach方法
网友评论