<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    常用鏈接

    統(tǒng)計

    最新評論

    (轉(zhuǎn))Android核心分析(21)----Android應(yīng)用框架之AndroidApplication

    From  http://blog.csdn.net/maxleng/archive/2010/05/24/5621345.aspx

    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īng)用程序?qū)ο蟆?/font>

    image

    2.1應(yīng)用進程名稱

        為什么要從應(yīng)用進程名稱開始?作為內(nèi)核研究,我們還是回到問題的最本質(zhì)處:不管Activity,Service等組件如何設(shè)計和運行,它要提供服務(wù),就必須要依附在Linux的進程上,建立消息循環(huán),組件才能夠真正的運作。Activity實例是如何Hosting在Linux進程上的?這個是我們首先想要弄明白的。

    我們在項目中看到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名稱。

        默認狀態(tài)下,Activity Manager Service在應(yīng)用程序的第一個組件需要運行時將會為應(yīng)用程序建立一個進程,而這個進程的名字就是android:process=”string”所指定,缺省的是應(yīng)用程序包的名字。該進程一旦建立,后面的該應(yīng)用的組件都將運行在該進程中,他們綁定的根據(jù)就是這個Android:Process指定的名稱,因為在他們都在同一個應(yīng)用程序包里,也就具有了同樣的進程名字,于是他們都托管在了同一進程中。組件將通過ClassLoader從Package中獲取到應(yīng)用程序的信息。

        在建立Actvitiy時,如果在應(yīng)用進程端沒有應(yīng)用對象,系統(tǒng)在該過程中利用makeApplication建立一個Application對象,實例化"android.app.Application",建立一個應(yīng)用程序上下文完成例如資源,package等信息管理。

    2.2  ActivityThread運行框架

        在分析中,我們可以看到真正對應(yīng)應(yīng)用進程的不是Application而是ActivityThread。我們從實際的應(yīng)用堆??梢钥吹剑?/font>

    NaiveStart.main()

            ZygoteInit.main

               ZygoteInit$MethodAndArgsCall.run

                  Method.Invoke

                                           method.invokeNative

                         ActivityThread.main()

                             Looper.loop()

                                                                     ....

        每個應(yīng)用程序都以ActivityThread.main()為入口進入到消息循環(huán)處理。對于一個進程來講,我們需要這個閉合的處理框架。

    image

        ActivitiyThread是應(yīng)用程序概念空間的重要概念,他建立了應(yīng)用進程運行的框架,并提供了一個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)用進程沒有起來,AM則啟動應(yīng)用進程。

    AMS與應(yīng)用進程的綁定分為兩個部分,第一部分就是AM建立應(yīng)用進程,第二部分就是應(yīng)用進程Attach到AM,與AM建立通訊通道。

    1)創(chuàng)建建立進程:startProcessLocked(processName,Appinfo.uid)。該函數(shù)在StartSecificActivityLocked等調(diào)用。

    (1)建立ProcessRecord對象app,并將該對象添加到mProcessNames中。應(yīng)用對象在mProcessNames中使用應(yīng)用名字和uid來標識自己。如果在同一個Package中的Activity,如果都使用默認設(shè)置,那么這些Activity都會托管在同一個進程中,這是因為他們在帶的ApplicationInfo中的ProcessName都是一樣的。

    image 

    image

    mPidsSelfLocked數(shù)組記錄了PID,這個將會在應(yīng)用進程跑起來后,將自己Attach到AM時,根據(jù)pid找到自己的前世:ProcessRecord.

    2)android.app.ActivityThread進程啟動

         Android.app.ActivityThread進程建立后,將跳入到ActivityThread的main函數(shù)開始運行,進入消息循環(huán)。image

        應(yīng)用進程使用thread.attach()發(fā)起AMS的AttachApplicationLocked調(diào)用,并傳遞 ActvitiyThread對象和CallingPid。AttachApplicationLocked將根據(jù)CallingPid在mPidsSelfLocked找到對應(yīng)的ProcessRecord實例app,將ActvitiyThread放置app.thread中。這樣應(yīng)用進程和AMS建立起來雙向連接。AM可以使用AIDL接口,通過app.thread可以訪問應(yīng)用進程的對象。

        應(yīng)用程序通過ActivityThread提供的框架,建立消息循環(huán)Looper和Handler。從前面的相關(guān)章節(jié)我們知道有Looper和Handler,整個系統(tǒng)就可以運作了。

    為了更為系統(tǒng)的了解應(yīng)用程序的建立時序及其涉及到數(shù)據(jù)操作,我給出了應(yīng)用進程的建立過程示意圖:

     image

    posted on 2010-09-25 15:38 九寶 閱讀(746) 評論(0)  編輯  收藏 所屬分類: android

    主站蜘蛛池模板: 韩国免费a级作爱片无码| 亚洲gay片在线gv网站| 黄页免费在线观看| 亚洲人色婷婷成人网站在线观看| 成年免费a级毛片| 亚洲裸男gv网站| 91免费福利视频| 亚洲高清视频在线观看| 国产好大好硬好爽免费不卡| 久久亚洲精品AB无码播放| 在线看片免费人成视频福利| 久久精品亚洲中文字幕无码网站| 男人j进入女人j内部免费网站| 亚洲国产天堂在线观看| 成人黄色免费网址| 亚洲精品无码av片| 亚洲国产成人久久精品99 | 1000部啪啪未满十八勿入免费| 777亚洲精品乱码久久久久久 | 无码国产精品一区二区免费模式| 亚洲高清在线视频| 亚洲人成电影网站免费| 国产偷国产偷亚洲高清在线| 亚洲欧洲日产国码一级毛片| 国产精品免费AV片在线观看| 亚洲人成网男女大片在线播放| 国产真实伦在线视频免费观看| 精品一区二区三区高清免费观看| 国产亚洲色婷婷久久99精品| 国产精彩免费视频| 美女羞羞喷液视频免费| 亚洲av永久无码精品古装片| 欧洲黑大粗无码免费| 日本特黄特色AAA大片免费| 久久亚洲国产精品成人AV秋霞| 女人被免费视频网站| 三年片免费观看大全国语| 亚洲国产日韩在线| 亚洲日韩人妻第一页| 精品香蕉在线观看免费| 免费一级做a爰片久久毛片潮|