在閱讀SDK文檔和研究Activity這個概念時,我感覺到了在Android中若隱若現的Android自由無邊界這個設計意圖。Android的應用只是一個虛的概念,並沒有實際的入口,這個不像Window平台上的應用程序的概念,Android更多的是提供組件(Components)的概念。為什麼要虛化應用的概念?我想這個虛化就是自由無邊界設計意圖的直接體現。突出請求和服務,突出組件個體,弱化邊界,系統的各個組件可以自由的無邊界的交流,服務請求者直接發出請求,不論這個對象在何處和屬於誰的,組件是自由獨立的個體,一個應用程序可以直接請求使用其他的應用的的組件,這個是Android應用框架設計的核心理念,其他的一切都是在為這個核心理念服務。
讓程序員忽略應用的概念,甚至徹底的拋棄進程這樣的概念,程序員看到的就是一個一個的組件,應用程序員利用這些組件來架構成一個所謂的應用,那麼設計者首先要考慮的是什麼呢?我想應該是一個抽象的應用模型,在這個模型下產生概念和接口。
我們知道MicroSoft提出了Application,Windows的概念,有前景應用(Foreground Application)概念,MicroSoft的應用模型中用戶交互則完全交給了Window,各種界面的呈現都是屬於這個應用的是孤立的,應用程序之間的各個構成對象不能相互訪問,最多提供一個進程間通訊機制,那個也是應用程序層面的。雖然Microsoft後來也提出了組件,分布式組件等概念,但是這些不是根植在Windows系統中,而Android則是徹底的組件化思想構建,一開始的應用程序概念就是Activity,Service,Broadcast receivers,Content Provider,Intent,Task。這些概念體現了一個人機交互的模型本質:
界面呈現
發起請求,響應請求
內容交互
消息接收處理
Activity是Android應用的核心概念,簡而言之Activity為用戶交互管理者,有一個可視界面呈現,而Service跟Activity的區別是他在後台運行,沒有界面呈現。而Intent的意義是意圖,他在Android的概念空間中,代表消息,這個消息代表了請求的意圖。
Activity可以到處存在,提供服務,消除空間差別,Activity是一個獨立的個體,更能表現面向對象的實質。這個個體需要接受另外的個體的消息,可以隨時發起對另外一個個體的請求。個體是自由的,Android中你可以開始一個Activity,但是沒有權利消滅一個Activity,這是個體權利的體現,個體的消滅是由系統決定的,這個就是Android中Activity蘊含的人文意義。
Android提供給開發程序員的概念空間中Application只是一個松散的表征概念,沒有多少實質上的表征。在Android實際空間中看不到實際意義上的應用程序的概念,即使有一個叫Application的類,這個也就是個應用程序上下文狀態,是一個極度弱化的概念。Application只是一個空間范疇的概念,Application就是Activity,Service之類的組件上下文描述。Application並不是Android的核心概念,而Activity才是Android的核心概念。
從Android的SDK文檔中,我們知道一般情況Android應用程序是由以下四種組件構造而成的:Activity,Broadcast Intent Receiver,服務(Service),內容提供器(Content Provider)。我們可以使用下面的圖來表示一下Android的概念空間。這些組件依附於應用程序中,應用程序並不會一開始就建立起來,而是在這些組件建立起來後,需要運行時,才開始建立應用程序對象。
為什麼要從應用進程名稱開始?作為內核研究,我們還是回到問題的最本質處:不管Activity,Service等組件如何設計和運行,它要提供服務,就必須要依附在Linux的進程上,建立消息循環,組件才能夠真正的運作。Activity實例是如何Hosting在Linux進程上的?這個是我們首先想要弄明白的。
我們在的項目中看到android:process="string"這個定義。默認狀態下,Activity Manager Service在應用程序的第一個組件需要運行時將會為應用程序建立一個進程,而這個進程的名字就是android:process=”string”所指定,缺省的是應用程序包的名字。該進程一旦建立,後面的該應用的組件都將運行在該進程中,他們綁定的根據就是這個Android:Process指定的名稱,因為在他們都在同一個應用程序包裡,也就具有了同樣的進程名字,於是他們都托管在了同一進程中。組件將通過ClassLoader從Package中獲取到應用程序的信息。
在建立Actvitiy時,如果在應用進程端沒有應用對象,系統在該過程中利用makeApplication建立一個Application對象,實例化"android.app.Application",建立一個應用程序上下文完成例如資源,package等信息管理。