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對象。
那么ContextImpl是在何時(shí)被創(chuàng)建, 即在 ActivityThread中調(diào)用getHandler()方法這個(gè)方法返回了以一個(gè)H對象,
在處理這段調(diào)用主要調(diào)用了handelLaunchActivity方法來處理沒在這個(gè)方法中又調(diào)用了performLaunchActivity方法獲取到了Activity的實(shí)例。
在performLaunchActivity中會(huì)對Activity進(jìn)行大量的初始化參數(shù)。
并且可以看出Activity和Application,Context是密不可分的.
那么我們分析下createBaseContextForActivity是怎么初始化ContextImlp的,
在createBaseContextForActivity方法中通過ContextImpl的靜態(tài)方法,createActivityContext方法獲取到ContextImpl實(shí)例對象,并通過setOuterContext進(jìn)行和Activity關(guān)聯(lián)。
而Application中就比較簡單了同過,markeApplication 創(chuàng)建了一個(gè) Application而這個(gè)Application就貫穿全局了。
從此得出 Activity(個(gè)數(shù))+Service(個(gè)數(shù))+1個(gè)Application =Context個(gè)數(shù)。