Context,Service,Application,Activity的区别?_抽象类

Activity,Service,Application 关系图。 (课外)ContextWrapper和是一种装饰模式

1.        ContextWrapper就是一个包装类没有具体的实现,真的是逻辑代码都在ContextImpl中,ContextImpl继承自抽象类Context,并实现了其中的抽象方法。

2.        Context类是最上层的抽象类,在内部定义了大量的抽象方法,其startActivity方法也定义其中。

3.        Activity继承自ContextThemeWapper而ContextThemeWapper又继承自ContextWrapper,最终ContextWrapper才继承自Context。 切记在ContextWapper中是持有Context引用的,而这个Context其实就是ContextImpl也就持有ContextImpl对象。

Context,Service,Application,Activity的区别?_抽象方法_02

 那么ContextImpl是在何时被创建, 即在 ActivityThread中调用getHandler()方法这个方法返回了以一个H对象,Context,Service,Application,Activity的区别?_初始化_03

 在处理这段调用主要调用了handelLaunchActivity方法来处理没在这个方法中又调用了performLaunchActivity方法获取到了Activity的实例。

Context,Service,Application,Activity的区别?_抽象方法_04

 在performLaunchActivity中会对Activity进行大量的初始化参数。Context,Service,Application,Activity的区别?_初始化_05

 Context,Service,Application,Activity的区别?_android_06

 

并且可以看出Activity和Application,Context是密不可分的.

那么我们分析下createBaseContextForActivity是怎么初始化ContextImlp的,

Context,Service,Application,Activity的区别?_初始化_07

 在createBaseContextForActivity方法中通过ContextImpl的静态方法,createActivityContext方法获取到ContextImpl实例对象,并通过setOuterContext进行和Activity关联。

Context,Service,Application,Activity的区别?_初始化_08而Application中就比较简单了同过,markeApplication 创建了一个 Application而这个Application就贯穿全局了。

从此得出 Activity(个数)+Service(个数)+1个Application =Context个数。