每次介紹Android都會碰見的一張圖:java
從上至下:linux
System apps:
應用層,會使用到下一層的內容,即Core Java和Java Api Frameworkc++
Java Api framework:
控制Window系統,UI,Resources等,定義而且管理Android各個組件的生命週期以及組件之間的通信。包含了HandlerThread,AsyncTask,IntentService,AsyncQueryHandler,Loaders 等一系列異步類,用來簡化和管理Android線程。數據庫
Native Libraries:
c/c++庫,包含了 graphics, media, database, fonts, OpenGL, 等,一般app不會直接直接與這些庫交互,Java Api framework已經對其進行了封裝.網絡
Runtime:
Dalvik 或者 ART(Api19引入),沙盒機制,每一個app運行在單獨的Runtime,擁有獨佔的虛擬機.多線程
Linux kernel:
Linux內核管理sound, network, camera等驅動,使上層代碼能夠控制硬件,同時管理Linux 進程,每一個進程控制一個Runtime。內核會分配給每一個進程以及進程中包含的線程的運行時間。併發
Core Librarie:
核心java庫,基於jdk1.5,供Applications和Application framework使用,是Apache Harmony(已退役)實現的一個子集,並不徹底兼容Java SE和Java ME.它提供了基本的Java線程機制:包含了 java.lang.Thread 類和java.util.concurrent 包.app
Linux prosess:
Linux 屬於多用戶系統,每一個用戶分配一個Id(數字),系統根據這個Id追蹤用戶,每一個用戶擁有獲取自身私有資源的權限,除了root(linux中的超級用戶),其餘用戶沒法獲取該權限。在Android中,每一個app包擁有一個惟一的Id,對應了Linux中惟一的用戶Id。Android 其實是在Linux proecess中添加了一個Runtime,例如虛擬機(Davik/Art),具體關係:異步
默認狀況下,Application 和process是一一對應的的關係,特殊狀況下,一個Application能夠運行在多個prosess上,多個Application也能夠運行在一個process上。ui
Application 的生命週期:
應用的生命週期被封裝在了process中,Java 中用Application這個類做爲表明,Application對象在Runtime調用它的onCreate()方法時開始初始化,在Runtime調用它的onTerminate()方法時中止,Linux 內核有可能在Runtime調用Application的onTerminate()以前被殺死,Application會也當即被銷燬。Application在整個app的生命週期中是第一個被建立,最後一個被銷燬的。
Application的啓動順序:
任何組件均可以做爲Application啓動的入口,一旦第一個組件被觸發建立,Linux 進程就啓動了,Application也隨之初始化,簡化的順序:
1.啓動 Linux process
2.建立 Runtime
3.建立 Application 對象
4.建立 Application的入口組件
1.2兩個步驟是長時間的操做,因此若是每次都要執行這兩步的話,app的啓動時間確定會很長,體驗太差,所以,Android 爲了節約每次app的建立時間,在系統啓動的時候就建立了一個特殊的進程--Zygote(受精卵).Zygote擁有一些通用的預加載庫,新的app建立的時候,只要forkZygote進程,而不須要從新加載那些預加載庫,由於能夠共享這些核心庫,節省了大量的啓動時間和內存資源。
Application中止:
當系統內存資源緊缺的時候,系統會選擇中止某些app。由於用戶可能在任什麼時候候啓動app,因此爲了快速啓動app,即便app中的因此組件都被銷燬了,app也沒有徹底被系統殺死,除非系統缺乏資源,纔會考慮殺死某個app,但如何在多個app中選擇須要被殺死的app?Android引入了一個進程等級機制,等級高低取決於app組件的顯示和運行狀態。級別高到低:
Foreground:app有一個可見的組件,或者一個serviece被遠程的一個可見的Activity綁定,或者BroadcastReceiver正在運行。
Visible: app可見,但部分模糊
Service: Service運行在後臺,而且沒有被可見的組件綁定
Background: 不可見的Activity,大部分app都處於這種狀態
Empty: 空進程,沒有任何存活的組件,當系統回收資源時,最早被回收。
線程的引入:
Android設備都是多處理器的,能夠同時運行多個任務。若是一個app沒有併發運行就只能利用一個cpu,效率過低。其中的一個解決方法就是把任務放在多個進程中執行,可是多個進程必然佔用大量的資源,而且進程間的通信速度太慢,也沒有高效的異步運行機制,因此使用多線程是個很好的解決方法。由於Android只容許在UI線程更新ui,而Android的繪製是要求是16ms/幀,這樣人眼纔不會感受到卡頓,因此長時間的任務不能放在UI線程阻塞UI的渲染,而應該放在後臺線程去執行,這就須要用到多線程。長時間的任務一般包括如下幾個:
網絡請求
讀/寫文件
建立,刪除,更新數據庫中的數據
讀/寫 SharedPreferences
圖像處理
文本解析
Android提供了不少類幫助咱們簡化多線程的管理,並提供了Handler機制讓非UI線程與UI線程交互。
注:內容來自《Effecient Android Threading》