標籤:android blog tar strong art http
http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html
Android Activity學習筆記——Activity的啟動和建立
最近學習Android相關知識,感覺僅僅瞭解Activity幾個生命週期函數基本上沒有任何意義的;
於是想深入瞭解一下Activity到底是怎麼一回事怎麼運行來的;裡面的東東真是叫個龐大;
現在只能簡單的瞭解其架構性的概念和流程;
一 Activity概念
Android的核心不是Application而是Activity,至少在我們開發的時候是這樣的;
Activity就是被用來進行與使用者互動和用來與android內部特性互動的組件,
在應用程式中用到的所有activity都需要在manifest.xml檔案中進行註冊;
那麼Activity又是怎樣一種組件,怎麼樣進行顯示互動的,一個activity執行個體是如何被管理和運行起來的,activity生命週期又是怎麼一回事。
二 Activity架構和管理結構
Activity管理的核心是AcitivityManagerService,是一個獨立的進程;
ActiveThread是每一個應用程式所在進程的主線程,迴圈的訊息處理;
ActiveThread與AcitivityManagerService的通訊是屬於處理序間通訊,使用binder機制;
三 Activity啟動過程
以啟動一個應用程式startActivity為例看一下代碼執行的大概流程:
可將其分為6個過程:
1 使用代理模式啟動到ActivityManagerService中執行;
2 建立ActivityRecord到mHistory記錄中;
3 通過socket通訊到Zgote相關類建立process;
4 通過ApplicatonThread與ActivityManagerService建立通訊;
5 ActivityManagerService通知ActiveThread啟動Activity的建立;
6 ActivityThread建立Activity加入到mActivities中並開始調度Activity執行;
請看:
並不是所有啟動一個Activity都是這樣的過程:一個應用程式中所有Activity只有一個ActivityThread屬於一個Process;
ActivityStack並不是每次都需要建立一個Stack來管理Activities;
下面看看adnroid系統中四個重要概念:
Application:由多個相關的鬆散的與使用者進行互動Activity組成,通常被打包成apk尾碼檔案中;
Activities:應用程式的主要組成部分,是應用程式的核心;
ActivityStack:將應用程式中開啟的Activity儲存在曆史棧中,按照棧的先進後出的原則;
Start Activity時入棧,返回時出棧;
Task:將一系列相關的Activity組合,完成某個應用程式完整操作;不管activity屬於哪
個Application的;
例如:寫資訊—調用—檔案管理,都屬於一個Task,但屬於兩個Application;
四 Activity啟動流程類結構分析1 ActivityService相關類
使用了Proxy代理模式:ActivityManagerProxy代理ActivityManagerService;
並為之提供了公用的提供者:IActivityManager;
2 Activity啟動
3 ActivityStack管理
ActivityStack建立並儲存系列建立的Activity執行個體,將其入棧管理mHistory;
4 ActivityThread
This manages the execution of the main thread in anapplication process,
scheduling and executing activities,broadcasts, and other operations on it as the activity manager requests.
是應用程式的主線程,訊息迴圈執行者;其中有很多的內部類來完成工作;
ActivityThread使用內部類:ApplicationThread與ActivityManagerService進行通訊,
ActivityThread將狀態變化傳遞控制用戶端Activity的狀態執行;
mActivities儲存由ActivityStack所建立的ActivityRecord相關執行個體引用;
藉助網上一些達人的總結以及自己結合代碼的分析,總結上述流程架構方面的東東;
可能並不一定準確或存在漏洞,懇請達人指點多謝;