Android基礎(chǔ)知識(shí)詳解_第1頁(yè)
Android基礎(chǔ)知識(shí)詳解_第2頁(yè)
Android基礎(chǔ)知識(shí)詳解_第3頁(yè)
Android基礎(chǔ)知識(shí)詳解_第4頁(yè)
Android基礎(chǔ)知識(shí)詳解_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android基礎(chǔ)知識(shí)詳解

wuliming

wuliming_sc@

wuliming_sc@

QQ:44384992

2010.08

參考書目

相關(guān)書籍推薦(Android)

AndroidAndroid

應(yīng)用開發(fā)揭秘系統(tǒng)原理及開發(fā)要點(diǎn)詳解

MH99.■

目錄

參考書目2

目錄3

Android的系統(tǒng)架構(gòu)6

?、應(yīng)用程序6

二、應(yīng)用程序框架6

三、AndroidRuntime7

四、系統(tǒng)庫(kù)7

五、Linux內(nèi)核8

Webkit瀏覽器引擎簡(jiǎn)介9

Dalvik虛擬機(jī)簡(jiǎn)介11

什么是Dalvik虛擬機(jī)11

Dalvik和Android系統(tǒng)11

Dalvik虛擬機(jī)的主要特征12

Android應(yīng)用開發(fā)和Dalvik虛擬機(jī)14

Activity生命周期16

一、Activity^戔16

二、Activity的4種狀態(tài)16

三、Activity的生命周期17

四、實(shí)例說(shuō)明18

Android控件的繼承關(guān)系22

一、View與ViewGroup關(guān)系22

二、各控件的繼承關(guān)系23

界面布局25

LinearLayout(線性布局)25

TableLayout(表格布局)28

RelativeLayout(相對(duì)布局)31

AbsoluteLayout(絕對(duì)布局)33

FrameLayout(框架布局)34

Toast35

Notification37

對(duì)話框41

一、帶三個(gè)按鈕的對(duì)話框41

二、簡(jiǎn)單列表對(duì)話框、單選列表對(duì)話框、多選列表對(duì)話框42

三、水平進(jìn)度對(duì)話框和圓形進(jìn)度對(duì)話框46

四、自定義對(duì)話框48

Menu菜單51

選項(xiàng)菜單51

上下文菜單52

三、子菜單53

4種響應(yīng)菜單項(xiàng)單擊事件的方式55

顯示和編輯文本的控件56

TextView56

CheckedTextView59

EditText59

ExtraEditText60

AutoComplteteTextView^MuItiAutoCompleteTextView(自動(dòng)完成輸入內(nèi)容)60

Button62

ImageButton63

ZoomButton64

日期和時(shí)間控件64

DatePicker>TimePicker64

AnalogClock>DigitalClock66

單選框、復(fù)選框、開關(guān)狀態(tài)按鈕67

單項(xiàng)選擇(RadioGroup、RadioButton)67

復(fù)選框(CheckBox)69

開關(guān)狀態(tài)按鈕(ToggleButton)71

下拉列表框Spinner72

ScrollViewNHorizontalScrollView75

垂直滾動(dòng)(ScrollView)75

水平滾動(dòng)(HorizontalScrollView)76

兩個(gè)方向均可滾動(dòng)76

TabHost77

ProgressBar>SeekBar、RatingBar79

進(jìn)度條(ProgressBar)79

拖動(dòng)條(SeekBar)81

評(píng)分組件(RatingBar)84

GridView^Gallery和ImageSwitcher86

GridView86

Gallery和ImageSwitcher89

ListView92

一、普通的ListView92

可以單選和多選的ListView94

使用SimpleAdapter建立復(fù)雜的列表項(xiàng)96

自定義Adapter來(lái)建立復(fù)雜的列表項(xiàng)98

動(dòng)態(tài)添加、刪除ListView列表項(xiàng)101

改變ListView列表項(xiàng)選中狀態(tài)的背景顏色101

可展開的列表組件101

數(shù)據(jù)的存取102

SharePreferences6.1102

文件的存儲(chǔ)6.2102

SQLite數(shù)據(jù)庫(kù)6.4102

ContentProvider>ContentResolver6.5104

Intent105

用Intent啟動(dòng)Activity,并在Activity之間傳遞數(shù)據(jù)105

調(diào)用其他應(yīng)用程序中的Activity(打電話、瀏覽網(wǎng)頁(yè)、發(fā)Email等)108

接收和發(fā)送廣播112

接收系統(tǒng)廣播112

在自己的應(yīng)用程序中發(fā)送廣播116

Android服務(wù)117

系統(tǒng)服務(wù)8.2117

時(shí)間服務(wù)8.3117

跨進(jìn)程訪問(wèn)8.4117

網(wǎng)絡(luò)118

圖形、音頻、視頻119

圖形10.1119

音頻、視頻10.2119

2D動(dòng)畫120

幀動(dòng)畫120

補(bǔ)間動(dòng)畫120

OpenGLES編程121

Android支持的各種資源122

窗口小部件(AppWidget)123

NDK編程124

Android的系統(tǒng)架構(gòu)

Android的系統(tǒng)架構(gòu)和其操作系統(tǒng)一樣,采用了分層的架構(gòu)。從架構(gòu)圖看,android分為四個(gè)層,從上層到低層分別是應(yīng)用程

序?qū)?、?yīng)用程序框架層、Android運(yùn)行時(shí)和庫(kù)、linux內(nèi)核:

APPLICATIONS

HomeContactsPhoneBrowser

APPLICATIONFRAMEWORK

WindowContentView

ActivityManager

ManagerProvidersSystem

TelephonyResourceLocationNotificabon

PackageManager

ManagerManagerManagerManager

LIBRARIESANDROIDRUNTIME

.Media

SurfaceManagerSQLiteCoreLibraries

Framework

DaMkVirtua!

OpenGL|ESFreeTypeWebKit

Machine

LINUXKERNEL.

DisplayCameraDriverFlishMemoryBinder(IPC)

DriverDriver

AudioPower

KeypadDriverWiFiDriver

DriversManagement

一、應(yīng)用程序

Android會(huì)同一系列核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括電子郵件,短信,日歷,地圖,瀏覽器,聯(lián)系人管理程序

等。所有的應(yīng)用程序都是使用JAVA語(yǔ)言編寫的。當(dāng)然,你也可以自己用自己編寫的應(yīng)用程序來(lái)替換Android提供的應(yīng)用程

序。

二、應(yīng)用程序框架

應(yīng)用程序框架是我們進(jìn)行Android開發(fā)的基礎(chǔ),開發(fā)人員大部分情況下也是在和應(yīng)用程序框架層打交道。應(yīng)用程序框架層包

括了活動(dòng)管理器、窗口管理器、內(nèi)容提供器、視圖系統(tǒng)、包管理器、電話管理器、資源管理器、位置管理器、通知管理器九

大部分,如上圖所示。各部分的具體功能如下:

活動(dòng)管理器(ActivityManager):活動(dòng)管理器用來(lái)管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能

窗口管理器(WindowManager):管理所有的窗口程序

內(nèi)容提供器(ContentProviders):內(nèi)容提供器使得應(yīng)用程序可以訪問(wèn)另一個(gè)應(yīng)用程序的數(shù)據(jù),或者共享出它自己的數(shù)據(jù)

視圖系統(tǒng)(ViewSystem):豐富而又可擴(kuò)展的各種視圖,是構(gòu)建應(yīng)用程序的基本組件。它包括列表,網(wǎng)格,文本框,按鈕,

甚至是可嵌入的web瀏覽器等等

包管理器(PackageManager):Android系統(tǒng)內(nèi)的程序管理

電話管理器(TelephonyManager):用來(lái)管理所有的移動(dòng)設(shè)備的功能

資源管理器(ResourceManager):提供各種資源讓應(yīng)用程序去使用,比如本地化字符串、圖片、布局文件、視頻文件等等

位置管理器(LocationManager):用來(lái)提供位置服務(wù)

通知管理器(NotifcationManager):使應(yīng)用程序可以在狀態(tài)欄中顯示警告信息。狀態(tài)欄通常在手機(jī)的頂部,短信、郵件等的

提示信息就會(huì)出現(xiàn)在這里

在Android平臺(tái)上,開發(fā)人員可以完全訪問(wèn)核心應(yīng)用程序所使用的API框架。并且,任何一個(gè)應(yīng)用程序都可以發(fā)布自身的功

能模塊,而其他應(yīng)用程序則可以使用這些已發(fā)布的功能模塊?;谶@樣的重用機(jī)制,用戶就可以方便地替換平臺(tái)本身的各種

應(yīng)用程序組件。

三、AndroidRuntime

Android運(yùn)行時(shí)包括核心庫(kù)和Dalvik虛擬機(jī)兩部分,這兩部分的具體功能如下所示:

核心庫(kù):核心庫(kù)包含兩部分內(nèi)容:一部分為絕大多數(shù)java語(yǔ)言所需要調(diào)用的功能函數(shù),另一部分為Android的核心庫(kù),比如

android.os、、android.media等等。與標(biāo)準(zhǔn)java不一樣的是,每個(gè)Android應(yīng)用程序都有一個(gè)自有的進(jìn)程,Android

不是用一個(gè)Dalvik虛擬機(jī)來(lái)同時(shí)執(zhí)行多個(gè)Android應(yīng)用程序,而是每個(gè)Android應(yīng)用程序都用一個(gè)自有的Dalvik虛擬機(jī)來(lái)執(zhí)

行。

Dalvik虛擬機(jī):Dalvik是一種基于寄存器的java虛擬機(jī),Dalvik虛擬機(jī)主要是完成對(duì)象生命周期的管理,堆棧的管理,線程

管理,安全和異常的管理,以及垃圾回收等等重要功能?;诩拇嫫鞯奶摂M機(jī)的一個(gè)優(yōu)點(diǎn)就是所需要的資源相對(duì)較少,用硬

件實(shí)現(xiàn)虛擬機(jī)比較容易一些。Dalvik虛擬機(jī)是專門為移動(dòng)設(shè)備設(shè)計(jì)的,它在開發(fā)的時(shí)候就考慮到用最少的內(nèi)存資源來(lái)執(zhí)行,

以及支持同時(shí)執(zhí)行多個(gè)虛擬機(jī)的特性。Dalvik虛擬機(jī)所執(zhí)行的中間碼并非是java虛擬機(jī)所執(zhí)行的java字節(jié)碼,而是依靠轉(zhuǎn)換

工具dx將java字節(jié)碼轉(zhuǎn)換成.dex格式由虛擬機(jī)執(zhí)行。Dalvik虛擬機(jī)與java虛擬機(jī)最大的不同在于java虛擬機(jī)基于棧,而D

alvik基于寄存器。

四、系統(tǒng)庫(kù)

系統(tǒng)庫(kù)各部分功能如下所示:

SurfaceManager:對(duì)顯示子系統(tǒng)進(jìn)行管理,并且為多個(gè)應(yīng)用程序提供了2D和3D圖層的無(wú)縫融合

媒體庫(kù):基于PacketVideoOpenCORE;該庫(kù)支持多種常用的音頻、視頻格式回放和錄制,同時(shí)支持靜態(tài)圖像文件。編碼格式

包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG

SQLite:一個(gè)對(duì)于所有應(yīng)用程序可用,功能強(qiáng)勁的輕量級(jí)關(guān)系型數(shù)據(jù)庫(kù)引擎

OpenGLES:Android是依據(jù)OpenGLES1.0API標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)其3D繪圖函數(shù)庫(kù)的,該函數(shù)庫(kù)可以用軟件方式執(zhí)行,也可以

用硬件加速方式執(zhí)行,其中3D軟件光柵處理方面已進(jìn)行高度優(yōu)化

FreeType:提供點(diǎn)陣字、向量字的描繪顯示

WebKit:*ekbit是一個(gè)開源的\Web瀏覽器引擎。Apple的Safari,Google的Chrome,NokiaS60平臺(tái)的默認(rèn)瀏覽器,Apple手機(jī)

和Android手機(jī)的默認(rèn)瀏覽器,都采用的是Webkit作為瀏覽器的引擎。另外兩個(gè)瀏覽器引擎分別是Gecko和Trident,大名

鼎鼎的Firefox便是使用的Gecko,而微軟的IE系列則使用的是Trident。WebKit引擎比其它引擎更受程序員歡迎的原因,

除了其引擎的高效穩(wěn)定,兼容性好外,其源碼結(jié)構(gòu)清晰,易于維護(hù),是一個(gè)很重要的原因。近年來(lái),google的加入更是讓

VCebkit有所升溫,從GooleChrome瀏覽器,GooleAnroid手機(jī)操作系統(tǒng)內(nèi)置瀏覽器均采用Webkit作為內(nèi)核。

SGL:2D繪圖方面的繪圖引擎

Libc:一個(gè)從BSD繼承來(lái)的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(kù)(libc),它是專門為基于embeddedlinux的設(shè)備定制的

SSL:

五、Linux內(nèi)核

Android的核心系統(tǒng)服務(wù)依賴于Linux2.6內(nèi)核,如安全性,內(nèi)存管理,進(jìn)程管理,網(wǎng)絡(luò)協(xié)議棧和驅(qū)動(dòng)模型。Linux內(nèi)核也

同時(shí)作為硬件和軟件棧之間的抽象層。Linux內(nèi)核中包含如下一些驅(qū)動(dòng):顯示驅(qū)動(dòng)、攝像頭驅(qū)動(dòng)、flash內(nèi)存驅(qū)動(dòng)、Binder(IP

C)驅(qū)動(dòng)、鍵盤驅(qū)動(dòng)、Wifi驅(qū)動(dòng)、Audio驅(qū)動(dòng)、電源管理等等

WebKit簡(jiǎn)介參照其它總結(jié)材料

Dalvik虛擬機(jī)簡(jiǎn)介參照其它總結(jié)材料

Webkit瀏覽器引擎簡(jiǎn)介

bk,K5.com/jyli/archivc/20IO/0"31/l66O355,htmJ

什么是Webkit

Wekbit是一個(gè)開源的Web瀏覽器引擎。Apple的Safari,Google的Chrome,NokiaS60平臺(tái)的默認(rèn)瀏覽器,Apple手機(jī)和Android

手機(jī)的默認(rèn)瀏覽器,都采用的是Webkit作為瀏覽器的引擎。另外兩個(gè)瀏覽器引擎分別是Gecko和Trident,大名鼎鼎的Firefox

便是使用的Gecko,而微軟的IE系列則使用的是Trident。WebKit引擎比其它引擎更受程序員歡迎的原因,除了其引擎的高

效穩(wěn)定,兼容性好外,其源碼結(jié)構(gòu)清晰,易于維護(hù),是一個(gè)很重要的原因。近年來(lái),印。水:的加入更是讓W(xué)ebkit有所升溫,

從GooleChrome瀏覽器,GooleAnroid手機(jī)操作系統(tǒng)內(nèi)置瀏覽器均采用Webkit作為內(nèi)核。

Wekbit做了什么?

作為瀏覽器的內(nèi)核,Webkit做了哪些工作?為了了解這些,先讓我們來(lái)看下一個(gè)Web瀏覽器究竟做了什么。我們可以從輸

入輸出的角度來(lái)看一個(gè)Web瀏覽器為我們做了哪些工作。先看一個(gè)簡(jiǎn)單的例子,Web瀏覽器的輸入是一個(gè)HTML文檔,輸

出則是一個(gè)我們用眼睛所看到的一個(gè)Web頁(yè)面,就普通用戶而言它的輸入和輸出就是這么簡(jiǎn)單,如下圖所示:

InputOutput

G3?:::*1*

dw?c>

cllM“?ptitevV.-

iMvIO'4U*>

<41V

<3

salfMmamgf

xar2?an*.

8.?MTuaM?-Ufft

M.???*<?<)

2,」."tr>i

M.W1MC::??::'->;

<,EI2

</?!?>

WebBrowser

那么W’ebkit的輸入和輸出又是什么呢?如果能明白這個(gè),那我們就能很清楚的知道Webkit到底是做什么的了。不過(guò)現(xiàn)在要

說(shuō)清楚這個(gè)還有點(diǎn)困難,因?yàn)閃tbkit的輸出就要復(fù)雜些了,因?yàn)樗妮敵霰緛?lái)就非直接面向用戶,簡(jiǎn)單點(diǎn)來(lái)說(shuō),Webkit的

輸入是web文檔,輸出是一些看不見(jiàn)的模型,瀏覽器上層借助于這些模型來(lái)繪制出我們所看到的實(shí)際頁(yè)面。

Webkit組成

Webkit實(shí)際上包含三大部分,至少?gòu)拇a結(jié)構(gòu)上來(lái)說(shuō)是這樣的,當(dāng)然,如果細(xì)分的話還能夠劃分出更多的模塊。如下所示

Webkit

WebCoreJavaScriptCore

其中,WebCore是Webkit的核心部分,它實(shí)現(xiàn)了對(duì)文檔的模型化,包括了CSS,DOM,Render等的實(shí)現(xiàn);JavaSriptCore顯然

是對(duì)JavaSript支持的實(shí)現(xiàn)(WebCore和JSCorc來(lái)自于KDE項(xiàng)目的KHTML和KJS開源項(xiàng)目)。而橘黃色標(biāo)注的Webkit部分包

含了很多不同平臺(tái)對(duì)Webkit封裝的實(shí)現(xiàn),即抽象出了與瀏覽器所能直接對(duì)應(yīng)的一些概念的實(shí)現(xiàn),比如WebView,WebPage,

WebFrame等等。這三部分共同構(gòu)成了Webkit,在源碼中,它們分別對(duì)應(yīng)三個(gè)目錄,即Webkit三大部分為袋ebCoreJavaSript

Core,Webkit。

更多關(guān)于Webkit的介紹,搜索相關(guān)的資料…

Dalvik虛擬機(jī)簡(jiǎn)介

http:〃/article/show/15

什么是Dalvik虛擬機(jī)

Google于2007年底正式發(fā)布了AndroidSDK,作為Android系統(tǒng)的重要特性,Dalvik虛擬機(jī)也第一次進(jìn)入了人們的視野。它

對(duì)內(nèi)存的高效使用,和在低速CPU上表現(xiàn)出的高性能,確實(shí)令人刮目相看。依賴于底層Posix兼容的操作系統(tǒng),它可以簡(jiǎn)單

的完成進(jìn)程隔離和線程管理。每一個(gè)Android應(yīng)用在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解釋下

得以執(zhí)行。很多人認(rèn)為Dalvik虛擬機(jī)是一個(gè)Java虛擬機(jī),因?yàn)锳ndroid的編程語(yǔ)言恰恰就是Java語(yǔ)言。但是這種說(shuō)法并不

準(zhǔn)確,因?yàn)镈alvik虛擬機(jī)并不是按照J(rèn)ava虛擬機(jī)的規(guī)范來(lái)實(shí)現(xiàn)的,兩者并不兼容,同時(shí)還有兩個(gè)明顯的不同:

1、Java虛擬機(jī)運(yùn)行的是Java字節(jié)碼,而Dalvik虛擬機(jī)運(yùn)行的則是其專有的文件格式DEX(DalvikExecutable)?

2、在JavaSE程序中的Java類會(huì)被編譯成一個(gè)或者多個(gè)字節(jié)碼文件(.class)然后打包到JAR文件,而后Java虛擬機(jī)會(huì)從相

應(yīng)的CLASS文件和JAR文件中獲取相應(yīng)的字節(jié)碼;Android應(yīng)用雖然也是使用Java語(yǔ)言進(jìn)行編程,但是在編譯成CLASS文

件后,還會(huì)通過(guò)一個(gè)工具(dx)將應(yīng)用所有的CLASS文件轉(zhuǎn)換成一個(gè)DEX文件,而后Dalvik虛擬機(jī)會(huì)從其中讀取指令和

數(shù)據(jù)。

Dalvik和Android系統(tǒng)

Android的系統(tǒng)架構(gòu)和其操作系統(tǒng)一樣,采用了分層的架構(gòu)。從架構(gòu)圖看,android分為四個(gè)層,從上層到低層分別是應(yīng)用程

序?qū)?、?yīng)用程序框架層、Android運(yùn)行時(shí)和庫(kù)、linux內(nèi)核:

APPLICATIONS

HomeContactsPhoneBrowser

APPLICATIONFRAMEWORK

WindowContentV?w

ActivityManager

ManagerProvidersSystem

TelephonyResourceLocationNocificauon

PackageManager

ManagerManagerManagerManager

LIBRARIESANDROIDRUNTIME

SurfaceManagerMediaSQLiteCoreLibraries

Framework

OpenGL|ESFreelypeWfebKit

Machine

SGL

LINUXKERNEL

DisplayFlashMemoryBinder(IPC)

CameraDriver

DnverDriverDriver

AudioPower

KeypadDriverWiFiDnver

DriversManagement

如圖所示,AndroidRunTime包括兩部分:核心庫(kù)和Dalvik虛擬機(jī)。核心庫(kù)包括了最基本的類庫(kù),如datastructure,network,

Utilities,Filesystem等的,很多實(shí)現(xiàn)代碼都是來(lái)自ApacheHarmony項(xiàng)目,主要目的是保證虛擬機(jī)的類庫(kù)能夠和JavaSE的類庫(kù)

最大可能的兼容,從而降低應(yīng)用開發(fā)者從JavaSE陣營(yíng)轉(zhuǎn)移到Android開發(fā)陣營(yíng)的難度,增加其可用性。Dalvik虛擬機(jī)主要

是完成對(duì)象生命周期的管理,堆棧的管理,線程管理,安全和異常的管理,以及垃圾回收等等重要功能。

Dalvik虛擬機(jī)的主要特征

Dalvik虛擬機(jī)非常適合在移動(dòng)終端上使用,相對(duì)于在桌面系統(tǒng)和服務(wù)器系統(tǒng)運(yùn)行的虛擬機(jī)而言,它不需要很快的CPU速度

和大量的內(nèi)存空間。根據(jù)Goo日e的測(cè)算,64M的RAM已經(jīng)能夠令系統(tǒng)正常運(yùn)轉(zhuǎn)了。其中24M被用于底層系統(tǒng)的初始化和

啟動(dòng),另外20M被用于高層啟動(dòng)高層服務(wù)。當(dāng)然,隨著系統(tǒng)服務(wù)的增多和應(yīng)用功能的擴(kuò)展,其所消耗的內(nèi)存也勢(shì)必越來(lái)越

大。歸納起來(lái),Dalvik虛擬機(jī)有如下幾個(gè)主要特征:

一、專有的DEX文件格式

DEX是Dalvik虛擬機(jī)專用的文件格式,而為什么棄用已有的字節(jié)碼文件(CLASS文件)而采用新的格式呢?

1、一個(gè)應(yīng)用中會(huì)定義很多類,編譯完成后即會(huì)有很多相應(yīng)的CLASS文件,CLASS文件間會(huì)有不少冗余的信息;而DEX文

件格式會(huì)把所有的CLASS文件內(nèi)容整合到一個(gè)文件中。這樣,除了減少整體的文件尺寸,I/O操作,也提高了類的查找速

度。原來(lái)每個(gè)類文件中的常量池,在DEX文件中由一個(gè)常量池來(lái)管理,具體方式如下圖:

Original.classfiles

classZapperclassBtort

Napper"]|*Sour8Fi后."Btorf]「Zapper"]

Nap"][孫a/lang/Objecf11.|method'zap][xmeNumberTable”]

tapper尸舊」.匡絲”ip^vaiagSsnQLa\a!ag

"(Ljava4ang/S:ring;Liava/lang/■|"Code”|Object:)Ljava/)ang」Stnng;"

「?■『8向,

classZapUser

「ZapUser1]Napper”]「ZapUseqava”|

|method[;rwNumberTable「|

"(Ljava/lang/StringiLjava/lang/

|.Code口dbjectMjava/lang/SuingJ

|methodre口--MNva/lang/Object*]

?^j.|'SourceFile。]

vanD^oiD

[IseZap”]「LZapper”|

2、增加了新的操作碼的支持

3、文件結(jié)構(gòu)盡量簡(jiǎn)潔,使用等長(zhǎng)的指令,借以提高解析速度

4、盡量擴(kuò)大只讀結(jié)構(gòu)的大小,借以提高跨進(jìn)程的數(shù)據(jù)共享

如何生成DEX文件呢?Android系統(tǒng)和Dalvik虛擬機(jī)提供了工具(DX),在把Java源代碼編譯成CLASS文件后,使用DX

工具。

二、DEX的優(yōu)化

DEX文件的結(jié)構(gòu)是緊湊的,如果我們還想要求運(yùn)行時(shí)的性能有進(jìn)一步提高,我們就仍然需要對(duì)DEX文件進(jìn)行進(jìn)一步優(yōu)化。

優(yōu)化主要是針對(duì)以下幾個(gè)方面:

1、調(diào)整所有字段的字節(jié)序(LHTLE_ENDIAN)和對(duì)齊結(jié)構(gòu)中的每一個(gè)域

2、驗(yàn)證DEX文件中的所有類

3、對(duì)一些特定的類進(jìn)行優(yōu)化,對(duì)方法里的操作碼進(jìn)行優(yōu)化。

優(yōu)化后的文件大小會(huì)有所增加,應(yīng)該是原DEX文件的1-4倍。優(yōu)化發(fā)生的時(shí)機(jī)有兩個(gè):對(duì)于預(yù)置應(yīng)用,可以在系統(tǒng)編譯后,

生成優(yōu)化文件,以O(shè)DEX結(jié)尾。這樣在發(fā)布時(shí)除APK文件(不包含DEX)以外,還有一個(gè)相應(yīng)的ODEX文件;對(duì)于非預(yù)

置應(yīng)用,包含在APK文件里的DEX文件會(huì)在運(yùn)行時(shí)被優(yōu)化,優(yōu)化后的文件將被保存在緩存中。

三、基于寄存器

相對(duì)于基于堆棧的虛擬機(jī)實(shí)現(xiàn),基于寄存器的虛擬機(jī)實(shí)現(xiàn)雖然在硬件通用性上要差一些,但是它在代碼的執(zhí)行效率上卻更勝

一籌。一般來(lái)講,虛擬機(jī)中指令的解釋執(zhí)行時(shí)間主要花在以下三個(gè)方面:

1、分發(fā)指令

2、訪問(wèn)運(yùn)算數(shù)

3、執(zhí)行運(yùn)算

其中“分發(fā)指令”這個(gè)環(huán)節(jié)對(duì)性能的影響最大。在基于寄存器的虛擬機(jī)里,可以更為有效的減少冗余指令的分發(fā)和減少內(nèi)存

的讀寫訪問(wèn),如:

Expression:a=b^c〃

Stack:ILOADc,ILOADb,IADD,ISTOREa^

Register:IADDa,b,w

雖然Dalvik虛擬機(jī)并沒(méi)有使用目前流行的虛擬機(jī)技術(shù),如JIT,但是根據(jù)Google的報(bào)告,這個(gè)功能的缺失并沒(méi)有讓DaKik

虛擬機(jī)在性能上有所損失。我們也相信,Dalvik虛擬機(jī)的性能還有進(jìn)一步提高的空間。

四、一個(gè)應(yīng)用,一個(gè)虛擬機(jī),一個(gè)進(jìn)程

每一個(gè)Android應(yīng)用都運(yùn)行在一個(gè)Dalvik虛擬機(jī)實(shí)例里,而每一個(gè)虛擬機(jī)實(shí)例都是一個(gè)獨(dú)立的進(jìn)程空間。虛擬機(jī)的線程機(jī)制,

內(nèi)存分配和管理,Mutex等等都是依賴底層操作系統(tǒng)而實(shí)現(xiàn)的。所有Android應(yīng)用的線程都對(duì)應(yīng)一個(gè)Linux線程,虛擬機(jī)因

而可以更多的依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制。

不同的應(yīng)用在不同的進(jìn)程空間里運(yùn)行,加之對(duì)不同來(lái)源的應(yīng)用都使用不同的Linux用戶來(lái)運(yùn)行,可以最大程度的保護(hù)應(yīng)用的

安全和獨(dú)立運(yùn)行。

Zygote是一個(gè)虛擬機(jī)進(jìn)程,同時(shí)也是一個(gè)虛擬機(jī)實(shí)例的孵化器,每當(dāng)系統(tǒng)要求執(zhí)行一個(gè)Android應(yīng)用程序,Zygote就會(huì)FORK

出一個(gè)子進(jìn)程來(lái)執(zhí)行該應(yīng)用程序。這樣做的好處顯而易見(jiàn):Zygote進(jìn)程是在系統(tǒng)啟動(dòng)時(shí)產(chǎn)生的,它會(huì)完成虛擬機(jī)的初始化,

庫(kù)的加載,預(yù)置類庫(kù)的加載和初始化等等操作,而在系統(tǒng)需要一個(gè)新的虛擬機(jī)實(shí)例時(shí),Zygote通過(guò)復(fù)制自身,最快速的提供

個(gè)系統(tǒng)。另外,對(duì)于一些只讀的系統(tǒng)庫(kù),所有虛擬機(jī)實(shí)例都和Zygpte共享一塊內(nèi)存區(qū)域,大大節(jié)省了內(nèi)存開銷。

應(yīng)用程序包(APK)被發(fā)布到手機(jī)上后,運(yùn)行前會(huì)對(duì)其中的DEX文件進(jìn)行優(yōu)化,優(yōu)化后的文件被保存到緩存區(qū)域(優(yōu)

化后的格式被稱為DEY),虛擬機(jī)會(huì)直接執(zhí)行該文件。如果應(yīng)用包文件不發(fā)生變化,DEY文件不會(huì)被重新生成。

Android應(yīng)用開發(fā)和Dalvik虛擬機(jī)

Android應(yīng)用所使用的編程語(yǔ)言是Java語(yǔ)言,和JavaSE一樣,編譯時(shí)使用SunJDK將Java源程序編程成標(biāo)準(zhǔn)的Java字節(jié)碼

文件(.class文件),而后通過(guò)工具軟件DX把所有的字節(jié)碼文件轉(zhuǎn)成DEX文件(classes.dex)。最后使用Android打包工具

(aapt)將DEX文件,資源文件以及AndroidManifest.xml文件(二進(jìn)制格式)組合成一個(gè)應(yīng)用程序包(APK)。應(yīng)用程序包

可以被發(fā)布到手機(jī)上運(yùn)行。

Activity生命周期

一、Activity棧

Android系統(tǒng)中,所有Acitivity被保存在Activity棧中。當(dāng)啟動(dòng)一個(gè)新的Acrivity時(shí),這個(gè)Activity就被壓入Activity棧的頂部。

如果用戶通過(guò)返回鍵回到上一個(gè)Activity的畫面,則棧頂?shù)腁ctivity將被彈出,下一個(gè)Activity就變成新的棧頂Activity,并顯

示在屏幕上。下圖顯示了Activity棧的運(yùn)作方式:

二、Activity的4種狀態(tài)

Activity狀態(tài)的變化完全由Android的內(nèi)存管理器決定,變化順序是不確定的,用戶無(wú)法預(yù)知。Activity從創(chuàng)建到關(guān)閉,可能

經(jīng)歷下面的4種狀態(tài):

1、活躍狀態(tài):當(dāng)一個(gè)Activity位于Activity棧的頂部時(shí),它所代表的用戶界面位于屏幕的最前端。也就是說(shuō),此時(shí)Activity

代表的界面對(duì)用戶來(lái)說(shuō)是可見(jiàn)的,同時(shí)用戶還可以在這個(gè)界面上進(jìn)行操作。Android會(huì)盡可能維持處于活躍狀態(tài)的Activity,

采取的措施包括中止位于Activity棧上其他的Activity,以便釋放資源。此時(shí)如果另一個(gè)Activity的狀態(tài)變?yōu)榛钴S,之前活躍

的Activity將變?yōu)闀和!?/p>

2、暫停狀態(tài):有一種特殊情況,Activity對(duì)用戶來(lái)說(shuō)是可見(jiàn)的,但是它并不擁有用戶輸入的焦點(diǎn),如果Activity處于這種狀

態(tài),我們就稱之為暫停的Activity。這種情況發(fā)生的場(chǎng)景通常是:在應(yīng)用程序的前端有一個(gè)透明的、或者非全屏顯示的Acciv

ity,處于暫停狀態(tài)的Activity的界面位于這個(gè)透明的、或者非全屏顯示的界面下面。一般情況下,Android也不會(huì)結(jié)束處于暫

停狀態(tài)的Activity,但是如果資源極其匱乏,系統(tǒng)也有可能結(jié)束暫停的Activity。[在程序中模擬這樣的情況]

3、結(jié)束狀態(tài):Activity所顯示的界面在屏幕上不可見(jiàn),那么它的狀態(tài)就是結(jié)束狀態(tài)。系統(tǒng)會(huì)在內(nèi)存中保存處于結(jié)束狀態(tài)的A

ctivity的狀態(tài)信息,以便該Activity重新變?yōu)榭梢?jiàn)的時(shí)候,狀態(tài)能夠迅速切換。當(dāng)系統(tǒng)內(nèi)存不足需要釋放內(nèi)存資源時(shí),處于

結(jié)束狀態(tài)的Activity是首選對(duì)象。

4、銷毀狀態(tài):當(dāng)Activity徹底結(jié)束或者關(guān)閉后,它的狀態(tài)就變?yōu)榉腔钴S狀態(tài),這時(shí)Activity已經(jīng)從Activity棧上移除。

Activity生命周期

三、Activity的生命周期

從上圖可以看到,有3個(gè)比較關(guān)維的生命周期循環(huán):

1、activity完整的生命周期自第一次調(diào)用onCrcate。開始,直至調(diào)用onDcstroy。為止。activity在onCrcate。中初始化Activi

ty,而在onDcstroyO中釋放所有系統(tǒng)資源。比如說(shuō),如果activity有一個(gè)線程在后臺(tái)運(yùn)行以從網(wǎng)絡(luò)上下載數(shù)據(jù),它會(huì)以onCr

eateO創(chuàng)建那個(gè)線程,而以onDestroy。銷毀那個(gè)線程。

2.activity的可見(jiàn)生命周期自onStart。調(diào)用開始直到對(duì)應(yīng)的onStop。調(diào)用。當(dāng)Activity運(yùn)行到onStarc。時(shí),用戶可以在屏幕

上看到此Activity,當(dāng)Activity運(yùn)行到onStopO時(shí),這個(gè)Activity就從屏幕上消失。在此期間,Activity對(duì)用戶來(lái)說(shuō)是可見(jiàn)的,

雖然有時(shí)候Activity并不擁有對(duì)用戶的輸入焦點(diǎn)。

3.activity的活躍生命周期自onRcsume。調(diào)用起,到對(duì)應(yīng)的onPause。調(diào)用為止。在此期間,用戶不僅能夠看到Activity,還

能夠通過(guò)屏幕獲得輸入的焦點(diǎn)。和可見(jiàn)生命周期類似,在Activity完整的生命周期中可能經(jīng)歷多個(gè)活躍生命周期。盡可能保

持onPouseO和cnResume。的簡(jiǎn)潔,這樣能夠使得應(yīng)用程序切換的時(shí)候響應(yīng)迅速(需要注意的是,在內(nèi)存不足的時(shí)候,onPa

use。、onStopO這兩種狀態(tài)是可以被系統(tǒng)直接kill的)

四、實(shí)例說(shuō)明

當(dāng)activity從一個(gè)狀態(tài)轉(zhuǎn)變到另一個(gè)狀態(tài)時(shí),Activity類中對(duì)應(yīng)于該狀態(tài)的方法將被調(diào)用:

onCreateQ

onStartQ

onResumcQ

onPauseQ

onStopO

onDestroy。

我們可以重載所有這些方法以便在狀態(tài)改變時(shí)做一些合適的工作。所有的activity都必須實(shí)現(xiàn)onCrcate。用以當(dāng)對(duì)象第一次實(shí)

例化時(shí)進(jìn)行初始化設(shè)置。很多activity會(huì)實(shí)現(xiàn)onPause。以提交數(shù)據(jù)變化或準(zhǔn)備停止與用戶的交互。

具體代碼參見(jiàn)附件,這里僅僅列出重要的部分:

AndroidManifestxml

<?xmlvcr$ion="1.0"encocling=Hutf-8,'?>

〈manifestxnilns:andr<iid="http://schemas.andn)id.ee>m/apk/rcs/android"

package=Mcom.siudio.android,,

android:vcrsionCodc=*,1"

android:vcrsionNanK=

<applicationandroid:ic<)n=n(aklrawablc/icon":indrcid:liihd="@string/app_namc”>

'-activity:uidn,id:n:imc=".Acuvityl」kCyck”

an<Jn>iii:labcl="@string/app_nanic,,>

〈intent-filter〉

<actiona?drojd:namc-"nndroid.inccnt.aciion.MAIN"/>

<carcgt>tyandroid:namc="android.intcnt.catcgoty.lJ\UNCHER"/>

</intcnt-filter>

</activity>

〈activityandroid:name=".OtherActivity"/>

〈/application〉

<uscs-sdkandraid:minSdkVcrsk)n="3"/>

</manifcst>

ActivityLifeCycle.java

packagec?im.studi<).andn>id;

importandn>itl.;ipp.Activity";

importandroid.app-AktiDialog;

imponandroid.contcnt.Dialoglntcrfacc;

importandroid.contcnt.lntcnt;

importandroid.content.Diahiglntcrfacc.C)nClickl.istener;

importandroid.os.Bundlc;

importandroid.uul.i^>g;

importandroid.view.View;

importandn>id.\vidgct.Bunon;

publicclassAcrivinijfcCydcextendsActivity{

privatestaticfinalStringTAG="[LifeCyclc]";

privateButtonbmOpcnDialog;

privateButtonbtnOthcrActivjty;

^Override

publicvoidonCrcatc(BundlcsavedInstanccStatc){

supcr.<)n(Jrcatc(sav?ilnstanccSrarc);

setContentVicw(R.layour.main);

initialView。;〃對(duì)控件進(jìn)行各種初始化操作

Log.i(TAG,''onCreatc'*);

}

^.Override

publicvoidonRestartO

(

supcr.onRcstartO;

Log.ifTAG,"onRestart,r);

)

?Override

publicvoidonStartO

(

super.onStartO;

LogJfTAG,"onStart");

}

@Ovcrridc

publicvoidonRcsumcO

(

super.<>nRcsumcQ;

Log.i(TAG,"onResume");

I

@6,crridc

publicvoidonPausef)

(

super.onPauscQ;

Log.i(TAG,MonPause");

}

(^.Override

publicvoidonStopQ

(

super.onStopO;

Logj(TAG,"onStop");

)

@Override

publicvoidonDestroyO

(

supcr.onDcstroyO;

Lx>g.i(TAG,"onDestroy");

)

privatevoidinindViewQ

{

btnOpcnDialog=(Button)this.HndViewById(R.id.bniOpcnDialog);

hrnOrhcrAcrivin=(Buuon)this.findVicwByld(R.id.bcnOthcrActivjt)");

Burton.C)n('licklJstcnerbm()penDiulogijstener=newButron.OnClicklJstenerQl

publicvoidonCIick.(Vicwv){

newAlcrtDialog.Builder(Acnv!(ylifcCyclc.this)

.sctIcon(android.R.drawablc.ic_dialog_inf(>)

.setTitle「歡迎")

,維tMewwigeC歡迎使用本程序,Activity生命周期測(cè)試

.seiPosidvcBuuon「確定newOnClicklJsccnerO{

publicvoidonClick(Dialoglntcrfacedialog,mtwhich){

//TODOAuto-gpneratcdmethodstub

|).crcatc().showO;

Button.OnClicklJswicrbmOdicrActivit5-ljstcncr=newButton.OnClickIJstcncrO{

publicvoidonClick(Vicwv){

Inrentintent=newln(cnt(Activin*ljfcCydc.this,OthcrActivity.dass);

startAcrivity(intenO;

btnOpenDia!og.sctOnClickListcncr(btn(JpcnDialoglJstener);

bin()thcrActivin'.sct<.)nClickl.istcncr(btn()thcrActivityl4stcncr);

運(yùn)行后模擬器的界面如下:

五、根據(jù)log信息,詳細(xì)分析Activity的生命周期

1、啟動(dòng)該程序:

TimepidtagMessage

07-0922:09:25.216I1083[LifeCycle]onCreate

07-0922:09:25.278I1083[LifeCycle]onStart

07-0922:09:25.278I1083[LifeCycle]onResume

Activity的啟動(dòng)順序是onCreatc->onStart->onResume

2、啟動(dòng)然后退出該程

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論