Android平臺應(yīng)用軟件開發(fā)課件:Android中的四大組件_第1頁
Android平臺應(yīng)用軟件開發(fā)課件:Android中的四大組件_第2頁
Android平臺應(yīng)用軟件開發(fā)課件:Android中的四大組件_第3頁
Android平臺應(yīng)用軟件開發(fā)課件:Android中的四大組件_第4頁
Android平臺應(yīng)用軟件開發(fā)課件:Android中的四大組件_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Android中的四大組件7.1Activity組件7.2BroadcastReceiver組件7.3Service組件7.4ContentProvider組件

7.1Activity組件

Activity一般稱為“活動”,在應(yīng)用程序中一個Activity通常就是一個單獨的屏幕。每一個活動都被實現(xiàn)為一個獨立的類,并且從Activity基類中繼承而來。活動類將會顯示由視圖控件組成的用戶接口,并對事件作出響應(yīng)。Activity窗口內(nèi)的可見內(nèi)容通過基類View提供。使用Activity.setContentView()方法設(shè)置當前Activity中的View對象。

7.1.1Activity的生命周期

Activity是Android程序與用戶交互的窗口,從這個層面的視角來看,Android的Activity就像網(wǎng)站中的頁面。對于這樣一個用來與用戶進行交互的界面,其經(jīng)歷著創(chuàng)建實例、初始化、銷毀實例等過程,整個過程稱為Activity的生命周期。圖7-1顯示了Activity在整個生命周期過程中的重要狀態(tài)轉(zhuǎn)換,矩形框表明Activity在狀態(tài)轉(zhuǎn)換之間的回調(diào)接口,開發(fā)人員可以重載實現(xiàn)以便執(zhí)行相關(guān)代碼,帶有顏色的橢圓形表明Activity所處的狀態(tài)。圖7-1Activity的生命周期

新建一個Android項目,命名為lifeCycle,在layout布局文件夾中新建兩個布局文件two.xml和three.xml,在源代碼程序包中新建兩個界面文件TwoActivity.java和ThreeActivity.java。整個項目的目錄結(jié)構(gòu)如圖7-2所示。圖7-2lifeCycle項目目錄結(jié)構(gòu)

部署運行本案例,得到如圖7-3所示的運行界面。

查看LogCat日志,觀察MainActivity界面運行時觸發(fā)的三個方法,點擊跳轉(zhuǎn)按鈕進行界面跳轉(zhuǎn),點擊back鍵回到原來界面,觀察幾個界面跳轉(zhuǎn)時生命周期中幾個方法的觸發(fā)。圖7-3lifeCycle項目運行界面

7.1.2Activity的任務(wù)棧

Android通過一種Activity任務(wù)棧的方式來管理Activity。任務(wù)棧既不是某個類型,也不是某一個元素,它是一組Activity組件的組織形式。從用戶的角度看,一個任務(wù)棧就代表了“一個應(yīng)用程序”。一個棧里面放著一組被排列好的相關(guān)的Activity組件。位于棧底的根Activity就是開啟這個任務(wù)棧的Activity組件,一般情況下,就是應(yīng)用程序的主界面。而位于棧頂?shù)腁ctivity組件即代表當前被激活的Activity組件,即前臺可以和用戶進行交互的Activity組件。

當前臺的Activity因為異常或其他原因被銷毀時,處于棧第二層的Activity將被激活,上浮到棧頂。當新的Activity啟動入棧時,原Activity會被壓入到棧的第二層,如圖7-4所示。圖7-4Activity入棧出棧示例

每個Activity組件都有四種不同的入棧模式,可以通過設(shè)置注冊文件中<activity>標簽的launchMode屬性進行設(shè)置。這四種入棧模式是:

(1)?standard模式:每次激活Activity時都會創(chuàng)建Activity,并放入任務(wù)棧中。

(2)?singleTop模式:如果在任務(wù)的棧頂正好存在該Activity的實例,就重用該實例,否則就會創(chuàng)建新的實例并放入棧頂,即使棧中已經(jīng)存在該Activity實例,只要不在棧頂,都會創(chuàng)建實例。

(3)??singleTask模式:如果在棧中已經(jīng)有該Activity的實例,就重用該實例。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中。

(4)?singleInstance模式:在一個新棧中創(chuàng)建Activity實例,并讓多個應(yīng)用共享新棧中的該Activity實例。

7.2BroadcastReceiver組件

BroadcastReceiver,顧名思義就是“廣播接收器”的意思,它是Android四大基本組件之一,用來接收來自系統(tǒng)和應(yīng)用中的廣播。廣播是一種廣泛運用于應(yīng)用程序之間傳輸信息的機制,多數(shù)的廣播是系統(tǒng)發(fā)起的,如地域變換、電量不足、來電來信等,當然,應(yīng)用程序自己也可以發(fā)出一個廣播。BroadcastReceiver自身并不實現(xiàn)圖形用戶界面。

7.2.1創(chuàng)建BroadcastReceiver

要創(chuàng)建自己的廣播接收器對象,只需要創(chuàng)建一個BroadcastReceiver的子類后重寫onReceive(Contextcontext,Intentintent)方法即可。onReceive()方法就是當接收到相應(yīng)的廣播時觸發(fā)的方法。一個廣播接收器不可能接收所有的廣播,因此對于每一個廣播接收器來說,都要為其注冊要接收廣播的類型。為廣播接收器注冊接收廣播的類型有兩種方法。

第一種是靜態(tài)注冊,這種方法是在配置文件

AndroidManifest.xml中注冊。

第二種是動態(tài)注冊,這種方法是通過代碼在.Java文件中進行注冊。

7.2.2廣播接收器的生命周期

BroadcastReceiver的生命周期是短暫的,當一個廣播消息到達廣播接收器時,Android調(diào)用它的onReceive()方法并傳遞給它包含消息的Intent對象。onReceive()方法執(zhí)行完成之后,BroadcastReceiver的生命周期就結(jié)束了。另外,每次廣播被接收后會重新創(chuàng)建BroadcastReceiver對象,并在onReceive()方法中執(zhí)行完就銷毀,如果BroadcastReceiver的onReceive()方法中不能在10秒內(nèi)執(zhí)行完成,Android會認為該程序無響應(yīng),出現(xiàn)ANR異常。所以在BroadcastReceiver的onReceive()方法中不能做一些比較耗時的操作。

這里也不能在onReceive()方法中創(chuàng)建子線程來解決問題,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結(jié)束BroadcastReceiver就先結(jié)束了,BroadcastReceiver一旦結(jié)束,BroadcastReceiver所在的進程很容易在系統(tǒng)需要內(nèi)存時被優(yōu)先殺死,因為它屬于空進程,即沒有任何活動組件的進程。如果它的宿主進程被殺死,那么正在工作的子線程也會被殺死。所以采用子線程來解決是不可靠的。

7.2.3廣播的類型和發(fā)送

廣播的類型有兩種:普通廣播和有序廣播。

Normalbroadcasts(普通廣播)可以完全異步地在同一時間被所有的接收器接收到,消息的傳遞效率比較高。但缺點是接收器不能將接收的消息的處理信息傳遞給下一個接收器,也不能停止消息的傳播。

Orderedbroadcasts(有序廣播)的接收器按照一定的優(yōu)先級接收消息。

7.2.4廣播接收器案例

新建一個Android項目,命名為broadcast,打開main.xml布局文件進行布局設(shè)置,布局界面如圖7-5所示。圖7-5廣播接收器項目運行界面

屬性代碼解釋:

(1)?android:text="@string/title",引用資源文件夾下string.xml文件中的title標簽內(nèi)容,為TextView控件設(shè)置顯示文本內(nèi)容。

(2)?android:text="@string/send",引用資源文件夾下string.xml文件中的send標簽內(nèi)容,為Button控件設(shè)置顯示文本內(nèi)容。

(3)?android:hint="@string/content",引用資源文件夾下string.xml文件中的content標簽內(nèi)容,為EditText控件設(shè)置默認提示信息。

(4)?android:onClick="sendCast",為Button控件設(shè)置點擊時觸發(fā)的方法。

運行部署本案例,在界面的EditText控件中輸入廣播的內(nèi)容,點擊發(fā)送廣播按鈕,會彈出toast界面顯示廣播內(nèi)容,說明發(fā)出的廣播被我們自定義的廣播接收器MyBroadcastReceiver接收到。重啟模擬器,可以發(fā)現(xiàn)只要系統(tǒng)啟動完成,就會自動啟動本案例Activity界面,說明系統(tǒng)啟動完成的廣播被BootReceiver接收到。

7.3Service組件Service是Android中另外一個常用的組件。Service與Activity不同,它沒有運行界面,不能與用戶進行交互,是運行于后臺的服務(wù)。注意這個“運行于后臺”是指不可見,沒有與用戶交互的界面,而不是指運行在后臺進程中。Android系統(tǒng)中,將進程分為五個級別,分別是前臺進程、可見進程、服務(wù)進程、后臺進程和空進程,前臺進程優(yōu)先級別最高,依次是可見進程、服務(wù)進程、后臺進程,空進程優(yōu)先級別最低。級別越低的進程會在系統(tǒng)內(nèi)存告急的時候優(yōu)先被系統(tǒng)回收。前臺進程的優(yōu)先級最高,所以基本不可能被回收。后臺進程優(yōu)先級不高,是很容易被系統(tǒng)回收的進程。

7.3.1Service的分類

Service按照類型分為前臺服務(wù)和后臺服務(wù)。前臺服務(wù)有個很明顯的標志就是在任務(wù)欄有個通知(notification),就像“天天動聽”后臺播放音樂那樣。而后臺服務(wù)在通知欄上是沒有任何顯示的,只有在應(yīng)用程序管理器中才能看到它。默認情況下創(chuàng)建的都是后臺服務(wù),比如日期同步、郵件同步等操作。

Service還可以分為本地服務(wù)和遠程服務(wù)。本地服務(wù)是指服務(wù)與啟動服務(wù)的組件在同一個應(yīng)用程序或同一個進程中。

7.3.2創(chuàng)建和啟動Service組件的方法

首先,要創(chuàng)建一個Service子類,該類繼承Android的Service類,重寫該類的onCreate()方法,在onCreate()方法中實現(xiàn)服務(wù)要完成的操作。

Service不能自己啟動,需要通過某個Activity、BroadcastReceiver或者其他Context對象來啟動。啟動/終止服務(wù)的方法有兩種:一種是采用startService()方法啟動服務(wù),采用stopService()方法終止服務(wù);另一種是采用bindService()方法綁定服務(wù)來啟動服務(wù),采用unbindservice()方法解除服務(wù)綁定來終止服務(wù)。

(1)采用startService()啟動服務(wù),服務(wù)啟動后,與啟動組件沒有關(guān)聯(lián),即使啟動組件退出,服務(wù)依然在后臺運行,而采用bindService()方法啟動服務(wù)是將服務(wù)綁定到某一個Activity組件上,如果Activity組件退出,則服務(wù)也會自動終止。

(2)采用startService()啟動服務(wù),服務(wù)與任何組件不關(guān)聯(lián),因此無法調(diào)用服務(wù)中的任何一個自定義方法;而采用bindService()方法綁定服務(wù),服務(wù)與Activity組件綁定,在Activity中可以調(diào)用服務(wù)中的自定義方法。

Service也有生命周期,如圖7-6所示。圖7-6服務(wù)的兩種生命周期

7.3.3Service組件案例

案例分析:對電話進行實時錄音,也就是說一有電話就要進行錄音,這就需要一個長期運行的服務(wù)對電話的狀態(tài)進行監(jiān)控。為了能夠無界面啟動服務(wù),這里采用剛剛學過的BroadcastReceiver組件來啟動服務(wù)。

新建一個Android項目,命名為service。注意,創(chuàng)建項目時不要勾選自動生成Activity的選擇框,這樣才能生成一個沒有界面的Android項目。在源代碼程序包中,創(chuàng)建一個服務(wù)類PhoneListenerService和一個廣播接收器BootBroadcastReceiver,其代碼。

部署運行本案例,重啟模擬器,從設(shè)置中查看服務(wù)已被開啟,如圖7-7所示,此時只要有電話打進,就可對電話的內(nèi)容進行錄音。圖7-7查看服務(wù)開啟的界面

7.4ContentProvider組件

Android的數(shù)據(jù)存儲有多種方式,例如有SharedPreferences、網(wǎng)絡(luò)存儲、文件存儲、SQLite數(shù)據(jù)庫存儲。但是這些存儲方式存儲的數(shù)據(jù)一般只屬于自己所在的應(yīng)用程序,其他應(yīng)用程序不能訪問。而在Android軟件開發(fā)中,往往很多場景需要操作其他應(yīng)用程序的一些數(shù)據(jù),例如我們需要獲取通訊錄應(yīng)用程序中所有聯(lián)系人的信息,這就需要跨進程訪問數(shù)據(jù),這種情況可以通過ContentProvider組件來實現(xiàn)

7.4.1Uri類介紹

Uri是每一個ContentProvider都對外提供的一個能夠唯一標識自己數(shù)據(jù)集的資源標識符,如果一個ContentProvider管理多個數(shù)據(jù)集,將會為每個數(shù)據(jù)集分配一個獨立的Uri。所有的ContentProvider的Uri由三部分組成,其組成形式是:ContentProvider的scheme+主機名+路徑。

主機名也叫Authority,用于唯一標識這個ContentProvider,外部調(diào)用者可以根據(jù)這個標識找到它。

路徑主要用來表示外部應(yīng)用程序要訪問的數(shù)據(jù)。路徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定,例如:

要操作person表中id為10的記錄,可以構(gòu)建這樣的路徑:/person/10

要操作person表中id為10的記錄的name字段,person/10/name

要操作person表中的所有記錄,可以構(gòu)建這樣的路徑:/person

要操作xxx表中的記錄,可以構(gòu)建這樣的路徑:/xxx

7.4.2UriMatcher類使用介紹

Uri是每一個ContentProvider都對外提供的一個能夠唯一標識自己數(shù)據(jù)集的資源標識符,因此要對ContentProvider提供的數(shù)據(jù)進行操作,首先需要能夠匹配Uri地址。UriMatcher類就是Android系統(tǒng)提供給我們用于匹配Uri的工具類。UriMatcher的匹配過程分為三步。

(1)初始化UriMatcher。

(2)注冊外部應(yīng)用程序能夠匹配的Uri。

(3)對外部應(yīng)用程序傳入的Uri與已經(jīng)注冊的Uri進行匹配。

7.4.3ContentProvider數(shù)據(jù)共享

當應(yīng)用程序需要通過ContentProvider對外共享數(shù)據(jù)時,

第一步需要新建一個類繼承ContentProvider類,并重寫下面的方法:

publicboolean

溫馨提示

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

評論

0/150

提交評論