天天看點

Android應用架構之Activity

上一篇部落格介紹了<code>application</code>和<code>activitythread</code>,今天來講一下android中最為重要的一個元件,<code>activity</code>。

一個應用程式通常由多個<code>activity</code>組成,那麼在應用程式中肯定需要一個容器來盛放這些<code>activity</code>,必要時通過該容器找到對應的<code>activity</code>,并進行相關操作。上一篇文章已經講過一個應用程式對應一個<code>activitythread</code>,是以自然而然地該容器是<code>activitythread</code>在負責維護,這個容器叫做<code>mactivities</code>,是一個數組,裡面的每一項叫做<code>activityrecord</code>,一個<code>activityrecord</code>對應一個<code>activity</code>。以上僅僅是應用級别的管理容器,但是很多場景下,系統需要找到某一個特定的<code>activity</code>,并下發相關資料比如事件分發。是以還必須在系統層面再維護一個容器,這個容器存放在<code>activity manager service</code>,對應的容器叫做<code>mhistory</code>,對應的每一項叫做<code>histroyrecord</code>。

每個<code>activity</code>必須依靠在程序中,每個程序對應一個ams中的<code>processrecord</code>,通過這個<code>processrecord</code>可以找到對應的應用的所有<code>activity</code>,同時還提供了與<code>activity</code>聯系的接口<code>iactivitythread</code>。是以整個<code>activity</code>的管理架構如下圖所示:

Android應用架構之Activity

在launch activity時,ams将對應的historyrecord作為token傳遞到客服端和客服端的activity建立聯系。在ams中activity狀态變化時,将通過該聯系找到客服端的activity,進而将消息或者動作傳遞應用程式面對的接口:xxxactivity。整個<code>activity</code>的啟動過程大緻可以分為以下幾個步驟:

發起<code>startactivity(intent)</code>請求

ams接收到請求後,建立一個<code>histroyrecord</code>對象,并将該對象放到<code>mhistory</code>數組中

調用<code>app.thread.schedulelaunchactivity()</code>

ams建立<code>activityrecord</code>對象,将建立的<code>activity</code>放入到<code>activityrecord</code>,再将其放入到<code>mactivities</code>

發起<code>activity</code>的<code>oncreate()</code>方法

對應的步驟如下圖所示:

Android應用架構之Activity

繼續閱讀