【並行編程】系統體系結構和組件具體說明

寫在前面的話html

假設對Android開發還不是特別瞭解的同窗。可以參考我以前翻譯的Android開發教程。

http://blog.csdn.net/column/details/development4android.html
java

軟件棧android

The software stack in Android.

Applicationsweb

應用層。包含使用Java庫和Android框架所編寫的程序。

Core Java
Java類庫,並不是全然的Java SE或Java ME的實現。而是Apache Harmony的一個實現。基於Java5。這一層提供基礎的Java線程機制。包含java.lang.Thread類和java.util.concurrent包。
Application framework
Android框架層,主要負責處理窗體系統。UI組件,資源等。基本上,要編寫一個Android應用所需要的所有類都在這一層。

同一時候,Android框架定義和管理Android組件的生命週期和它們之間的通訊。數據庫

並且,Android框架定義了一系列Android特有的異步機制,包含HandlerThread。AsyncTask,IntentService,AsyncQueryHandler和Loaders。網絡

Native libraries
C/C++庫層,主要負責處理圖像。音視頻。數據庫,字體,OpenGL等。Java所編寫的程序並不直接和這一層交流,因爲Android框架已經對這些本地代碼進行了封裝。
Runtime
運行時環境。即Dalvik虛擬機。爲每一個Android應用程序提供了一個沙盒,Dalvik虛擬機運行.dex文件。每一個程序都運行在它專有的Dalvik虛擬機中。

Linux kernel
Linux內核,即潛在的操做系統。

負責讓程序使用硬件功能,好比聲音,網絡。相機等。多線程

同一時候,負責管理進程和線程。架構

爲每一個程序開啓一個進程。每一個進程掌管一個Dalvik虛擬機。app

在進程中。多線程運行程序的代碼。框架

Linux內核經過調度機制。爲進程和它們的線程分配可用的CPU運行時間。

程序架構

一個程序的基礎是Application對象以及Android的組件:Activity,Service。BroadcastReceiver和ContentProvider。

程序 Application

一個程序在Java中的表達方式就是android.app.Application對象。

當程序開啓的時候,這個對象被建立,程序中止時被銷燬。也就是說,Application對象經歷一個Linux進程的完整生命週期。

當Linux進程又一次開啓的時候,一個新的Application對象也被建立了。

組件

Android的組件包含Activity,BroadcastReceiver。Service和ContentProvider。

這些實體有不一樣的責任和生命週期,但它們都表明了程序的入口,也就是程序啓動的地方。

Intent

一個組件喚醒還有一個組件是經過Intent才幹實現的,這個過程可以發生在同一個程序中或多個程序之間。

Intent分爲顯式的和隱式的:

顯式的 Intent
定義一個組件的完整的名字,這個名字在運行時可以可以被程序識別。
隱式的 Intent
經過IntentFilter在運行時與組件綁定,需要在IntentFilter中定義一些「協議」。

假設Intent與IntentFilter中的「協議」匹配,那麼這個組件就會被啓動。

組件的生命週期是Android系統特定的技術,它們不與潛在的Java對象匹配。一個Java對象可以比它的組件存活的時間要久,並且。Dalvik虛擬機可以保存與一個組件的相應的多個對象。當心,這會致使內存泄漏。我會在後面對多線程形成的內存泄漏進行分析。

一般。實現一個組件的方式是子類化它。

並且。一個程序中所有的組件都要在AndroidManifest.xml中進行註冊。

Activity

一個Activity就是一個屏幕。一般佔領了設備的所有屏幕尺寸。它用來展現信息,處理用戶的輸入等。

包含所有的UI組件,好比button。文本框,圖片等。

Activity持有一個對所有視圖樹的對象引用。因此它佔領的內存會變的很是大。

當用戶在不一樣的屏幕之間導航的時候,Activity實例從一個棧裏面被初始化。當導航到一個新的屏幕時,一個新的Activity被壓入到棧裏,當返回到以前的屏幕時,Activity被從棧中彈出。

在如下的圖中,首先開啓了一個Activity A,接着切換到B。同一時候A銷燬;而後切換到C和D。A,B,C是全屏顯示的,但是D是窗體模式的,只佔領了屏幕的一部分空間。A全然被銷燬了,B是不可見的。C是部分可見的,D是所有可見的,並且D在棧頂。所以,D得到了焦點並且可以接收用戶的輸入。

Activity在棧裏面的位置,決定了Activity的狀態:

Activity stack.
  • 可見並且處於活躍狀態: D
  • 暫停並且部分可見: C
  • 中止並且全然不可見: B
  • 不可交互並且已經全然銷燬: A

一個程序中最頂端的Activity。對這個程序在系統中的優先級是有必定影響的。這裏所謂的優先級就是進程的優先級,這將影響一個程序被終止的概率和分配給這個程序中線程的運行時間。

按返回鍵或者調用finish()方法都會終止一個Activity的生命週期。

Service

Service是在後臺運行的。它是不可見的。和用戶之間也沒有不論什麼交互的。可以用來從其它組件卸載一些操做,這些操做比那些組件活的要長。一個Service可以用過兩種方式去運行,start或bind:

Started Service
經過調用Context.startService(Intent)開啓服務,這裏的Intent既可以是隱式的,也可以是顯式的。假設想要中止服務。調用 Context.stopService(Intent)。

Bound Service
經過調用Context.bindService(Intent, ServiceConnection, int),多個組件可以綁定同一個Service。這裏的Intent既可以是隱式的。也可以是顯式的。綁定以後。經過ServiceConnection接口與Service進行通訊。假設想要中止服務,調用 Context.unbindService(ServiceConnection)。當最後一個組件與Service解綁後,這個Service就會被銷燬。

ContentProvider

一個程序想要共享大量的數據。不管是在這個程序中。仍是多個程序之間,都可以使用ContentProvider。

它提供了獲取數據的入口。一般適合SQLite數據庫一塊兒使用。SQLite數據庫是對程序私有的,但是經過ContentProvider就可以實現進程之間的數據共享了。

BroadcastReceiver

它監遵從一個程序之中。程序之間,或系統發出的Intent。總而言之,就是它監聽手機中所有的Intent。而後過濾這些收到的Intent。肯定哪個需要被處理。

一個BroadcastReceiver應該動態註冊,也就是說註冊在需要使用它的地方。這樣可以對它進行控制。

假設靜態註冊在了AndroidManifest.xml中,那麼當這個程序在安裝的時候,它就一直在監聽Intent,不管這些Intent對它是否是實用。

如此一來。假設某一個Intent匹配了某一個IntentFilter,那麼這個BroadcastReceiver就會開啓與之關聯的程序。


這裏具體說一下,假設有一個程序A。在AndroidManifest.xml中註冊了一個監聽網絡變化的BroadcastReceiver。

此時,A沒有被打開,也就是說此時系統中並無A的進程。

當系統的網絡發生變化時,因爲這個BroadcastReceiver的存在,A的進程被建立了。A相應的Application對象也就隨之被建立了!

因爲BroadcastReceiver被認定是進入一個app的入口。這樣的入口還包含Activity。Service和ContentProvider。


參考資料

http://developer.android.com/guide/components/index.html

相關文章
相關標籤/搜索