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個數。