由于Android系統(tǒng)本身是基于Linux 操作系統(tǒng),因此Android應(yīng)用程序也運行于Linux 環(huán)境中,它
們具有以下的特點:
?? 在默認情況下,每一個應(yīng)用程序運行于它們的Linux 進程中;
?? 每個進程具有自己的虛擬機(VM),所以每個應(yīng)用程序運行于獨立的環(huán)境中;
?? 在默認情況下,每一個應(yīng)用程序具有唯一的Linux用戶 ID。通過設(shè)置權(quán)限讓應(yīng)用程序只對用戶和應(yīng)用程
序本身可見,也有一些方法可以把它們暴露給其他的應(yīng)用程序。
應(yīng)用程序的組成部分
一般情況下,Android應(yīng)用程序由以下4 種組件構(gòu)成:
?? 活動(Activity);
?? 廣播接收器(BroadcastReceiver);
?? 服務(wù)(Service );
?? 內(nèi)容提供者(Content Provider )。
一個Android應(yīng)用程序是一個包(Package),包中可能包含一個或者多個Android組件(component )
(1)活動(Activity)
活動是最基本的Android應(yīng)用程序組件,在應(yīng)用程序中,一個活動通常就是一個單獨的用戶界面。每一個
活動都被實現(xiàn)為一個獨立的類,并且從活動(Activity)基類中繼承而來,活動類將會顯示由視圖(View)控 件組成的用戶接口,并對事件(Event)做出響應(yīng)。大多數(shù)的應(yīng)用程序都會有多個用戶界面,因此便會有多個相
應(yīng)的活動。
Android 的一個活動一般對應(yīng)界面中的一個屏幕顯示,可以理解成一個界面,每一個活動在界面上可以包
含按鈕、文本框等多種可視的UI元素。
(2)廣播接收器(BroadcastReceiver)
廣播接收器用于讓應(yīng)用程序?qū)σ粋€外部事件做出響應(yīng)。例如:電話呼入事件、數(shù)據(jù)網(wǎng)絡(luò)可用通知或者到了
晚上時進行通知。
(3)服務(wù)(Service)
一個服務(wù)是一個具有一段較長生命周期但沒有用戶界面的程序。例如:一個正在從播放列表中播放歌曲的
媒體播放器在后臺運行。
(4)內(nèi)容提供者(Content Provider)
應(yīng)用程序能夠?qū)⑺鼈兊臄?shù)據(jù)保存到文件或SQLite 數(shù)據(jù)庫中,甚至是任何有效的設(shè)備中。當需要將數(shù)據(jù)與其
他的應(yīng)用共享時,內(nèi)容提供者將會很有用。一個內(nèi)容提供者類實現(xiàn)了一組標準的方法,從而能夠讓其他應(yīng)用程序
保存或讀取此內(nèi)容提供者處理的各種數(shù)據(jù)類型。
應(yīng)用程序的生命周期
(1)前臺(Foreground)進程
(2)可見(Visible )進程
(3)服務(wù)(Service)進程
(4)后臺(Background)進程
(5)空(Empty)進程
(1)前臺(Foreground)進程
與用戶當前正在做的事情密切相關(guān),不同的應(yīng)用程序組件能夠通過不同的方法使它的宿主進程移到前臺。當下面任何一個條件滿足時,都可以考慮將進程移到前臺。
?? 進程正在屏幕的最前端運行一個與用戶交互的Activity(它的 onResume() 方法被調(diào)用);
?? 進程有一個正在運行的BroadcastReceiver(它的BroadcastReceiver.onReceive()方法正在執(zhí)行);
?? 進程有一個Service ,并且在 Service 的某個方法(Service.onCreate()、Service.onStart() 或者Service.onDestroy())內(nèi)有正在執(zhí)行的代碼。
(2)可見(Visible )進程
它有一個可以被用戶從屏幕上看到的Activity,但不在前臺——其 onPause()方法被調(diào)用。例如:如果前臺
的Activity是一個對話框,以前的Activity隱藏在對話框之后,就可能出現(xiàn)這種進程。這樣的進程很重要,一
般不允許被殺死,除非為了保證前臺進程的運行不得不這樣做。
(3)服務(wù)(Service)進程
有一個已經(jīng)用startService()方法啟動的Service,雖然這些進程用戶無法直接看到,但它們做的事情卻是用
戶所關(guān)心的(例如:后臺MP3 回放或后臺網(wǎng)絡(luò)數(shù)據(jù)的上傳/ 下載)。因此,系統(tǒng)將一直運行這些進程,除非內(nèi)
存不足以維持所有的前臺進程和可見進程。
(4)后臺(Background )進程
擁有一個當前用戶看不到的Activity(它的onStop() 方法被調(diào)用),這些進程對用戶體驗沒有直接的影響。
如果它們正確執(zhí)行了Activity生命周期,系統(tǒng)可以在任意時刻殺死進程來回收內(nèi)存,并提供給前面3 種類型的
進程使用。系統(tǒng)中通常有很多這樣的進程在運行,因此要將這些進程保存在LRU 列表中,以確保當內(nèi)存不足
時用戶最近看到的進程最后一個被殺死。
(5)空(Empty )進程
不包含任何處于活動狀態(tài)的應(yīng)用程序組件。保留這種進程的唯一原因是,當下次應(yīng)用程序的某個組件需要
運行時,不需要重新創(chuàng)建進程,這樣可以提高啟動速度。
以上所說的“進程”是從系統(tǒng)運行的角度考慮的,各種不同的進程可以理解成Android的各種組件的不同
狀態(tài)機(state machine )。如果從應(yīng)用程序的代碼以及運行情況考慮,可以關(guān)注 Android的各種組件相對應(yīng)的生命周期
1 . 活動的生命周期
2 . 服務(wù)的生命周期
3 . 廣播接收器的生命周期
1 . 活動的生命周期
活動是Android 中最重要、最基礎(chǔ)的組件,用戶在界面上看到的一個個可以切換的屏幕界面就是Android
中的活動。活動的生命周期如圖1 所示。
?? 運行活動的情景:當一個活動被啟動時,活動中的onCreate()、onStart() 和onResume() 這3 個方法被依次調(diào)用,活動對應(yīng)的界面出現(xiàn)在屏幕上。
?? 活動被“覆蓋”的情景:Android的活動一般都占據(jù)一個完整的屏幕,從當前活動啟動另外一個活動時,另
一個活動將被啟動到前臺(Foreground ),當前活動轉(zhuǎn)入后臺(Background ),這時活動的 onPasuse()方法將
被調(diào)用,活動轉(zhuǎn)入后臺運行。如果活動變?yōu)椴豢梢�,還將調(diào)用onStop()方法。在轉(zhuǎn)入后臺時,onStop()是否
被調(diào)用取決于活動是否被完全覆蓋,在新的活動有透明部分時,轉(zhuǎn)入后臺的活動依然“可見”,其他情況下
(較多數(shù)的情況)活動均進入不可見狀態(tài)(被完全覆蓋)。
?? 活動被恢復(fù)的情景:當界面上最前面的活動退出后,它所覆蓋的活動將被恢復(fù),這時onResume() 方法將被
調(diào)用,活動重新轉(zhuǎn)入前臺運行。
?? 活動完全退出的情景:當使用回退(Back)按鈕退出活動時,onDestroy() 方法將被調(diào)用,活動關(guān)閉。如果
系統(tǒng)缺少內(nèi)存時,也會殺死(kill)后臺的活動,其中優(yōu)先殺死不可見的活動,可見的活動一般不會被殺死。
2 . 服務(wù)的生命周期
服務(wù)可以長時間運行,它的特點是沒有可視化界面,服務(wù)的生命周期如圖2 所示
使用StartService 運行服務(wù)的情景:使用這種方法啟動服務(wù),服務(wù)的onCreate()和onStart() 這兩個方法將被調(diào)用,服務(wù)會在后臺運行直到退出,退出時將調(diào)用onDestroy() 方法。
使用bindService 運行服務(wù)的情景:使用這種方法啟動服務(wù),調(diào)用者(也就是服務(wù)的客戶端)將獲得和服務(wù)
交互的類,通過其調(diào)用時服務(wù)的相關(guān)內(nèi)容會處于活動狀態(tài)。
3 . 廣播接收器的生命周期
廣播接收器有一個單一的回調(diào)方法onReceive() ,當廣播消息到達接收器時,Android將調(diào)用這個方法,并
傳遞給包含在這個消息中的Intent 對象。
廣播接收器只有在這個方法的執(zhí)行過程中才處于活動狀態(tài),當 onReceive() 返回后,廣播接收器將不再處于
活動狀態(tài)。廣播接收器的功能類似于一個回調(diào)函數(shù),只是單次運行時處于活動狀態(tài)。
Android的工程編譯
在編譯Android應(yīng)用程序的過程中,Java 源代碼使用Sun JDK 將Java 源程序編譯成Java 字節(jié)碼文件(多
個后綴名為.class 的文件),這一步驟和標準的Java 一致,然后通過Android自帶的工具軟件dex 把所有的字
節(jié)碼文件轉(zhuǎn)成dex 文件(單一文件classes.dex )。
AndroidManifest.xml 文件經(jīng)過Android打包工具(aapt )處理后形成二進制格式 AndroidManifest.xml 文件,實質(zhì)的內(nèi)容與以前相同。
各個資源文件也經(jīng)過aapt 處理,其中布局等文本文件處理成二進制文件,圖片等文件保持不變。
最后將這三個部分組合成一個應(yīng)用程序包(*.apk)。AndroidManifest.xml 描述文件、Java 源文件、資源文
件是Android應(yīng)用程序的三個部分;在編譯之前的工程中是這三個部分,在編譯之后APK包依然是由這三個部
分組成的。
如圖所示,Android源文件經(jīng)過了標準的Java 編譯器的編譯,又經(jīng)過了dx工具的處理,標準的Java 字節(jié)
碼作為整個Android編譯的中間過程,最終生成的dex 文件(classes.dex )是一個單一文件,將工程中所有的Java源代碼文件對應(yīng)的字節(jié)碼集成在一起。資源文件和AndroidManifest.xml 文件通過aapt 工具進行處理。
在運行時,APK包將首先進行“安裝”,也就是將其中的 dex 文件進行優(yōu)化,優(yōu)化后的文件被保存到緩存
區(qū)域,生成格式為 dey 的優(yōu)化文件,然后 Dalvik 虛擬機將運行這些dey 文件。如果應(yīng)用程序包文件不發(fā)生變化,dey 文件不會被重新生成;在應(yīng)用程序包發(fā)生更新的情況下,將重新由dex 生成dey。
Android和標準 JAVA 開發(fā)的JAR 包最大的不同在于,標準JAVA 字節(jié)碼是每個文件一個Clash文件,而
Android中的一個包將生成一個Dex 文件。
使用am工具啟動Android 應(yīng)用程序
除了在GUI 界面中啟動應(yīng)用程序之外,在 Android的命令行終端(可以使用 adb shell 進行連接)也可以使
用am 工具啟動應(yīng)用程序。
使用am 啟動應(yīng)用程序的格式如下所示:
# am start -n {包名}/{ 包名}.活動名
應(yīng)用程序開發(fā)的結(jié)構(gòu)
Android應(yīng)用程序開發(fā)是Android開發(fā)中最上面的一個層次,它們構(gòu)建在Android系統(tǒng)提供的API 之上。
Android應(yīng)用程序的基礎(chǔ)是Android提供的各個Java 類,這些類組成了Android系統(tǒng)級的API。

Android應(yīng)用程序可以基于兩種環(huán)境來開發(fā):Android SDK 和Android源代碼。Android系統(tǒng)本身內(nèi)置了一部分標準應(yīng)用(也包括內(nèi)容提供者),在仿真器(包括 SDK環(huán)境和源代碼環(huán)境)中已經(jīng)包含這些內(nèi)置的程序。 用戶自行開發(fā)的應(yīng)用程序和Android內(nèi)置的應(yīng)用層程序包位于同一個層次,都是基于Android框架層的API來構(gòu)建的,它們的區(qū)別僅僅在于他們是否被包含在默認的Android系統(tǒng)中。
Android目錄結(jié)構(gòu)
src : Java 源代碼文件
assets:主要放置多媒體等數(shù)據(jù)文件。
AndroidManifest.xml: 工程描述文件,相當于應(yīng)用的配置文件。在此文件里必須聲明應(yīng)用的名稱,應(yīng)用所用到的Activity,Service,Reveiver等。
可惜的是drawable目錄下不能分子級目錄,如果有這方面需求只能通過命名方法來加以區(qū)分。
每個猶序都會有一竢oidManifest在它的根目錄里面。這個清單為Android系統(tǒng)提供了這個應(yīng)用的基本信息,系統(tǒng)在運行之前必須知道這些信息,另外,如果我們使用系統(tǒng)自帶的服務(wù),如撥號服務(wù),應(yīng)用安裝服務(wù)等,都必須在AndroidManifest.xml文件中聲明權(quán)限 AndroidManifest.xml的功能: 命名應(yīng)用程序的Java應(yīng)用包,這個包名用來唯一標識應(yīng)用程序; 描述應(yīng)用程序的組件,對實現(xiàn)每個組件和公布其功能的類進行命名,這些聲明使得Android系統(tǒng)了解這些組件以及它們在什么條件下可以被啟動 決定哪個組件運行在哪個進程里面 聲明應(yīng)用程序必須具備的權(quán)限,用以訪問受保護的API,以及和其他進程的交互 聲明應(yīng)用程序其他的必備權(quán)限,用以組件之間的交互 列舉application所需要鏈接的庫 drawable-*dpi: 將圖標按分辨率的高低放入不同的目錄,其中draeable-hdpi用來存放高分辨率的圖標,drawable-mdpi用來存放中等分辨率的圖標,drawable-ldpi用來存放低分辨率的圖標
res :資源文件
| |
|
values文件夾:用來存放文字的信息
(1)strings.xml:用來定義字符串和數(shù)值
<?xml version="1.0"encoding="utf-8"?>
<resources>
<string >Hello World, Hello 3G</string>
<string >Android1.1</string>
<string >哥想你了</string>
<string >按鈕1</string>
<string >按鈕1</string>
</resources>
每個string標簽生命了一個字符串,name屬性指定它的引用值
(2)為什么要把這些出現(xiàn)的文字單獨放在strings.xml文件中?
答案:一是為了國際化,如果需要將文件中的文字換成別的國家的語言,就可以只需要替換掉一個strings.xml文件就可以了;二是為了減少應(yīng)用的體積,例如,我們要在應(yīng)用中使用“哥想你了”這句話1000次,如果我們沒有將“哥想你了”定義在strings.xml文件中,而是直接在應(yīng)用中使用時寫上這幾個字,那么我們就會在應(yīng)用中寫4000個字。4000個字和4個字占用的內(nèi)存可是有很大差距的啊,況且手機的內(nèi)存本來就小,所以應(yīng)該是能省就省 (3)另外還有arrays.xml,color.xml等定義數(shù)組,顏色的,都最好用單獨的一個xml文檔
layout文件:用來存放界面信息
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/test"/>
</LinearLayout>
<LinearLayout>元素:線性布局的意思,在該元素下的所有子元素都會根據(jù)他的”orientation”屬性來決定是按行還是按列或者按逐個顯示進行布局的
<TextView>元素:是一種顯示控件,他的”text”屬性指定了在這個元素上顯示的內(nèi)容
gen目錄:gen目錄下只有一個自動生成的“R.java”文件
R.java文件:默認有attr,drawable,layout,string這四個靜態(tài)內(nèi)部類,每個靜態(tài)內(nèi)部類對應(yīng)一中資源,如layout靜態(tài)內(nèi)部類對應(yīng)layout中的界面文件,string靜態(tài)內(nèi)部類對應(yīng)string內(nèi)部的string標簽。如果在layout中在增加一個界面文件或者在string內(nèi)增加一個string標簽,R.java會自動在其對應(yīng)的內(nèi)部類增加所增加的內(nèi)容。
R.java除了自動標識資源的索引功能外,還有另一個功能,就是當res文件中的某個資源在應(yīng)用中沒有被用到,在這個應(yīng)用被編譯時,系統(tǒng)不會把對應(yīng)的資源編譯到應(yīng)用中的APR包中。
可以參考:原文鏈接:http://blog.csdn.net/xy84928/article/details/7047419
<project.properties>應(yīng)用要求運行的最低Android版本
<android 2.2> 存放Android自身的jar包

android應(yīng)用程序的入口 android應(yīng)用程序中,并沒有像c++和java這樣有main函數(shù)來作為應(yīng)用程序的入口.android應(yīng)用程序提供的是入口Activity,而非入口函數(shù). 在eclipse中創(chuàng)建一個android應(yīng)用程序的時候,默認會創(chuàng)建一個Activity.這個Activity實際上就是入口Activity了.從哪里定義它是Activity呢?AndroidManifest.xml文件中定義了整個android應(yīng)用所包含的Activity.默認生成的Activity的定義為:
<activity android: android:label="@string/app_name">
<intent-filter>
<action android: />
<category android: />
</intent-filter>
</activity>
android應(yīng)用程序?qū)嶋H上是由多個Activity按照一定的次序拼裝起來的,只不過拼裝的過程中,后臺傳遞了一些數(shù)據(jù),使得各個Activity之間能比較好的銜接起來。
action節(jié)點中的android.intent.action.MAIN表明它所在的Activity是整個應(yīng)用程序的入口點.而category中的android.intent.category.LAUNCHER意思是把這個Activityg歸屬到加載器類,即把這個Activity標注為自動會加載和啟動的Activity,這樣程序啟動時候就先加載這個Activity了.
Android的UI系統(tǒng)實現(xiàn)1 控制和基本事件的響應(yīng)
2 鍵盤事件的響應(yīng)
3 運動事件的處理
4 屏幕間的跳轉(zhuǎn)和事件的傳遞
5 菜單的使用
6 彈出對話框
7 樣式的設(shè)置
Android UI 系統(tǒng)的知識結(jié)構(gòu)如下圖所示:
對于 一個GUI系統(tǒng)地使用,首先是由應(yīng)用程序來控制屏幕上元素的外觀和行為,這在各個 GUI 系統(tǒng)中是
不相同的,但是也具有相通性。Android系統(tǒng)在這方面,包含了基本的控件控制,鍵盤事件響應(yīng),窗口間跳轉(zhuǎn)、
對話框、菜單、樣式等內(nèi)容,這是GUI 系統(tǒng)所具有的通用內(nèi)容。
1 控件和基本事件的響應(yīng)
在任何一個GUI 系統(tǒng)中,控制界面上的控件(通常稱為控件)都是一個基本的內(nèi)容。對于 Android應(yīng)用程
序,控件稱為View。
在Android中,在處理UI中的各種元素的時候,兩個程序中的要點為:
?? 1.得到布局文件(XML)中的控件句柄
?? 2.設(shè)置控件的行為
1.1 事件響應(yīng)方法