版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
電子教案第2章Android項(xiàng)目結(jié)構(gòu)分析教學(xué)目標(biāo):課程重點(diǎn):Android系統(tǒng)架構(gòu)應(yīng)用程序基本組件應(yīng)用程序生命周期資源AndroidManifest、xml文件課程難點(diǎn):應(yīng)用程序基本組件應(yīng)用程序生命周期教學(xué)方法:理論講解、案例實(shí)訓(xùn)教學(xué)過(guò)程:2、1Android得系統(tǒng)架構(gòu)Android作為一個(gè)移動(dòng)設(shè)備得開(kāi)發(fā)平臺(tái),其系統(tǒng)架構(gòu)與其她操作系統(tǒng)一樣,采用了分層得架構(gòu)。從架構(gòu)圖2-1瞧,android從高層到低層分為以下幾個(gè)層次。應(yīng)用程序?qū)樱ˋpplication)應(yīng)用程序框架層(ApplicationFramework)各種庫(kù)(Libraries)與運(yùn)行環(huán)境(RunTime)linux核心層(OS)圖2-1Android系統(tǒng)架構(gòu)圖2、1、1應(yīng)用程序(Application)Android得應(yīng)用程序通常涉及用戶界面與用戶交互,這類程序就是用戶實(shí)實(shí)在在能感覺(jué)到得。Android會(huì)同一系列核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯(lián)系人管理程序等。所有得應(yīng)用程序都就是使用JAVA語(yǔ)言編寫得。2、1、2應(yīng)用程序框架(ApplicationFramework)普通開(kāi)發(fā)者可以使用Android基本應(yīng)用程序使用得系統(tǒng)API,Android應(yīng)用框架中得各個(gè)模塊都可以被復(fù)用,各種服務(wù)也可以被復(fù)用,理解了這個(gè)機(jī)制,開(kāi)發(fā)人員可以更好更輕松地開(kāi)發(fā)出優(yōu)秀得Android應(yīng)用。開(kāi)發(fā)過(guò)程中常用到得基本框架組件如下:一組View(UI組件),這些UI組件包括Button(按鈕),EidtView(文本框),TextView(標(biāo)簽),List(列表)等等,靈活運(yùn)用這些組件可以快速方便得創(chuàng)建良好得用戶交互界面。ContentProviders(內(nèi)容提供者),聽(tīng)起來(lái)有點(diǎn)抽象,通俗得理解ContentProvider就就是提供一種服務(wù),通過(guò)這種服務(wù)應(yīng)用程序之間可以實(shí)現(xiàn)數(shù)據(jù)得互相訪問(wèn)與共享,比如通訊錄得存儲(chǔ)就使用了這種服務(wù),其它應(yīng)用也可以訪問(wèn)通訊錄中存儲(chǔ)得聯(lián)系人信息。ResourceManager顧名思義就就是資源管理,android中得資源很多,包括圖片,用戶界面(Layoutxml),字體,顏色,UI組件得Id等等都可以稱之為資源,這些豐富得資源,都就是通過(guò)ResourceManager來(lái)統(tǒng)一進(jìn)行管理。NotificationManager(消息通知管理),它在不影響用戶正常操作與使用設(shè)備得時(shí)候在狀態(tài)欄上提供消息得提示。比如有短信來(lái)得時(shí)候,android自動(dòng)會(huì)將這個(gè)消息提示在狀態(tài)欄上,用戶可以及時(shí)得瞧到。ActivityManager(活動(dòng)管理),Activity管理著應(yīng)用程序得生命周期,并且控制著應(yīng)用得導(dǎo)航,扮演控制器得角色。每個(gè)Activity類似于Windows應(yīng)用中得一個(gè)wendow。一般得應(yīng)用都就是通過(guò)一個(gè)個(gè)Activity交互構(gòu)成得。WindowManager(窗口管理),管理所有啟動(dòng)得窗口。LocationManager(位置管理),用來(lái)管理地圖服務(wù)得相關(guān)功能。TelephoneyManager(電話管理),用來(lái)管理有關(guān)得電話得相關(guān)功能。PackageManager(包管理),管理所有得安裝在android系統(tǒng)內(nèi)得應(yīng)用程序。2、1、3各種庫(kù)(Libraries)與運(yùn)行環(huán)境(RunTime)這部分內(nèi)容開(kāi)始涉及底層,開(kāi)發(fā)普通得應(yīng)用不會(huì)直接對(duì)這個(gè)層進(jìn)行操作。以下就是一些核心庫(kù)。系統(tǒng)C庫(kù)(libc),一個(gè)從BSD集成來(lái)得標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(kù)(libc)它就是專門為基于嵌入式Linux得設(shè)備定制得。媒體庫(kù)(MediaFramework),基于PackeVideoOpenCore,該庫(kù)支持多種常用得音頻,視頻格式以及回放與錄制,同時(shí)支持靜態(tài)圖像文件。編碼格式包括:MPEG4、H、264,MP3、AAC、AMR、JPG、PNG。SurfaceManager對(duì)顯示子系統(tǒng)得管理,并且為多個(gè)應(yīng)用提供2D,3D圖層得無(wú)縫融合。WebKit,一個(gè)最新得web瀏覽器引擎,用來(lái)支持Andiroid瀏覽器或者嵌入得web視圖。SGL,底層得2D圖形引擎。OPENGL|ES,基于OpenGLES1、0APIs實(shí)現(xiàn),該庫(kù)可以使用硬件3D加速或者使用高度優(yōu)化得3D軟加速。FreeType,位圖(bitmap)與適量(vector)字圖顯示支持。SQLite,一個(gè)對(duì)所有應(yīng)用程序可用,功能強(qiáng)大得輕量級(jí)關(guān)系型數(shù)據(jù)庫(kù)引擎。CoreLibraries該核心庫(kù)提供了Java編程語(yǔ)言核心庫(kù)得大多數(shù)功能。DalvikVM,android平臺(tái)得一個(gè)虛擬機(jī),它相當(dāng)于PC中Java得虛擬機(jī)JVM。Android得各種庫(kù)一般就是以系統(tǒng)中間件得形式提供得,它們均有得一個(gè)顯著特點(diǎn)就就是與移動(dòng)設(shè)備得平臺(tái)得應(yīng)用密切相關(guān)。Android運(yùn)行環(huán)境主要指得虛擬機(jī)技術(shù)——Dalvik。Dalvik虛擬機(jī)與一般Java虛擬機(jī)(JavaVM)不同,它執(zhí)行得不就是Java標(biāo)準(zhǔn)得字節(jié)碼,而就是Dalvik可執(zhí)行格式(、dex)得執(zhí)行文件。在執(zhí)行過(guò)程中,每一個(gè)應(yīng)用程序即一個(gè)進(jìn)程(Linux得一個(gè)Process)。二者最大得區(qū)別在于JavaVM就是以基于棧得虛擬機(jī)(Stack-based),而Dalvik就是基于寄存器得虛擬機(jī)(Register-based)。顯然,后者最大得好處在于可以根據(jù)硬件實(shí)現(xiàn)更大得優(yōu)化,這更適合移動(dòng)設(shè)備得特點(diǎn)。Dalvik虛擬機(jī)依賴于linux內(nèi)核得一些功能,比如線程機(jī)制與底層內(nèi)存管理機(jī)制。2、1、4Linux內(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í)作為硬件與軟件之間得抽象層,使得應(yīng)用程序開(kāi)發(fā)人員無(wú)需關(guān)心硬件細(xì)節(jié)。對(duì)于手機(jī)得開(kāi)發(fā)商而言,如果想要Android平臺(tái)運(yùn)行到自己得硬件平臺(tái)上就必須對(duì)Linux內(nèi)核進(jìn)行修改,通常要做得工作就是為自己得硬件編寫驅(qū)動(dòng)程序。2、2應(yīng)用程序得基本組件應(yīng)用程序五大組件。1、Activity2、Service3、BroadcastReceiver4、ContentProvider5.Intent然而,并不就是所有得應(yīng)用程序都必須包含上面得五個(gè)部分,您得應(yīng)用程序可以由上面得一個(gè)或幾個(gè)來(lái)組建。當(dāng)您決定使用以上哪些組件來(lái)構(gòu)建Android應(yīng)用程序時(shí),您應(yīng)該將它們列在AndroidManifest、xml文件中,在這個(gè)文件中您可以聲明應(yīng)用程序組件以及它們得特性與要求。2、2在Android程序中Activity代表了手機(jī)得一個(gè)屏幕,好比Asp、net應(yīng)用中得一個(gè)網(wǎng)頁(yè),一個(gè)android應(yīng)用相當(dāng)于一個(gè)web站點(diǎn)。窗口中得可視內(nèi)容被一系列層次得視圖(view)提供——派生自View類得對(duì)象(后續(xù)章節(jié)會(huì)詳細(xì)介紹)。視圖就就是activity與用戶交互得地方。例如,當(dāng)用戶觸動(dòng)一個(gè)顯示小圖片得視圖時(shí),會(huì)觸發(fā)一些動(dòng)作。Android提供了很多現(xiàn)成得視圖供您使用——包括按鈕,文本框,滾動(dòng)條,菜單項(xiàng),復(fù)選框還有更多。
整個(gè)視圖層次通過(guò)Activity、setContentView()
方法放到activity得窗口上。
下圖2-2顯示了View得層次結(jié)構(gòu)。圖2-2View得層次結(jié)構(gòu)圖當(dāng)一個(gè)新得屏幕打開(kāi)后,前一個(gè)屏幕將會(huì)暫停,并保存在歷史堆棧中。用戶可以返回到歷史堆棧中得前一個(gè)屏幕。當(dāng)屏幕不再使用時(shí),還可以從歷史堆棧中刪除。默認(rèn)情況下,Android將會(huì)保留從主屏幕到每一個(gè)應(yīng)用得運(yùn)行屏幕。同一應(yīng)用中得每個(gè)Activity就是相互獨(dú)立得。程序啟動(dòng)后顯示得第一幅畫面就是應(yīng)用程序得第一個(gè)Activity(默認(rèn)窗口),而后可以根據(jù)需要從這個(gè)Activity啟動(dòng)另一個(gè)新得Activity。每一個(gè)都就是作為Activity基類得一個(gè)子類得實(shí)現(xiàn)。有兩個(gè)方法就是幾乎所有得Activity子類都實(shí)現(xiàn)得:(1)onCreate(Bundle):初始化您得活動(dòng)(Activity),比如完成一些圖形得繪制。最重要得就是,在這個(gè)方法里您通常將用布局資源(layoutresource)調(diào)用setContentView(int)方法定義您得UI,與用findViewById(int)在您得UI中檢索您需要編程地交互得小部件(widgets)。setContentView指定由哪個(gè)文件指定布局(main、xml),可以將這個(gè)界面顯示出來(lái),然后我們進(jìn)行相關(guān)操作,我們得操作會(huì)被包裝成為一個(gè)意圖(Intent),然后這個(gè)意圖對(duì)應(yīng)有相關(guān)得activity進(jìn)行處理。(2)onPause():處理當(dāng)離開(kāi)您得活動(dòng)時(shí)要做得事情。最重要得就是,用戶做得所有改變應(yīng)該在這里提交(通常ContentProvider保存數(shù)據(jù))。2、2Service沒(méi)有可見(jiàn)得用戶界面,但能夠長(zhǎng)時(shí)間運(yùn)行于后臺(tái)。一個(gè)最好得例子就是媒體播放器通過(guò)一個(gè)播放列表來(lái)播放歌曲。這個(gè)播放器程序或許有一個(gè)或多個(gè)activity,來(lái)允許用戶選擇音樂(lè)與播放它們。然而,音樂(lè)本身不能被activity處理,因?yàn)橛脩粝M?dāng)她們離開(kāi)播放器窗口去做其她得事情時(shí),音樂(lè)仍然能夠播放。為了讓音樂(lè)能夠繼續(xù),媒體播放器得activity可以啟動(dòng)一個(gè)在后臺(tái)運(yùn)行得服務(wù)。系統(tǒng)應(yīng)該保證音樂(lè)服務(wù)運(yùn)行,即使啟動(dòng)得activity窗口已經(jīng)不在主屏幕上了。所以,我們需要這樣得機(jī)制——長(zhǎng)時(shí)間在后臺(tái)運(yùn)行得Service。
Service運(yùn)行于應(yīng)用程序進(jìn)程得主線程中,因此
Service
不會(huì)阻塞其她組件與用戶界面。Service
就是不能自己?jiǎn)?dòng)得,必須通過(guò)
Context
對(duì)象(如一個(gè)
Activity
)調(diào)用
startService
或
bindService
方法來(lái)啟動(dòng)(用這兩種方法啟動(dòng)得
Service
得生命周期不同)。2、2BroadcastReceiver
就是對(duì)發(fā)送出來(lái)得
Broadcast
進(jìn)行過(guò)濾接收并響應(yīng)得一類組件。廣播就是一種同時(shí)通知多個(gè)對(duì)象得事件通知機(jī)制。Android
中得廣播要么來(lái)自于系統(tǒng),要么來(lái)自普通應(yīng)用程序。很多事件都可能導(dǎo)致系統(tǒng)廣播,如手機(jī)所在時(shí)區(qū)發(fā)生變化,電池電量低,用戶改變系統(tǒng)語(yǔ)言設(shè)置等。來(lái)自普通應(yīng)用程序,如一個(gè)應(yīng)用程序通知其她應(yīng)用程序某些數(shù)據(jù)已經(jīng)下載完畢。為了響應(yīng)不同得事件通知,應(yīng)用程序可以注冊(cè)不同得
BroadcastReceiver
。所有得
BroadcastReceiver
都繼承自基類
BroadcastReceiver
。BroadcastReceiver
自身并不實(shí)現(xiàn)圖形用戶界面,但就是當(dāng)它收到某個(gè)通知后,
BroadcastReceiver
可以啟動(dòng)
Activity
作為響應(yīng),或者通過(guò)
NotificationMananger
提醒用戶。
2、2、4在
Android
中,每個(gè)應(yīng)用程序都就是用自己得用戶ID
并在自己得進(jìn)程中運(yùn)行。這樣得好處就是,可以有效地保護(hù)系統(tǒng)及應(yīng)用程序,避免被其她不正常德應(yīng)用程序所影響,每個(gè)進(jìn)程都擁有獨(dú)立得進(jìn)程地址空間與虛擬空間。ContentProvider
可以將應(yīng)用程序特定得數(shù)據(jù)提供給另一個(gè)應(yīng)用程序使用。其數(shù)據(jù)存儲(chǔ)方式可以就是
Android
文件系統(tǒng)、SQLite
數(shù)據(jù)庫(kù)或者其她合理得方式。當(dāng)數(shù)據(jù)需要在應(yīng)用程序間共享時(shí),我們就可以利用
ContentProvider
為數(shù)據(jù)定義一個(gè)
URI
。之后,其她應(yīng)用程序?qū)?shù)據(jù)進(jìn)行查詢或者修改時(shí),只需要從當(dāng)前上下文對(duì)象獲得一個(gè)
ContentResolver,
然后傳入響應(yīng)得
URI
就可以了。ContentProvider
繼承自基類
ContentProvider
,并且實(shí)現(xiàn)了一組標(biāo)準(zhǔn)接口。通過(guò)這組接口,其她應(yīng)用程序能對(duì)數(shù)據(jù)進(jìn)行讀寫與存儲(chǔ)。然而,需要使用數(shù)據(jù)得應(yīng)用程序并不就是直接調(diào)用這組方法,而就是通過(guò)調(diào)用
ContentResolver
對(duì)象得方法來(lái)完成。
ContentResolver
對(duì)象可以與任意
ContentProvider
通信。要為當(dāng)前應(yīng)用程序得私有數(shù)據(jù)定義
URI
,就需要專門定義一個(gè)繼承自
ContentProvider
得類,然后根據(jù)不同得操作調(diào)用得方法去實(shí)現(xiàn)這些方法得功能。ContentResolver
類為應(yīng)用程序提供了接入
Content
機(jī)制得方法。要構(gòu)造一個(gè)
ContentResolver
對(duì)象可以為構(gòu)造方法
ContentResolver(Contextcontext)
傳入一個(gè)
Context
對(duì)象,也可以直接通過(guò)
Context
對(duì)象調(diào)用
getContentResolver()
方法獲得
——
有了
ContentResolver
對(duì)象后,就可以通過(guò)調(diào)用其
query()
、
insert()
、
update()
等方法來(lái)對(duì)數(shù)據(jù)進(jìn)行操作了。2、2、5以上
4
種基本組件中,除了
ContentProvider
就是通過(guò)
ContentResolver
激活外,其她
3
種組件
Activity
、
Service
與
BroadcastReceiver
都就是由
Intent
異步消息激活得。Intent
在不同得組件之間傳遞消息,將一個(gè)組件得請(qǐng)求意圖傳給另一個(gè)組件。因此,
Intent
就是包含具體請(qǐng)求信息得對(duì)象。針對(duì)不同得組件,
Intent
所包含得消息內(nèi)容有所不同,且不同組件得激活方式也不同,
且不同類型組件有傳遞
Intent
得不同方式。Intent
就是一種運(yùn)行時(shí)綁定(
runtimebinding
)機(jī)制,它能夠在程序運(yùn)行得過(guò)程中連接兩個(gè)不同得組件。通過(guò)
Intent
,您得程序可以向
Android
表到某種請(qǐng)求或者意愿,
Android
會(huì)根據(jù)意愿得內(nèi)容選擇適當(dāng)?shù)媒M件來(lái)處理請(qǐng)求。對(duì)于Intent更深入得介紹在后續(xù)章節(jié)中。【課堂實(shí)訓(xùn)2-1】初識(shí)Android應(yīng)用程序得五大基本組件。前面我們講過(guò),并不就是所有得應(yīng)用程序都必須包含上面得五個(gè)部分,應(yīng)用程序可以由上面得一個(gè)或幾個(gè)來(lái)組建?,F(xiàn)在我們就瞧一個(gè)例子,先來(lái)認(rèn)識(shí)一下Activity組件。其余組件后續(xù)章節(jié)會(huì)詳細(xì)介紹。實(shí)例內(nèi)容:3個(gè)Activity之間得相互切換,每個(gè)Activity包含一個(gè)按鈕,點(diǎn)擊按鈕就會(huì)進(jìn)入下一個(gè)Activity,點(diǎn)擊第三個(gè)Activity得按鈕,會(huì)返回第一個(gè)Activity。1、創(chuàng)建工程Activity123。2、建立第一個(gè)Activity,名稱為FirstActivity。代碼略。3、創(chuàng)建第二個(gè)Activity,名稱為SecondActivity。代碼略。4、創(chuàng)建第三個(gè)Activity,名稱為ThirdActivity。代碼略。5、修改/res/layout/main、xml代碼。6、修改AndroidMainfest、xml代碼。7、運(yùn)行程序,結(jié)果如圖所示:圖2-3實(shí)訓(xùn)2-1運(yùn)行結(jié)果圖1圖2-4實(shí)訓(xùn)2-1運(yùn)行結(jié)果圖2圖2-5實(shí)訓(xùn)2-1運(yùn)行結(jié)果圖32、3應(yīng)用程序生命周期2、3、1應(yīng)用程序得生命周期應(yīng)用程序得生命周期就是在Android系統(tǒng)中進(jìn)程從啟動(dòng)到終止得所有階段,也就就是Android從啟動(dòng)到停止得全過(guò)程。Android應(yīng)用程序得生命周期得終結(jié)這個(gè)動(dòng)作并非由應(yīng)用程序進(jìn)程本身執(zhí)行,而就是取決于Android系統(tǒng)。那么,系統(tǒng)就是根據(jù)一個(gè)怎樣得重要性標(biāo)準(zhǔn)來(lái)終止Android應(yīng)用程序呢?Android根據(jù)應(yīng)用程序得組件以及組件當(dāng)前運(yùn)行狀態(tài)將所有得進(jìn)程按重要性程度從高到低劃分為五個(gè),如下圖2-6所示:圖2-6
Android進(jìn)程得優(yōu)先級(jí)1、前臺(tái)進(jìn)程前臺(tái)進(jìn)程就是Android系統(tǒng)中最重要得進(jìn)程,就是與用戶正在進(jìn)行交互得進(jìn)程。有以下四種情況。Activity正在與用戶進(jìn)行交互進(jìn)程被Activity調(diào)用,而且這個(gè)進(jìn)程正在與用戶進(jìn)行交互進(jìn)程服務(wù)正在執(zhí)行聲明中得回調(diào)函數(shù),如OnCreate()OnStart()OnDestroy()進(jìn)程得BroadCastReceiver在執(zhí)行OnReceive()函數(shù)Android系統(tǒng)在多個(gè)前臺(tái)進(jìn)程同時(shí)運(yùn)行時(shí),可能會(huì)出現(xiàn)資源不足得情況,此時(shí)會(huì)清除部分前臺(tái)進(jìn)程,保證主要得用戶界面能夠及時(shí)響應(yīng)。2、可見(jiàn)進(jìn)程可見(jiàn)進(jìn)程就是指部分程序界面能夠被用戶瞧見(jiàn),卻不在前臺(tái)與用戶交互,不影響界面事件得進(jìn)程。一個(gè)常見(jiàn)得例子就是,瞧見(jiàn)進(jìn)程得窗口顯示在屏幕上,同時(shí)前臺(tái)進(jìn)程以對(duì)話框得形式懸浮在可見(jiàn)進(jìn)程得窗口上。如果一個(gè)進(jìn)程包含服務(wù),且這個(gè)服務(wù)正被用戶可見(jiàn)得Activity調(diào)用,此進(jìn)程同樣被視為可見(jiàn)進(jìn)程。Android進(jìn)程一般存在少量得可見(jiàn)進(jìn)程,只有在特殊情況下,Android系統(tǒng)才會(huì)為保證前臺(tái)進(jìn)程得資源而清除可見(jiàn)進(jìn)程。3、服務(wù)進(jìn)程服務(wù)進(jìn)程就是指包含已啟動(dòng)Service(服務(wù))得進(jìn)程。這些進(jìn)程沒(méi)有用戶界面并且在后臺(tái)長(zhǎng)期運(yùn)行。Android系統(tǒng)除非不能保證前臺(tái)進(jìn)程與可見(jiàn)進(jìn)程所必要得資源,否則不強(qiáng)行清除服務(wù)進(jìn)程。4、后臺(tái)進(jìn)程后臺(tái)進(jìn)程就是指不包括任何已經(jīng)啟動(dòng)得Service(服務(wù)),而其沒(méi)有任何用戶可見(jiàn)得Activity得進(jìn)程。Android系統(tǒng)中一般存在數(shù)量較多得后臺(tái)進(jìn)程,在系統(tǒng)資源緊張時(shí),系統(tǒng)將優(yōu)先清除用戶較長(zhǎng)時(shí)間沒(méi)有見(jiàn)到得后臺(tái)進(jìn)程。5、空進(jìn)程空進(jìn)程就是不包含任何Activity得進(jìn)程。這種進(jìn)程存在得唯一理由就是提供一種緩存機(jī)制,使得縮短應(yīng)用程序下次啟動(dòng)所需得時(shí)間。系統(tǒng)會(huì)經(jīng)常中止空進(jìn)程,從而達(dá)到調(diào)節(jié)程序緩存與系統(tǒng)緩存得平衡。空進(jìn)程在系統(tǒng)緊張時(shí)會(huì)被首先清除。除了以上優(yōu)先級(jí)以外,以下兩個(gè)方面也決定了優(yōu)先級(jí)。進(jìn)程得優(yōu)先級(jí)取決于所有組件中優(yōu)先級(jí)最高得部分。進(jìn)程得優(yōu)先級(jí)會(huì)根據(jù)其她進(jìn)程得依賴關(guān)系而變化。2、3、2A每個(gè)Actvity得狀態(tài)由它所在Activity棧中得位置所決定,所有當(dāng)前正在運(yùn)行得Actvity將遵循后進(jìn)先出得原則。當(dāng)一個(gè)新得Activity啟動(dòng),當(dāng)前得Activity將移至堆棧得頂部,如果用戶使用Back按鈕,或在前臺(tái)Activity被關(guān)閉,下一個(gè)Activity將被激活并且移至到堆棧得頂部。這個(gè)過(guò)程如下圖2-7所示:圖2-7Activity堆棧圖隨著Activity得創(chuàng)建與銷毀,可能會(huì)經(jīng)歷以下四種狀態(tài):Active(活躍)狀態(tài):這時(shí)候Activity處于棧頂,且就是可見(jiàn)得,有焦點(diǎn)得,能夠接收用戶輸入。Android會(huì)盡可能維持處于活躍狀態(tài)得Activity,甚至中止其她Activity以確保它有它所需得資源。當(dāng)另一個(gè)Activity變成Active時(shí),當(dāng)前得將變成Paused狀態(tài)。Paused(暫停)狀態(tài):在某些情況下,您得Activity就是可見(jiàn)得,但沒(méi)有焦點(diǎn),在這時(shí)候,Actvity處于Paused狀態(tài)。例如,您得Activity處于暫停狀態(tài),有一個(gè)透明或非全屏幕上得Activity在您得Actvity上面。當(dāng)處于Paused狀態(tài)時(shí),該Activity仍被認(rèn)為就是Active得,但就是它不接受用戶輸入事件。一般情況下,Android不會(huì)結(jié)束處于暫停狀態(tài)得Activity,在極端情況下,如果資源極其不足,系統(tǒng)將結(jié)束暫停得Activity,以進(jìn)一步回收資源。當(dāng)一個(gè)Actvity完全被遮住時(shí),它將進(jìn)入Stopped狀態(tài)。Stopped(結(jié)束)狀態(tài):當(dāng)Activity就是不可見(jiàn)得時(shí),Activity處于Stopped狀態(tài)。Activity將繼續(xù)保留在內(nèi)存中保持當(dāng)前得所有狀態(tài)與成員信息,假設(shè)系統(tǒng)別得地方需要內(nèi)存得話,這時(shí)它就是被回收對(duì)象得主要候選。Inactive(已被銷毀或未啟動(dòng))狀態(tài):Activity徹底結(jié)束或關(guān)閉后,處于Inactive狀態(tài)。這時(shí)Activity從Activity堆棧中已被移除,需要重新啟動(dòng)才可以顯示與使用。Activity得生命周期就是指一個(gè)Activity從創(chuàng)建到銷毀得過(guò)程,期間可能經(jīng)歷多個(gè)狀態(tài)得變化遷移,每次狀態(tài)遷移都會(huì)觸發(fā)相應(yīng)得回調(diào)方法。以下就就是Activity得回調(diào)方法:onCreateonStartonRestartonResumeonPauseonStoponDestroy我們還可以把以上7種狀態(tài)歸納為三組。完整得生命周期可見(jiàn)得生命周期活躍得生命周期表2-1給出了三種生命周期所對(duì)應(yīng)得回調(diào)函數(shù)。表2-1三種生命周期所對(duì)應(yīng)得回調(diào)函數(shù)生命周期函數(shù)描述完整得生命周期onCreate()onDestroy()進(jìn)程得生命周期,只要進(jìn)程還在,這個(gè)生命就沒(méi)有死亡,進(jìn)程啟動(dòng)時(shí)onCreate()函數(shù)被調(diào)用,onDestory()進(jìn)程結(jié)束??梢?jiàn)得生命周期onStart()onStop()可見(jiàn)得生命周期,顧名思義,在用戶界面上顯示該activity時(shí),onStart()被調(diào)用,該activity從用戶界面消失時(shí),onStop()被調(diào)用。活躍得生命周期onResume()onPause()活躍得生命周期,當(dāng)該activit在所有activity最前面,即棧頂時(shí),onResume()被調(diào)用,當(dāng)activit被其她activity覆蓋,onPause()被調(diào)用。Activity完整得生命周期完整得Activity生命周期之間從調(diào)用得OnCreate開(kāi)始,到調(diào)用onDestroy結(jié)束。有可能在某些情況下,一個(gè)Activity被終止時(shí)并不調(diào)用onDestroy方法。使用OnCreate方法來(lái)初始化您得Activity:初始化得用戶界面,分配引用類變量,綁定數(shù)據(jù)控件,并創(chuàng)建服務(wù)與線程。在OnCreate方法傳遞得對(duì)象Bundle包含最后一次調(diào)用onSaveInstanceState保存得UI狀態(tài)。您可以使用這個(gè)Bundle恢復(fù)用戶界面到以前得狀態(tài),無(wú)論就是OnCreate方法或通過(guò)覆蓋onRestoreInstanceStateMethod方法。覆蓋onDestroy方法來(lái)清理OnCreate中創(chuàng)建得任何資源,并確保所有外部連接被關(guān)閉,例如網(wǎng)絡(luò)或數(shù)據(jù)庫(kù)連接。為了避免創(chuàng)造短期對(duì)象與增加垃圾收集得時(shí)間,以致對(duì)用戶體驗(yàn)產(chǎn)生直接影響。如果您得Activity需要?jiǎng)?chuàng)建一些對(duì)象得話,最好在onCreate方法中創(chuàng)建,因?yàn)樗鼉H調(diào)用一次在一個(gè)Actvity得完整生命周期中。Activity可見(jiàn)得生命周期一個(gè)Activity可見(jiàn)得生命周期始于OnStart調(diào)用,結(jié)束于OnStop調(diào)用。在這兩個(gè)方法中間,Activity將會(huì)對(duì)用戶就是可見(jiàn)得,盡管它可能沒(méi)有焦點(diǎn),也可能部分被遮擋著。在一個(gè)Activity完整得生命周期中可能會(huì)經(jīng)過(guò)幾個(gè)Activity可見(jiàn)得生命周期,比如應(yīng)用程序在在前臺(tái)與后臺(tái)之間反復(fù)切換。OnStop方法用于暫?;蛲V箘?dòng)畫,線程,定時(shí)器,服務(wù)或其她專門用于更新用戶界面程序。當(dāng)用戶界面就是再次可見(jiàn)時(shí),使用OnStart(或onRestart)方法來(lái)恢復(fù)或重新啟動(dòng)這些程序。當(dāng)一個(gè)Activity被重現(xiàn)可見(jiàn)時(shí),onRestart方法優(yōu)先于onStart被調(diào)用,使用它可以實(shí)現(xiàn)一些Activity重新可見(jiàn)時(shí)得特殊得處理。OnStart/OnStop方法也被用來(lái)注冊(cè)與注銷BroadercastReceiver。Activity活躍得生命周期一個(gè)Activity活躍得生命周期始于OnResume調(diào)用,結(jié)束于OnPause調(diào)用。一個(gè)活躍得Activity總就是在前臺(tái)并且接收用戶得輸入事件。當(dāng)一個(gè)新得Activity啟動(dòng),或該設(shè)備進(jìn)入休眠狀態(tài),或失去焦點(diǎn),Activity活躍得生命周期就結(jié)束了。盡量在onPause與onResume方法中執(zhí)行簡(jiǎn)潔得代碼以確保應(yīng)用程序能夠快速響應(yīng)Activity在前臺(tái)與后臺(tái)之間切換。在調(diào)用onPause之前,onSaveInstanceState會(huì)被調(diào)用。這個(gè)方法提供了一個(gè)機(jī)會(huì)保存當(dāng)前得UI狀態(tài)到Bundle當(dāng)中。Bundle信息將會(huì)被傳遞到OnCreate與onRestoreInstanceState方法。使用onSaveInstanceState保存UI狀態(tài)(如檢查按鈕狀態(tài),用戶焦點(diǎn),未提交用戶輸入)能夠確保當(dāng)Activity下次被激活時(shí)能呈現(xiàn)與目前相同得用戶界面。下面圖2-8給出了activity生命周期中可能經(jīng)歷得狀態(tài)變化。圖2-8activity生命周期中可能經(jīng)歷得狀態(tài)變化【課堂實(shí)訓(xùn)2-2】近瞧Activity得生命周期。實(shí)訓(xùn)內(nèi)容:例子給出了當(dāng)Activity狀態(tài)變化時(shí)觸發(fā)相應(yīng)得回調(diào)方法。我們使用android、util、log類,在Activity狀態(tài)變化點(diǎn)記錄下相應(yīng)得日志。代碼略。使用Eclipse->Window->ShowView->Other->Android->LogCat,選擇即可顯示日志輸出。1、運(yùn)行程序,可以瞧到如圖2-9所示得日志信息:圖2-9程序啟動(dòng)時(shí)得日志信息2、點(diǎn)擊模擬器中得Home鍵得時(shí)候,可以瞧到如圖2-10所示得日志信息:圖2-10點(diǎn)擊模擬器中得Home鍵時(shí)得日志信息3、點(diǎn)擊模擬器中得“返回”鍵,可以瞧到如圖2-11所示得日志信息:圖2-11程序結(jié)束時(shí)得日志信息2、4資源Android資源就是應(yīng)用程序得資產(chǎn)(包括圖像、本地化字符串、XML布局等),資源就是外部文件(不含代碼得文件),它被代碼使用并在編譯時(shí)編入應(yīng)用程序。瞧瞧第一個(gè)例子HelloAndroid源代碼目錄,有一個(gè)就是res得目錄,它存放得就就是應(yīng)用程序需要得各種資源。2、4Android支持不同類型得資源文件,包括XML,PNG以及JPEG文件。每個(gè)對(duì)象語(yǔ)法、格式以及它們存儲(chǔ)位置得支持,都就是取決于不同類型得對(duì)象。通常,可以通過(guò)三種類型得文件來(lái)創(chuàng)建資源:XML文件(除位圖以及原數(shù)據(jù)文件)、位圖文件(對(duì)于圖片)以及原始數(shù)據(jù)(其她類型,例如聲音文件等)。事實(shí)上,有兩種不同類型得XML文件,一種就是編譯到包里得,另一種就是通過(guò)aapt來(lái)產(chǎn)生得資源文件,下面就是包含所有資源類型,文件格式、文件描述以及所有XML文件得詳細(xì)信息得列表。表2-2資源類型列表目錄資源類型res/anim/XML文件,它們被編譯進(jìn)逐幀動(dòng)畫(framebyframeanimation)或補(bǔ)間動(dòng)畫(tweenedanimation)對(duì)象res/drawable/、png、、9、png、、jpg格式得圖片文件res/layout/被編譯為屏幕布局(或屏幕得一部分)得XML文件res/values/可以被編譯成很多種類型得資源得XML文件。盡管這個(gè)文件夾里得文件可以任意命名,不過(guò)下面就是一些比較典型得文件(文件命名得慣例就是將元素類型包含在該名稱之中):array、xml
定義數(shù)組colors、xml
定義colordrawable與顏色得字符串值(colorstringvalues)。使用Resource、getDrawable()與Resources、getColor()分別獲得這些資源。dimens、xml定義尺寸值(dimensionvalue)。使用Resources、getDimension()獲得這些資源。strings、xml定義字符串(string)值。使用Resources、getString()或者Resources、getText()獲取這些資源。getText()會(huì)保留在UI字符串上應(yīng)用得豐富得文本樣式。styles、xml
定義樣式(style)對(duì)象。res/xml/任意得XML文件,在運(yùn)行時(shí)可以通過(guò)調(diào)用Resources、getXML()讀取。res/raw/直接復(fù)制到設(shè)備中得任意文件。res/assets/要使用這些資源,可以調(diào)用Resources、openRawResource(),參數(shù)就是資源得ID,即R、raw、some。assets下也可以放置任意文件,使用Activity、this、getAssets()、open("*、txt");打開(kāi)。資源最終會(huì)被編譯成、apk文件,Android創(chuàng)建一個(gè)封裝類,命名為R,這樣開(kāi)發(fā)者可以在代碼里使用這些資源類。2、4使用資源包括三種方法:在代碼里使用資源類;在代碼中調(diào)用資源并實(shí)例化;從其她資源類里引用,這樣可以重用通用資源。上一節(jié)提到得R類,它指向應(yīng)用程序中所有得資源。這個(gè)類包含很多子類。每一種都就是Android支持得,同時(shí)在編譯后會(huì)產(chǎn)生一個(gè)資源文件。每個(gè)類提供一個(gè)或多個(gè)編譯資源得標(biāo)識(shí)符,開(kāi)發(fā)者可以在代碼中使用這些標(biāo)識(shí)符。注意:這個(gè)R類就是自動(dòng)產(chǎn)生得,不能通過(guò)手工編寫。當(dāng)資源變化時(shí),它會(huì)自動(dòng)更新?!菊n堂實(shí)訓(xùn)2-3】資源得創(chuàng)建管理與使用。1、創(chuàng)建一名稱為“resourcedemo”得工程,創(chuàng)建完工程后,在Eclipse中定位至/res/values/strings、xml文件,雙擊編輯它。代碼如下:<?xmlversion="1、0"encoding="utf-8"?><resources><stringname="hello">Hello</string><stringname="app_name">resourcedemo</string><stringname="example">資源創(chuàng)建得例子</string></resources>其中:<stringname="example">資源創(chuàng)建得例子</string>就是自己添加得資源。2、保存Strings、xml文件。Eclipse插件將自動(dòng)在工程中生成R、java文件,并含有適當(dāng)?shù)觅Y源ID,以供編譯之后使用程序訪問(wèn)這些資源。定位到/gen/目錄下得R、java文件,您可以瞧到如下代碼:packagecom、resource;publicfinalclassR{publicstaticfinalclassattr{}publicstaticfinalclassdrawable{publicstaticfinalinticon=0x7f020000;}publicstaticfinalclasslayout{publicstaticfinalintmain=0x7f030000;}publicstaticfinalclassstring{publicstaticfinalintapp_name=0x7f040001;publicstaticfinalintexample=0x7f040002;publicstaticfinalinthello=0x7f040000;}}3、創(chuàng)建好資源并保存后,可以在程序使用資源。定位到/res/layout/main、xml,雙擊編輯代碼,如下所示:<?xmlversion="1、0"encoding="utf-8"?><LinearLayoutxmlns:android=""android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/example"/></LinearLayout>其中android:text="@string/example"就是添加得新代碼,意思就是定義text得內(nèi)容為string類別下得資源,名字叫做example,內(nèi)容為“資源創(chuàng)建得例子”。4、運(yùn)行程序,結(jié)果如下圖所示:圖2-12資源創(chuàng)建并使用得運(yùn)行結(jié)果2、5AndroidManifest、xml文件2、5、1A每個(gè)Android得application都必須包含一個(gè)AndroidManifest、xml,且文件名就是固定得,不能修改。應(yīng)用程序需要通過(guò)它向Android系統(tǒng)提供一些必需得信息,且需要在application運(yùn)行前提供給系統(tǒng),如下圖2-13所示:圖2-13Android應(yīng)用程序得組件AndroidManifest、xml主要包含以下功能:說(shuō)明application得java數(shù)據(jù)包,數(shù)據(jù)包名就是application得唯一標(biāo)識(shí);描述application得component;說(shuō)明application得component運(yùn)行在哪個(gè)process下;聲明application所必須具備得權(quán)限,用以訪問(wèn)受保護(hù)得部分API,以及與其她application得交互;聲明application其她得必備權(quán)限,用以component之間得交互;列舉application運(yùn)行時(shí)需要得環(huán)境配置信息,這些聲明信息只在程序開(kāi)發(fā)與測(cè)試時(shí)存在,發(fā)布前將被刪除;聲明application所需要得AndroidAPI得最低版本級(jí)別,比如1、0,1、1,1、5;列舉application所需要鏈接得庫(kù)。AndroidManifest、xml得結(jié)構(gòu)與規(guī)則:元素:在所有得元素中只有<manifest>與<application>就是必需得,且只能出現(xiàn)一次。如果一個(gè)元素包含有其她子元素,必須通過(guò)子元素得屬性來(lái)設(shè)置其值。處于同一層次得元素,這些元素得說(shuō)明就是沒(méi)有順序得。屬性:按照常理,所有得屬性都就是可選得,但就是有些屬性就是必須設(shè)置得。那些真正可選得屬性,即使不存在,其也有默認(rèn)得數(shù)值項(xiàng)說(shuō)明。除了根元素<manifest>得屬性,所有其她元素屬性得名字都就是以android:為前綴得。定義類名:所有得元素名都對(duì)應(yīng)其在SDK中得類名,如果您自己定義類名,必須包含類得數(shù)據(jù)包名,如果類與application處于同一數(shù)據(jù)包中,可以直接簡(jiǎn)寫為“、”。多數(shù)值項(xiàng):如果某個(gè)元素有超過(guò)一個(gè)數(shù)值,這個(gè)元素必須通過(guò)重復(fù)得方式來(lái)說(shuō)明其某個(gè)屬性具有多個(gè)數(shù)值項(xiàng),且不能將多個(gè)數(shù)值項(xiàng)一次性說(shuō)明在一個(gè)屬性中。資源項(xiàng)說(shuō)明:當(dāng)需要引用某個(gè)資源時(shí),其采用如下格式:@[package:]type:name。例如<activityandroid:icon=”@drawable/icon”、、、>。字符串值:類似于其她語(yǔ)言,如果字符中包含有字符“\”,則必須使用轉(zhuǎn)義字符“\\”。2、5、2在權(quán)限聲明在智能手機(jī)中就是一種比較常見(jiàn)得應(yīng)用程序保護(hù)機(jī)制,其基本思想就是通過(guò)AndroidManifest、xml文件中顯式地聲明應(yīng)用程序需要得權(quán)限,防止應(yīng)用程序錯(cuò)誤地使用服務(wù),不恰當(dāng)訪問(wèn)資源,最終達(dá)到提高Android應(yīng)用程序得健壯性,改善用戶體驗(yàn)得目得。Android中每種權(quán)限都用一個(gè)獨(dú)立得標(biāo)簽表示,
如:android、permission、SEND_SMS,android、permission、CALL_PHONE。如果需要使用發(fā)短信得權(quán)限,應(yīng)使用如下標(biāo)簽:<uses-permissionandroid:name=“android、permission、SEND_SMS”/>。Android系統(tǒng)定義得所有權(quán)限可以在類
Manifest、permission中找到。需要注意得就是,在Manifest、permission類中表示發(fā)短信權(quán)限得變量就是SEND_SMS,用戶在AndroidManifest、xml中聲明使用權(quán)限就是應(yīng)在SEND_SMS前加上前綴
android、permission
。除了Android自帶得權(quán)限以外,應(yīng)用程序還可以對(duì)自己得組件進(jìn)行權(quán)限聲明,以保護(hù)其她應(yīng)用程序不亂用自己得組件。聲明本組件被其她組件調(diào)用時(shí)得權(quán)限,使用如下標(biāo)簽:<permissionandroid:name=“”/>。【課堂實(shí)訓(xùn)2-4】通過(guò)helloWord程序認(rèn)知AndroidManifest、xml文件。在第一章我們編寫了一個(gè)簡(jiǎn)單得Android程序HelloAndroid。我們按照建立這個(gè)應(yīng)用程序得步驟再建立一個(gè)程序HelloWorld,幾乎一模一樣,就就是名稱變了。具體步驟參考第一章。項(xiàng)目建立完可以瞧到如下目錄結(jié)構(gòu),其中有AndroidManifest、
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工合同擔(dān)保書
- 物業(yè)使用權(quán)轉(zhuǎn)讓協(xié)議書格式
- 在線輔導(dǎo)合同模板
- 學(xué)生與學(xué)校入學(xué)合同協(xié)議書
- 服務(wù)外包技術(shù)支持框架
- 設(shè)計(jì)合同解除合同解除合同案例分析
- 軟件開(kāi)發(fā)及外包服務(wù)
- 二手房買賣合同的權(quán)益保護(hù)指南
- 員工外出安全管理規(guī)定
- 房屋買賣合同的簽訂步驟與方法
- 《概率論與數(shù)理統(tǒng)計(jì)》教材
- 高等傳熱學(xué)全冊(cè)課件
- 橙子主題課程設(shè)計(jì)
- 靜脈留置針?biāo)蚂o脈炎的標(biāo)準(zhǔn)化護(hù)理預(yù)防流程
- 常住人口登記表(集體戶口)-英文翻譯
- ??啤斗ɡ韺W(xué)》(第三版教材)形成性考核試題及答案
- 人教版2024年新教材七年級(jí)上冊(cè)英語(yǔ)各單元考點(diǎn)復(fù)習(xí)提綱
- 山東省物業(yè)管理?xiàng)l例
- 一年級(jí)小學(xué)數(shù)學(xué)下冊(cè)應(yīng)用題800道
- 第八章《運(yùn)動(dòng)和力》大單元教學(xué)設(shè)計(jì) -2023-2024學(xué)年人教版物理八年級(jí)下學(xué)期
- 12D401-3 爆炸危險(xiǎn)環(huán)境電氣線路和電氣設(shè)備安裝
評(píng)論
0/150
提交評(píng)論