我們做安卓開發(fā),時(shí)時(shí)都在和Context打交道,那么Context到底是什么?有什么作用?如何與Application,Activity,Service等實(shí)例發(fā)生聯(lián)系的?等等
Context是什么?
Context的字面意思是“上下文”,那么這個(gè)“上下文”到底指的是什么?“上”指的是什么?“下”指定的是什么?
個(gè)人的理解,有助于自己的理解的方式,不一定對,如果有更好的看法可以一塊交流學(xué)習(xí)。個(gè)人的理解,“上”指的是在APP啟動(dòng)的時(shí)候,就與Context有關(guān)了,這個(gè)時(shí)候還是系統(tǒng)啟動(dòng)階段,就與Context發(fā)生了聯(lián)系。
“下”指定的是在APP界面正常顯示出來以后,正常與用戶交互的過程中,可以用Context獲取資源,系統(tǒng)服務(wù)等。所以Context所謂的上下文就是承上啟下的作用。
Context的類的繼承關(guān)系
從上圖可以看到,Context只有一個(gè)實(shí)現(xiàn)類ContextImpl,Application,Service,Activity都是直接或者間接繼承了ContextWrapper,ContextWrapper中有一個(gè)變量mBase,也是個(gè)Context類型,實(shí)際是ContextImpl的對象,Application,Service,Activity所有的操作都是委托給了mBase實(shí)現(xiàn)。Context既然是承上啟下,是個(gè)上下文,和APP啟動(dòng)流程有關(guān),先來看看系統(tǒng)的啟動(dòng)流程和APP的啟動(dòng)流程,都在一張圖里,如下:
從上圖可以看到:
首先系統(tǒng)的第一個(gè)進(jìn)程 init跑起來,作一些初始化相關(guān)的工作,然后通過系統(tǒng)調(diào)用fork出了一個(gè)zygote進(jìn)程,init進(jìn)程通過poll阻塞在那了。
zygote進(jìn)程被init進(jìn)程fork出來以后,做一些jni初始化等,通過調(diào)用fork出了一個(gè)SystemServer進(jìn)程,SystemServer進(jìn)程里面跑的都是安卓的系統(tǒng)服務(wù),zygote通過jni調(diào)用java的代碼,fork出了SystemServer進(jìn)程,打開了java世界