国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
Android核心分析(21)----Android應(yīng)用框架之AndroidApplication
Android Application
    Android提供給開發(fā)程序員的概念空間中Application只是一個松散的表征概念,沒有多少實質(zhì)上的表征。在Android實際空間中看不到實際意義上的應(yīng)用程序的概念,即使有一個叫Application的類,這個也就是個應(yīng)用程序上下文狀態(tài),是一個極度弱化的概念。Application只是一個空間范疇的概念,Application就是Activity,Service之類的組件上下文描述。Application并不是Android的核心概念,而Activity才是Android的核心概念。
    從Android的SDK文檔中,我們知道一般情況Android應(yīng)用程序是由以下四種組件構(gòu)造而成的:Activity,Broadcast Intent Receiver,服務(wù)(Service),內(nèi)容提供器(Content Provider)。我們可以使用下面的圖來表示一下Android的概念空間。這些組件依附于應(yīng)用程序中,應(yīng)用程序并不會一開始就建立起來,而是在這些組件建立起來后,需要運(yùn)行時,才開始建立應(yīng)用程序?qū)ο蟆?/div>
 
2.1應(yīng)用進(jìn)程名稱
    為什么要從應(yīng)用進(jìn)程名稱開始?作為內(nèi)核研究,我們還是回到問題的最本質(zhì)處:不管Activity,Service等組件如何設(shè)計和運(yùn)行,它要提供服務(wù),就必須要依附在Linux的進(jìn)程上,建立消息循環(huán),組件才能夠真正的運(yùn)作。Activity實例是如何Hosting在Linux進(jìn)程上的?這個是我們首先想要弄明白的。
我們在的項目中看到android:process="string"這個定義。
allowClearUserData=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:label="string resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme" >
    . . .

在SDK用已經(jīng)描述的很清楚到了。
android:process
The name of a process where all components of the application should run. Each component can override this default by setting its own process attribute.
By default, Android creates a process for an application when the first of its components needs to run. All components then run in that process. The name of the default process matches the package name set by the element.
By setting this attribute to a process name that's shared with another application, you can arrange for components of both applications to run in the same process — but only if the two applications also share a user ID and be signed with the same certificate.
為什么要提出這么一個定義?android:process名稱。
    默認(rèn)狀態(tài)下,Activity Manager Service在應(yīng)用程序的第一個組件需要運(yùn)行時將會為應(yīng)用程序建立一個進(jìn)程,而這個進(jìn)程的名字就是android:process=”string”所指定,缺省的是應(yīng)用程序包的名字。該進(jìn)程一旦建立,后面的該應(yīng)用的組件都將運(yùn)行在該進(jìn)程中,他們綁定的根據(jù)就是這個Android:Process指定的名稱,因為在他們都在同一個應(yīng)用程序包里,也就具有了同樣的進(jìn)程名字,于是他們都托管在了同一進(jìn)程中。組件將通過ClassLoader從Package中獲取到應(yīng)用程序的信息。
    在建立Actvitiy時,如果在應(yīng)用進(jìn)程端沒有應(yīng)用對象,系統(tǒng)在該過程中利用makeApplication建立一個Application對象,實例化"android.app.Application",建立一個應(yīng)用程序上下文完成例如資源,package等信息管理。
2.2  ActivityThread運(yùn)行框架
    在分析中,我們可以看到真正對應(yīng)應(yīng)用進(jìn)程的不是Application而是ActivityThread。我們從實際的應(yīng)用堆棧可以看到:
NaiveStart.main()
        ZygoteInit.main
           ZygoteInit$MethodAndArgsCall.run
              Method.Invoke
                                       method.invokeNative
                     ActivityThread.main()
                         Looper.loop()
                                                                 ....
    每個應(yīng)用程序都以ActivityThread.main()為入口進(jìn)入到消息循環(huán)處理。對于一個進(jìn)程來講,我們需要這個閉合的處理框架。

    ActivitiyThread是應(yīng)用程序概念空間的重要概念,他建立了應(yīng)用進(jìn)程運(yùn)行的框架,并提供了一個IActivityThread接口作為與Activity Manager Service的通訊接口.通過該接口AMS可以將Activity的狀態(tài)變化傳遞到客戶端的Activity對象。
2.3 ActivitiyThread的建立
為了敘述的方便我將Actvitiy Manager Service簡寫成AMS。
    在AMS中關(guān)于應(yīng)用程序的概念是ProcessRecord,請求都是從Activity,Service…等開始的,在Activity需要Resume時,此時如果與Activity相關(guān)的應(yīng)用進(jìn)程沒有起來,AM則啟動應(yīng)用進(jìn)程。
AMS與應(yīng)用進(jìn)程的綁定分為兩個部分,第一部分就是AM建立應(yīng)用進(jìn)程,第二部分就是應(yīng)用進(jìn)程Attach到AM,與AM建立通訊通道。
1)創(chuàng)建建立進(jìn)程:startProcessLocked(processName,Appinfo.uid)。該函數(shù)在StartSecificActivityLocked等調(diào)用。
(1)建立ProcessRecord對象app,并將該對象添加到mProcessNames中。應(yīng)用對象在mProcessNames中使用應(yīng)用名字和uid來標(biāo)識自己。如果在同一個Package中的Activity,如果都使用默認(rèn)設(shè)置,那么這些Activity都會托管在同一個進(jìn)程中,這是因為他們在帶的ApplicationInfo中的ProcessName都是一樣的。
 

 

 
mPidsSelfLocked數(shù)組記錄了PID,這個將會在應(yīng)用進(jìn)程跑起來后,將自己Attach到AM時,根據(jù)pid找到自己的前世:ProcessRecord.
2)android.app.ActivityThread進(jìn)程啟動
     Android.app.ActivityThread進(jìn)程建立后,將跳入到ActivityThread的main函數(shù)開始運(yùn)行,進(jìn)入消息循環(huán)。
 
    應(yīng)用進(jìn)程使用thread.attach()發(fā)起AMS的AttachApplicationLocked調(diào)用,并傳遞 ActvitiyThread對象和CallingPid。AttachApplicationLocked將根據(jù)CallingPid在mPidsSelfLocked找到對應(yīng)的ProcessRecord實例app,將ActvitiyThread放置app.thread中。這樣應(yīng)用進(jìn)程和AMS建立起來雙向連接。AM可以使用AIDL接口,通過app.thread可以訪問應(yīng)用進(jìn)程的對象。
    應(yīng)用程序通過ActivityThread提供的框架,建立消息循環(huán)Looper和Handler。從前面的相關(guān)章節(jié)我們知道有Looper和Handler,整個系統(tǒng)就可以運(yùn)作了。
為了更為系統(tǒng)的了解應(yīng)用程序的建立時序及其涉及到數(shù)據(jù)操作,我給出了應(yīng)用進(jìn)程的建立過程示意圖:
 
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服