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

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

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