寫在前面的話html
假設對Android開發還不是特別瞭解的同窗。可以參考我以前翻譯的Android開發教程。http://blog.csdn.net/column/details/development4android.html
java
軟件棧android
Applicationsweb
同一時候,Android框架定義和管理Android組件的生命週期和它們之間的通訊。數據庫
並且,Android框架定義了一系列Android特有的異步機制,包含HandlerThread。AsyncTask,IntentService,AsyncQueryHandler和Loaders。網絡
負責讓程序使用硬件功能,好比聲音,網絡。相機等。多線程
同一時候,負責管理進程和線程。架構
爲每一個程序開啓一個進程。每一個進程掌管一個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與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。對這個程序在系統中的優先級是有必定影響的。這裏所謂的優先級就是進程的優先級,這將影響一個程序被終止的概率和分配給這個程序中線程的運行時間。
按返回鍵或者調用finish()方法都會終止一個Activity的生命週期。
Service
Service是在後臺運行的。它是不可見的。和用戶之間也沒有不論什麼交互的。可以用來從其它組件卸載一些操做,這些操做比那些組件活的要長。一個Service可以用過兩種方式去運行,start或bind:
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。
參考資料