Context源碼分析-創(chuàng)新互聯(lián)

Context是什么?

Context的字面意思是“上下文”,那么這個(gè)“上下文”到底指的是什么?“上”指的是什么?“下”指定的是什么?
個(gè)人的理解,有助于自己的理解的方式,不一定對(duì),如果有更好的看法可以一塊交流學(xué)習(xí)。個(gè)人的理解,“上”指的是在APP啟動(dòng)的時(shí)候,就與Context有關(guān)了,這個(gè)時(shí)候還是系統(tǒng)啟動(dòng)階段,就與Context發(fā)生了聯(lián)系。
“下”指定的是在APP界面正常顯示出來(lái)以后,正常與用戶交互的過(guò)程中,可以用Context獲取資源,系統(tǒng)服務(wù)等。所以Context所謂的上下文就是承上啟下的作用。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比沛縣網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式沛縣網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋沛縣地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
  1. Context的類的繼承關(guān)系
    從上圖可以看到,Context只有一個(gè)實(shí)現(xiàn)類ContextImpl,Application,Service,Activity都是直接或者間接繼承了ContextWrapper,ContextWrapper中有一個(gè)變量mBase,也是個(gè)Context類型,實(shí)際是ContextImpl的對(duì)象,Application,Service,Activity所有的操作都是委托給了mBase實(shí)現(xiàn)。

  2. Context既然是承上啟下,是個(gè)上下文,和APP啟動(dòng)流程有關(guān),先來(lái)看看系統(tǒng)的啟動(dòng)流程和APP的啟動(dòng)流程,都在一張圖里,如下:

從上圖可以看到:

  • 首先系統(tǒng)的第一個(gè)進(jìn)程 init跑起來(lái),作一些初始化相關(guān)的工作,然后通過(guò)系統(tǒng)調(diào)用fork出了一個(gè)zygote進(jìn)程,init進(jìn)程通過(guò)poll阻塞在那了。

  • zygote進(jìn)程被init進(jìn)程fork出來(lái)以后,做一些jni初始化等,通過(guò)調(diào)用fork出了一個(gè)SystemServer進(jìn)程,SystemServer進(jìn)程里面跑的都是安卓的系統(tǒng)服務(wù),zygote通過(guò)jni調(diào)用java的代碼,fork出了SystemServer進(jìn)程,打開(kāi)了java世界的大門(mén),自己通過(guò)sokcet監(jiān)聽(tīng)阻塞在那了,監(jiān)聽(tīng)來(lái)自socket的信息。

  • SystemServer進(jìn)程被fork出來(lái)以后,里面會(huì)開(kāi)啟非常多的系統(tǒng)服務(wù),比如AMS,PMS,WMS等,SystemServer進(jìn)程是一個(gè)非常重要的進(jìn)程,系統(tǒng)的很多重要的服務(wù)都駐留在此進(jìn)程中,SystemServer進(jìn)程是通過(guò)Handler機(jī)制阻塞在那了。等待發(fā)來(lái)的消息并處理消息。這樣整個(gè)系統(tǒng)就啟動(dòng)了。

  • 在PMS中,會(huì)啟動(dòng)Lanuher APP,用戶就可以看到安卓系統(tǒng)桌面了。如果用戶點(diǎn)擊了桌面上的QQ圖標(biāo),Lannuher進(jìn)程就會(huì)通過(guò)binder機(jī)制與AMS通信,告訴AMS要啟動(dòng)QQ應(yīng)用,AMS收到 Lanuher進(jìn)程發(fā)來(lái)的消息以后,通過(guò)socket發(fā)送信息給zygote進(jìn)程,我們知道zygote進(jìn)程在fork出了SystemServer進(jìn)程以后就一直在監(jiān)聽(tīng)著socket,所以zygote進(jìn)程收到SystemServer進(jìn)程發(fā)來(lái)的消息后,如果沒(méi)有創(chuàng)建過(guò)QQ進(jìn)程,這個(gè)時(shí)候,zygote就會(huì)調(diào)用fork系統(tǒng)調(diào)用創(chuàng)建一個(gè)新的進(jìn)程,用來(lái)跑QQ代碼,這個(gè)進(jìn)程就是QQ進(jìn)程,QQ App進(jìn)程創(chuàng)建以后第一個(gè)調(diào)用的就是Activity.main()方法,如上圖。

Context有什么作用?

1 訪問(wèn)當(dāng)前應(yīng)用的資源

  • getResources

  • getAssets

2 啟動(dòng)其它組件

  • Activity

  • Service

3 獲取系統(tǒng)服務(wù)

  • getSystemService

Application對(duì)象的ContextImpl對(duì)象創(chuàng)建過(guò)程

1 通過(guò)上面的系統(tǒng)啟動(dòng)流程和APP啟動(dòng)流程分析可知:第一個(gè)APP應(yīng)用都是由AMS通過(guò)binder機(jī)制創(chuàng)建一個(gè)新的進(jìn)程,然后調(diào)用ActivityThread類中的main方法開(kāi)始的。很多人可能會(huì)感到奇怪為啥Android也是基于Java實(shí)現(xiàn)的,為啥沒(méi)有看到main方法呢?其實(shí)整個(gè)App應(yīng)用的入口就是ActivityThread.main方法.所有有關(guān)Application, Activity,Service的創(chuàng)建都是在ActivityThread類中,其實(shí)該類就是我們App的主線程。在ActivityThread中有一個(gè)方法 performLaunchActivity()方法,在這個(gè)方法里面就創(chuàng)建了Application,Activity。我們看一下這個(gè)方法。
如下圖

調(diào)用mInstrumentation.newActivity()方法創(chuàng)建Activity。newActivity代碼如下圖

可以看到,創(chuàng)建Activity以后,調(diào)用了Activity的attach方法,第一個(gè)參數(shù)就是context,在這里Activity就和context發(fā)生了聯(lián)系,這個(gè)context其實(shí)就是ContextImpl的實(shí)例。接著上面的第一張圖 performLaunchActivity繼續(xù)往下走,如下圖:

通過(guò)上圖可以看到,在創(chuàng)建完了activity,并且調(diào)用了activity.attach()方法之后,開(kāi)始創(chuàng)建Application對(duì)象,如下

Application app = r.packageInfo.makeApplication(false,mInstrumentation)

makeApplication代碼如下:

隨后又創(chuàng)建了一個(gè)ContextImpl的實(shí)例,代碼如下

//創(chuàng)建ContextImpl實(shí)例ContextImpl appContext = new ContextImpl();//初始化ContextImpl實(shí)例appContext.init(this,null,mActivityThread);//把a(bǔ)ppContext傳給了newApplication方法app = mActivityThread.mInstrumentation.newApplication(cl,appClass,appContext);//與Application發(fā)生聯(lián)系,ContextImpl實(shí)例保存了Application的實(shí)例appappContext.setOuterContext(app);

mActivityThread.mAllApplication.add(app);
mApplication = app;

下面看下newApplicaiton()方法,代碼如下:

static public Application newApplication(Class<?> clazz,Context context){    //通過(guò)反射創(chuàng)建Application實(shí)例
    Application app = (Application)clazz.newInstance();    //把上面?zhèn)鬟M(jìn)來(lái)的ContextImpl實(shí)例通過(guò)attach方法保存了起來(lái)
    app.attach(context);    //返回Application實(shí)例
    return app;
}

創(chuàng)建完Application并且通過(guò)調(diào)用application實(shí)例的attach方法與ContextImpl實(shí)例發(fā)生了聯(lián)系,接下來(lái)就應(yīng)該調(diào)用application的onCreate()方法了。代碼如下:

public void callApplicationOnCreate(Application app){    //調(diào)用Application的onCreate方法
    app.onCreate();
}

創(chuàng)建了activity,也創(chuàng)建了application并且調(diào)用了application的attach和onCreate方法,接下來(lái)應(yīng)該調(diào)用activity的onCreate方法了。還是在performLanucherActivity方法中。如下圖:

如上圖,通過(guò)mInstructation的callActivityOnCreate()方法調(diào)用activity的onCreate()。這段代碼和調(diào)用application的onCreate()方法的邏輯類似,自己可以看一下。這里不再帖出代碼

*** 通過(guò)上面的分析可以知道,Context是什么時(shí)候創(chuàng)建的,是怎么創(chuàng)建的,何時(shí)初始化的,如何與Application和Activity發(fā)生聯(lián)系的等 ***

Application的生命周期為什么這么長(zhǎng)?

我們知道,Application的生命周期是和APP進(jìn)程一樣長(zhǎng)的,Application對(duì)應(yīng)的context也是一樣,為什么Application的生命周期為什么這么長(zhǎng)?

通過(guò)上面的分析可以知道,APP進(jìn)程的入口是ActivityThread.main()方法,在這個(gè)方法中創(chuàng)建了一個(gè)ActivityThread的實(shí)例,通過(guò)Handler阻塞在那。ActivityThread的實(shí)例就會(huì)一直存在,如果APP不退出的話,而ActivityThread的實(shí)例中保存了application的mAllApplications,這是一個(gè)數(shù)組,保存Application實(shí)例的,在創(chuàng)建Application實(shí)例的時(shí)候,通過(guò)mActivityThread.mAllApplications.add(app),把a(bǔ)pp保存起來(lái)了,通過(guò)強(qiáng)引用可以知道,ActivityThread引用了application實(shí)例,而ActivityThread實(shí)例又在進(jìn)程的循環(huán)中,一直在阻塞,所以Application的生命周期和進(jìn)程一樣。

Context的用法注意

下面以一張圖來(lái)說(shuō)明幾種Context的不同點(diǎn)和用法。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁(yè)標(biāo)題:Context源碼分析-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://muchs.cn/article8/coedop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google用戶體驗(yàn)、網(wǎng)站制作虛擬主機(jī)、微信小程序、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)