Context,Service,Application,Activity的區(qū)別?_抽象類

Activity,Service,Application 關(guān)系圖。 (課外)ContextWrapper和是一種裝飾模式

1.        ContextWrapper就是一個(gè)包裝類沒有具體的實(shí)現(xiàn),真的是邏輯代碼都在ContextImpl中,ContextImpl繼承自抽象類Context,并實(shí)現(xiàn)了其中的抽象方法。

2.        Context類是最上層的抽象類,在內(nèi)部定義了大量的抽象方法,其startActivity方法也定義其中。

3.        Activity繼承自ContextThemeWapper而ContextThemeWapper又繼承自ContextWrapper,最終ContextWrapper才繼承自Context。 切記在ContextWapper中是持有Context引用的,而這個(gè)Context其實(shí)就是ContextImpl也就持有ContextImpl對象。

Context,Service,Application,Activity的區(qū)別?_抽象方法_02

 那么ContextImpl是在何時(shí)被創(chuàng)建, 即在 ActivityThread中調(diào)用getHandler()方法這個(gè)方法返回了以一個(gè)H對象,Context,Service,Application,Activity的區(qū)別?_初始化_03

 在處理這段調(diào)用主要調(diào)用了handelLaunchActivity方法來處理沒在這個(gè)方法中又調(diào)用了performLaunchActivity方法獲取到了Activity的實(shí)例。

Context,Service,Application,Activity的區(qū)別?_抽象方法_04

 在performLaunchActivity中會(huì)對Activity進(jìn)行大量的初始化參數(shù)。Context,Service,Application,Activity的區(qū)別?_初始化_05

 Context,Service,Application,Activity的區(qū)別?_android_06

 

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

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

Context,Service,Application,Activity的區(qū)別?_初始化_07

 在createBaseContextForActivity方法中通過ContextImpl的靜態(tài)方法,createActivityContext方法獲取到ContextImpl實(shí)例對象,并通過setOuterContext進(jìn)行和Activity關(guān)聯(lián)。

Context,Service,Application,Activity的區(qū)別?_初始化_08而Application中就比較簡單了同過,markeApplication 創(chuàng)建了一個(gè) Application而這個(gè)Application就貫穿全局了。

從此得出 Activity(個(gè)數(shù))+Service(個(gè)數(shù))+1個(gè)Application =Context個(gè)數(shù)。