android概述和環(huán)境搭建_第1頁
android概述和環(huán)境搭建_第2頁
android概述和環(huán)境搭建_第3頁
android概述和環(huán)境搭建_第4頁
android概述和環(huán)境搭建_第5頁
已閱讀5頁,還剩80頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第一章android概述與環(huán)境搭建學(xué)習(xí)目標(biāo)環(huán)境搭建工具的使用程序目錄與AndroidManifestandroid應(yīng)用的基本組件環(huán)境搭建

目標(biāo):熟悉android應(yīng)用程序開發(fā)環(huán)境以及應(yīng)用程序調(diào)試方法。

1.安裝JDK2.安裝SDK3.安裝Eclipse4.安裝ADT插件5.創(chuàng)建AVD1.安裝JDK①到sun官方網(wǎng)站/javase/downloads/index.jsp

下載JDK(1.5以上版本),或由BTG服務(wù)器上獲取,然后安裝。②安裝完成后,將JDK的安裝根目錄配置為環(huán)境變量JAVA_HOME,并在Path環(huán)境變量中添加%JAVA_HOME%\bin和%JAVA_HOME%\lib\tools.jar。2.安裝SDK到Android官方網(wǎng)站/index.html下載獲取。解壓SDK的zip文件到指定目錄,該目錄即作為Android的主目錄。將Android主目錄下的tools目錄添加到Path環(huán)境變量。例:如將下載的SDK解壓到D:\android-sdk-windows-1.6_r1,則在Path環(huán)境變量中添加D:\android-sdk-windows-1.6_r1\tools打開命令行工具輸入android-h,測(cè)試androidSDK是否配置成功。3.安裝Eclipse到eclipse官方網(wǎng)站/downloads/

下載Eclipse4.3.1版(低版本缺少plug-in,后續(xù)步驟可能會(huì)出現(xiàn)問題),也可由BTG服務(wù)器上獲取。解壓縮后即可直接使用。4.安裝ADT插件

ADT全稱Android

Development

Tools,它是一款用于開發(fā)android應(yīng)用程序的eclipse插件,由于Android的官方網(wǎng)站需要翻墻,以下我們采用離線安裝的方式。到Google官方地址/android/ADT-22.3.0.zip下載ADT離線包。打開eclipse,按以下步驟安裝ADT插件:先點(diǎn)擊help再點(diǎn)擊InstallNewSoftware在彈出的界面點(diǎn)擊此處的Add單擊Archive在“打開”窗口找到剛剛下載的ADT,并點(diǎn)擊“打開”點(diǎn)擊OK勾選DeveloperTools并點(diǎn)擊Next開始安裝當(dāng)安裝過程中彈出此界面時(shí),點(diǎn)擊Next繼續(xù)安裝先選中此單選按鈕再點(diǎn)擊Finish按鈕,繼續(xù)安裝當(dāng)彈出此界面時(shí)點(diǎn)擊OK,繼續(xù)安裝點(diǎn)擊Yes,完成安裝重啟Eclipse后彈出此界面,點(diǎn)擊OpenPreferences在Preferences在右邊的SDKLocation輸入框中輸入SDK的根目錄,然后單擊右下角的OK按鈕。至此,Android開發(fā)環(huán)境配置完成。5.創(chuàng)建AVD

AVD全稱AndroidVirturalDevice(android模擬器),在androidSDK1.5版本后的android開發(fā)中必須至少創(chuàng)建1個(gè)AVD。打開eclipse,按以下步驟創(chuàng)建AVD:1.選擇Window>AndroidVirtualDeviceManager菜單。在打開的AndroidVirtualDeviceManager點(diǎn)擊窗口右側(cè)的New…按鈕。在彈出的窗口中輸入AVD的名字并選擇需要的設(shè)備型號(hào)和Android版本,然后點(diǎn)擊OK按鈕。點(diǎn)擊新建的AVD(模擬器),再點(diǎn)擊窗口右方的Start按鈕點(diǎn)擊Launch按鈕,運(yùn)行模擬器模擬器運(yùn)行后效果:小練習(xí):按照上面講到的方法自己配置一下Android開發(fā)環(huán)境,并通過Eclipse運(yùn)行模擬器Eclipse的使用Eclipse菜單欄簡(jiǎn)單介紹創(chuàng)建第一個(gè)Android項(xiàng)目——hello,world!Eclipse菜單欄

(File菜單)(Edit菜單)創(chuàng)建第一個(gè)Android項(xiàng)目——hello,world!1.選擇File>New>AndroidApplicationProject菜單。如圖2.給項(xiàng)目命名并設(shè)置好相關(guān)參數(shù),然后點(diǎn)擊Next繼續(xù)。如圖3.點(diǎn)擊Next,繼續(xù)4.點(diǎn)擊Next,繼續(xù)4.此處默認(rèn),點(diǎn)擊Next,繼續(xù)5.設(shè)置好內(nèi)容,點(diǎn)擊Finish,完成創(chuàng)建運(yùn)行新建的程序模擬器中運(yùn)行效果程序目錄與AndroidManifest

程序目錄結(jié)構(gòu)說明描述文件AndroidManifest.xml說明程序目錄結(jié)構(gòu)說明1.src目錄src目錄中存放的是該項(xiàng)目的源代碼,其內(nèi)部結(jié)構(gòu)會(huì)根據(jù)用戶所聲明的包自動(dòng)組織,該目錄的組織方式為src/com/soarsky/activity/movie/LoginActivity.java,其中com/soarsky為包名,軟件開發(fā)人員在項(xiàng)目開發(fā)過程中,大部分時(shí)間是對(duì)該目錄下的源代碼文件進(jìn)行編寫。

2.gen目錄

該目錄下的文件全部都是ADT自動(dòng)生成的,一般并不需要去修改,實(shí)際上該目錄下只定義了一個(gè)R.java文件,此文件是應(yīng)用程序資源Resource類,包括控件id,Layout,Strings,Drawable,以方便在整個(gè)應(yīng)用程序中對(duì)資源的使用和統(tǒng)一管理,為項(xiàng)目中用戶界面、字符串、圖片等資源都會(huì)在該類中創(chuàng)建其惟一的ID,當(dāng)項(xiàng)目中使用這些資源時(shí),會(huì)通過該ID得到資源的引用。3.Android2.x

該目錄中存放的是該項(xiàng)目支持的jar包,同時(shí)其中還包含項(xiàng)目打包時(shí)需要的META-INF目錄。

4.assets目錄

該目錄用于存放項(xiàng)目相關(guān)的資源文件,例如文本文件等,在程序中可以使用getResources.getAssets().open("text.txt")得到資源文件的輸入流InputStream對(duì)象。5.Bin目錄

該目錄用于存放編譯后文件,如:classes.dex為代碼編譯后的文件。***.apk為編譯打包后的安裝程序包。Bin/res文件夾存放圖片、布局等資源。6.res目錄drawable文件夾分別放的是高(h)、低(l)、中(m)不同分辨率的圖片,即為了兼容或者說讓應(yīng)用程序在不同分辨率下的機(jī)器上更好的呈現(xiàn),一般一張圖片要弄三張不同分辨率的放在這三個(gè)文件夾下,如:應(yīng)用程序的圖標(biāo)或其中所用到的圖片,應(yīng)用程序在啟動(dòng)時(shí)會(huì)根據(jù)當(dāng)前機(jī)器(客戶端)的分辨率采用合適的一張圖片;放在drawable文件夾下的圖片會(huì)自動(dòng)在R.java文件的drawable類生成一個(gè)相應(yīng)的變量,代碼如下:publicstaticfinalclassdrawable{publicstaticfinalinttitlebarimage=0x7f020001;publicstaticfinalintbtn_pressed_back=0x7f020002;publicstaticfinalintbtn_pressed_detail=0x7f020003;publicstaticfinalintbtn_pressedfalse_back=0x7f020004;publicstaticfinalintbutton_bg_b=0x7f020005;publicstaticfinalintbutton_pressed_1=0x7f020006;publicstaticfinalintbutton_pressedfalse_1=0x7f020007;publicstaticfinalintbutton_pressedxml=0x7f020008;publicstaticfinalintbutton_pressedxml1=0x7f020009;}layout文件夾下放的是視圖布局文件,可以理解為跟.net中.aspx文件類似—界面布局文件,那就會(huì)有朋友問了:每個(gè)內(nèi)容視圖文件的代碼控制類是如何與之關(guān)聯(lián)的?這個(gè)需要在每個(gè)Activity類的onCreate方法中通過方法setContentView(ID);設(shè)置。publicstaticfinalclasslayout{publicstaticfinalintabout=0x7f030000;publicstaticfinalintmain=0x7f03000f;}如:setContentView(R.layout.about);values文件夾下放的是當(dāng)前應(yīng)用程序中使用到的字符串—以鍵值對(duì)的形式存放,如:應(yīng)用程序的名稱、按鈕等提示文本,這樣做的好處是:將文本字符串與代碼分離,方便做國(guó)際化,如你現(xiàn)在做的應(yīng)用程序針對(duì)的是中國(guó)用戶,當(dāng)你想增加個(gè)日本或英文版本時(shí),你只需要在values文件夾下增加相應(yīng)國(guó)際化的strings.xml文件即可!描述文件AndroidManifest.xml說明主要包含功能:

1說明application的java數(shù)據(jù)包,數(shù)據(jù)包名是application的唯一標(biāo)識(shí);2描述application的component;3說明application的component運(yùn)行在哪個(gè)process下;4聲明application所必須具備的權(quán)限,用以訪問受保護(hù)的部分API,以及與其他application的交互;5聲明application其他的必備權(quán)限,用以component之間的交互;6列舉application運(yùn)行時(shí)需要的環(huán)境配置信息,這些聲明信息只在程序開發(fā)和測(cè)試時(shí)存在,發(fā)布前將被刪除;7聲明application所需要的AndroidAPI的最低版本級(jí)別,比如1.0,1.1,1.5;8列舉application所需要鏈接的庫(kù);結(jié)構(gòu)和規(guī)則

AndroidManifest.xml文件的結(jié)構(gòu)、元素,以及元素的屬性,可以在AndroidSDK文檔中查看詳細(xì)說明。而在看這些眾多的元素以及元素的屬性前,需要先了解一下這些元素在命名、結(jié)構(gòu)等方面的規(guī)則:

元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出現(xiàn)一次。如果一個(gè)元素包含有其他子元素,必須通過子元素的屬性來設(shè)置其值。處于同一層次的元素,這些元素的說明是沒有順序的。

屬性:按照常理,所有的屬性都是可選的,但是有些屬性是必須設(shè)置的。那些真正可選的屬性,即使不存在,其也有默認(rèn)的數(shù)值項(xiàng)說明。除了根元素<manifest>的屬性,所有其他元素屬性的名字都是以android:前綴的;

定義類名:所有的元素名都對(duì)應(yīng)其在SDK中的類名,如果你自己定義類名,必須包含類的數(shù)據(jù)包名,如果類與application處于同一數(shù)據(jù)包中,可以直接簡(jiǎn)寫為“.”;

多數(shù)值項(xiàng):如果某個(gè)元素有超過一個(gè)數(shù)值,這個(gè)元素必須通過重復(fù)的方式來說明其某個(gè)屬性具有多個(gè)數(shù)值項(xiàng),且不能將多個(gè)數(shù)值項(xiàng)一次性說明在一個(gè)屬性中;

資源項(xiàng)說明:當(dāng)需要引用某個(gè)資源時(shí),其采用如下格式:@[package:]type:name。例如<activityandroid:icon=”@drawable/icon”…>字符串值:類似于其他語言,如果字符中包含有字符“\”,則必須使用轉(zhuǎn)義字符“\\”;實(shí)例說明AndroidManifest.xml文件1)除去頭部XML信息說明,首先是manifest項(xiàng)—根節(jié)點(diǎn),其屬性包括:地址、包名,以及程序的版本說明。2)其次是manifest的子節(jié)點(diǎn)application,其屬性包括:程序圖標(biāo)、程序名稱。前面帶有@表示引用資源,例如:@drawable/icon表示引用的是drawable資源中的icon,可以在其源工程的res/drawable中找到3)然后就是application的子節(jié)點(diǎn)activity,其屬性包括:activity的名稱、activity的標(biāo)簽名,其子節(jié)點(diǎn)intent-filter則是對(duì)activity的說明。4)而在intent-filter中,actionandroid:name=”ent.action.MAIN”和categoryandroid:name=”ent.category.LAUNCHER”用以說明程序啟動(dòng)時(shí)的入口activity是哪個(gè)。如果這兩個(gè)屬性值中分別含有MAIN和LAUNCHER,則說明它就是啟動(dòng)程序時(shí)的入口活動(dòng)。5)uses-sdkandroid:minSdkVersion=”4″說明程序使用的AndroidSDK的最低版本,其中1表示Android1.0,2表示Android1.1,而3則表示Android1.5在Eclipse中創(chuàng)建工程后,會(huì)自動(dòng)生成一個(gè)AndroidManifest.xml文件。在代碼編寫的過程中,需要同時(shí)修改AndroidManifest.xml,如果配置出現(xiàn)錯(cuò)誤會(huì)導(dǎo)致程序不能正常運(yùn)行。manifest根節(jié)點(diǎn),描述了package中所有的內(nèi)容xmlns:android包含命名空間的聲明。xmlns:android=http://schemas./apk/res/android,使得Android中各種標(biāo)準(zhǔn)屬性能在文件中使用,提供了大部分元素中的數(shù)據(jù)Package聲明應(yīng)用程序包application包含package中application級(jí)別組件聲明的根節(jié)點(diǎn)。此元素也可包含application的一些全局和默認(rèn)的屬性,如標(biāo)簽、icon、主題、必要的權(quán)限,等等。一個(gè)manifest能包含零個(gè)或一個(gè)此元素(不能大余一個(gè))android:icon應(yīng)用程序圖標(biāo)android:label應(yīng)用程序名字Activity用來與用戶交互的主要工具。Activity是用戶打開一個(gè)應(yīng)用程序的初始頁面,大部分被使用到的其他頁面也由不同的activity所實(shí)現(xiàn),并聲明在另外的activity標(biāo)記中。注意,每一個(gè)activity必須有一個(gè)<activity>標(biāo)記對(duì)應(yīng),無論它給外部使用或是只用于自己的package中。如果一個(gè)activity沒有對(duì)應(yīng)的標(biāo)記,你將不能運(yùn)行它。另外,為了支持運(yùn)行時(shí)查找Activity,可包含一個(gè)或多個(gè)<intent-filter>元素來描述activity所支持的操作android:name應(yīng)用程序默認(rèn)啟動(dòng)的activityintent-filter聲明了指定的一組組件支持的Intent值,從而形成了IntentFilter。除了能在此元素下指定不同類型的值,屬性也能放在這里來描述一個(gè)操作所需的唯一的標(biāo)簽、icon和其他信息action組件支持的Intentactioncategory組件支持的IntentCategory。這里指定了應(yīng)用程序默認(rèn)啟動(dòng)的activityuses-sdk該應(yīng)用程序所使用的sdk版本相關(guān)android應(yīng)用的基本組件ActivityService服務(wù)ContentProvider內(nèi)容提供者BroadcastReceiver消息廣播Activity:應(yīng)用程序中,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕,它上面可以顯示一些控件也可以監(jiān)聽并處理用戶的事件做出響應(yīng)。Activity之間通過Intent進(jìn)行通信。在Intent的描述結(jié)構(gòu)中,有兩個(gè)最重要的部分:動(dòng)作和動(dòng)作對(duì)應(yīng)的數(shù)據(jù)。典型的動(dòng)作類型有:MAIN(activity的門戶)、VIEW、PICK、EDIT等。而動(dòng)作對(duì)應(yīng)的數(shù)據(jù)則以URI的形式進(jìn)行表示。例如:要查看一個(gè)人的聯(lián)系方式,你需要?jiǎng)?chuàng)建一個(gè)動(dòng)作類型為VIEW的intent,以及一個(gè)表示這個(gè)人的URI。與之有關(guān)系的一個(gè)類叫IntentFilter。相對(duì)于intent是一個(gè)有效的做某事的請(qǐng)求,一個(gè)intentfilter則用于描述一個(gè)activity(或者IntentReceiver)能夠操作哪些intent。一個(gè)activity如果要顯示一個(gè)人的聯(lián)系方式時(shí),需要聲明一個(gè)IntentFilter,這個(gè)IntentFilter要知道怎么去處理VIEW動(dòng)作和表示一個(gè)人的URI。IntentFilter需要在AndroidManifest.xml中定義。通過解析各種intent,從一個(gè)屏幕導(dǎo)航到另一個(gè)屏幕是很簡(jiǎn)單的。當(dāng)向前導(dǎo)航時(shí),activity將會(huì)調(diào)用startActivity(IntentmyIntent)方法。然后,系統(tǒng)會(huì)在所有安裝的應(yīng)用程序中定義的IntentFilter中查找,找到最匹配myIntent的Intent對(duì)應(yīng)的activity。新的activity接收到myIntent的通知后,開始運(yùn)行。當(dāng)startActivity方法被調(diào)用將觸發(fā)解析myIntent的動(dòng)作,這個(gè)機(jī)制提供了兩個(gè)關(guān)鍵好處:

A、Activities能夠重復(fù)利用從其它組件中以Intent的形式產(chǎn)生的一個(gè)請(qǐng)求;

B、Activities可以在任何時(shí)候被一個(gè)具有相同IntentFilter的新的Activity取代。

AndroidManifest文件中含有如下過濾器的Activity組件為默認(rèn)啟動(dòng)類當(dāng)程序啟動(dòng)時(shí)系統(tǒng)自動(dòng)調(diào)用它<intent-filter><actionandroid:name="ent.action.MAIN"/><category

android:name="ent.category.LAUNCHER"/></intent-filter>

Activity生命周期Activity的整個(gè)生命周期都定義在下面的接口方法中,所有方法都可以被重載。所有的Activity都需要實(shí)現(xiàn)onCreate(Bundle)去初始化設(shè)置,大部分Activity需要實(shí)現(xiàn)onPause()去提交更改過的數(shù)據(jù),當(dāng)前大部分的Activity也需要實(shí)現(xiàn)onFreeze()接口,以便恢復(fù)在onCreate(Bundle)里面設(shè)置的狀態(tài)。publicclassActivityextendsApplicationContext{protectedvoidonCreate(Bundleicicle);protectedvoidonStart();protectedvoidonRestart();protectedvoidonResume();protectedvoidonFreeze(BundleoutIcicle);protectedvoidonPause();protectedvoidonStop();protectedvoidonDestroy();}詳細(xì)介紹一下這幾個(gè)方法中系統(tǒng)在做什么以及我們應(yīng)該做什么:onCreate:當(dāng)活動(dòng)第一次啟動(dòng)的時(shí)候,觸發(fā)該方法,可以在此時(shí)完成活動(dòng)的初始化工作。onStart:該方法的觸發(fā)表示所屬活動(dòng)將被展現(xiàn)給用戶。onResume:當(dāng)一個(gè)活動(dòng)和用戶發(fā)生交互的時(shí)候,觸發(fā)該方法。onPause:當(dāng)一個(gè)正在前臺(tái)運(yùn)行的活動(dòng)因?yàn)槠渌幕顒?dòng)需要前臺(tái)運(yùn)行而轉(zhuǎn)入后臺(tái)運(yùn)行的時(shí)候,觸發(fā)該方法。這時(shí)候需要將活動(dòng)的狀態(tài)持久化,比如正在編輯的數(shù)據(jù)庫(kù)記錄等。onStop:當(dāng)一個(gè)活動(dòng)不再需要展示給用戶的時(shí)候,觸發(fā)該方法。如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng),而不會(huì)觸發(fā)onStop方法。所以保存狀態(tài)信息是應(yīng)該在onPause時(shí)做,而不是onStop時(shí)做?;顒?dòng)如果沒有在前臺(tái)運(yùn)行,都將被停止或者Linux管理進(jìn)程為了給新的活動(dòng)預(yù)留足夠的存儲(chǔ)空間而隨時(shí)結(jié)束這些活動(dòng)。因此對(duì)于開發(fā)者來說,在設(shè)計(jì)應(yīng)用程序的時(shí)候,必須時(shí)刻牢記這一原則。在一些情況下,onPause方法或許是活動(dòng)觸發(fā)的最后的方法,因此開發(fā)者需要在這個(gè)時(shí)候保存需要保存的信息。onRestart:當(dāng)處于停止?fàn)顟B(tài)的活動(dòng)需要再次展現(xiàn)給用戶的時(shí)候,觸發(fā)該方法。onDestroy:當(dāng)活動(dòng)銷毀的時(shí)候,觸發(fā)該方法。和onStop方法一樣,如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng)而不會(huì)觸發(fā)該方法。Activity常見應(yīng)用1啟動(dòng)一個(gè)Activity

一個(gè)activity可以啟動(dòng)另外一個(gè),甚至包括與它不處于同一應(yīng)用程序之中的。舉個(gè)例子說,假設(shè)你想讓用戶看到某個(gè)地方的街道地圖。而已經(jīng)存在一個(gè)具有此功能的activity了,那么你的activity所需要做的工作就是把請(qǐng)求信息放到一個(gè)Intent對(duì)象里面,并把它傳遞給startActivity()。于是地圖瀏覽器就會(huì)顯示那個(gè)地圖。而當(dāng)用戶按下BACK鍵的時(shí)候,你的activity又會(huì)再一次的顯示在屏幕上。//顯示方式聲明Intent,直接啟動(dòng)SecondActivityIntentintent=newIntent(FirstActivity.this,SecondActivity.class);startActivity(intent);2Activity之間傳遞數(shù)據(jù)如何在Activity中調(diào)用另一個(gè)Activity,但若需要在調(diào)用另外一個(gè)Activity的同時(shí)傳遞數(shù)據(jù),那么就需要利用android.os.Bundle對(duì)象封裝數(shù)據(jù)的能力,將欲傳遞的數(shù)據(jù)或參數(shù),通過Bundle來傳遞不同Intent之間的數(shù)據(jù)。相當(dāng)于web開發(fā)中用session等等進(jìn)行參數(shù)傳遞一樣。

利用Intent傳遞數(shù)據(jù)傳遞數(shù)據(jù)的Activity中:Intentintent=newIntent();intent.putExtra("name","Jon");//在Intent中加入鍵值對(duì)數(shù)據(jù)。鍵:name,值:Jonintent.setClass(Activity01.this,Activity02.class);Activity01.this.startActivity(intent);在取出數(shù)據(jù)的Activity中:Intentintent=getIntent();//獲得傳過來的Intent。Stringvalue=intent.getStringExtra("name");//根據(jù)鍵name取出值。利用Bundle傳遞數(shù)據(jù),傳遞數(shù)據(jù)的Activity:Intentintent=newIntent();BundlemyBundle=newBundle();myBundle.putString("Key_Name","Tom");intent.putExtras(myBundle);intent.setClass(Activity01.this,Activity02.class);Activity01.this.startActivity(intent);取出數(shù)據(jù)的Activity:BundlegetBundle=getIntent().getExtras();Stringvalue=getBundle.getString("Key_Name");利用startActivityForResult傳遞數(shù)據(jù)startActivityForResult可以把數(shù)據(jù)傳過去,還可以把那邊的數(shù)據(jù)傳過來。傳遞數(shù)據(jù)的Activity中:Intentintent=newIntent();Bundlebundle=newBundle();bundle.putString("data","somedata");//把數(shù)據(jù)傳過去intent.putExtras(bundle);intent.setClass(Activity01.this,Activity02.class);startActivityForResult(intent,10);//10是一個(gè)代碼重載onActivityResult方法,用來接收傳過來的數(shù)據(jù):protectedvoidonActivityResult(intrequestCode,intresultCode,Intentintent){switch(resultCode){caseRESULT_OK:Bundleb=intent.getExtras();Stringstr=b.getString("Result");setTitle("Returndata:"+str);break;default:break;}}接收數(shù)據(jù)的Activity:Intentintent=getIntent();BundlegetBundle=getIntent().getExtras();Stringdata=getBundle.getString("data");//讀取傳過來的數(shù)據(jù)et.setText(data);EditTextedittext=(EditText)findViewById(R.id.text);Intentintent=newIntent();//實(shí)例化一個(gè)Intent用來傳過去,可以在Intent里存放數(shù)據(jù)。Bundlebundle=newBundle();bundle.putString("Result",edittext.getText().toString());intent.putExtras(bundle);Activity02.this.setResult(RESULT_OK,intent);//把Intent(數(shù)據(jù))傳過去,RESULT_OK是請(qǐng)求碼。finish();//結(jié)束當(dāng)前的Activity。Service服務(wù):一個(gè)Service是一段長(zhǎng)生命周期的,沒有用戶界面的程序,可以用來開發(fā)如監(jiān)控類程序。比較好的一個(gè)例子就是一個(gè)正在從播放列表中播放歌曲的媒體播放器。在一個(gè)媒體播放器的應(yīng)用中,應(yīng)該會(huì)有多個(gè)activity,讓使用者可以選擇歌曲并播放歌曲。然而,音樂重放這個(gè)功能并沒有對(duì)應(yīng)的activity,因?yàn)槭褂谜弋?dāng)然會(huì)認(rèn)為在導(dǎo)航到其它屏幕時(shí)音樂應(yīng)該還在播放的。在這個(gè)例子中,媒體播放器這個(gè)activity會(huì)使用Context.startService()來啟動(dòng)一個(gè)service,從而可以在后臺(tái)保持音樂的播放。同時(shí),系統(tǒng)也將保持這個(gè)service一直執(zhí)行,直到這個(gè)service運(yùn)行結(jié)束。另外,我們還可以通過使用Context.bindService()方法,連接到一個(gè)service上(如果這個(gè)service還沒有運(yùn)行將啟動(dòng)它)。當(dāng)連接到一個(gè)service之后,我們還可以service提供的接口與它進(jìn)行通訊。拿媒體播放器這個(gè)例子來說,我們還可以進(jìn)行暫停、重播等操作。Service使用步驟如下

1>繼承service類

2>AndroidManifast.xml配置清單文件中<application>節(jié)點(diǎn)里對(duì)服務(wù)進(jìn)行配置

<servicename=“.SMSService”/>服務(wù)不能自己運(yùn)行,需要通過Contex.startService()或Contex.bindService()啟動(dòng)服務(wù)。

通過startService()方法啟動(dòng)的服務(wù)于調(diào)用者沒有關(guān)系,即使調(diào)用者關(guān)閉了,服務(wù)仍然運(yùn)行想停止服務(wù)要調(diào)用Context.stopService(),此時(shí)系統(tǒng)會(huì)調(diào)用onDestory(),使用此方法啟動(dòng)時(shí),服務(wù)首次啟動(dòng)系統(tǒng)先調(diào)用服務(wù)的onCreate()-->onStart(),如果服務(wù)已經(jīng)啟動(dòng)再次調(diào)用只會(huì)觸發(fā)onStart()方法使用bindService()啟動(dòng)的服務(wù)與調(diào)用者綁定,只要調(diào)用者關(guān)閉服務(wù)就終止,使用此方法啟動(dòng)時(shí),服務(wù)首次啟動(dòng)系統(tǒng)先調(diào)用服務(wù)的onCreate()-->onBind(),如果服務(wù)已經(jīng)啟動(dòng)再次調(diào)用不會(huì)再觸發(fā)這2個(gè)方法,調(diào)用者退出時(shí)系統(tǒng)會(huì)調(diào)用服務(wù)的onUnbind()-->onDestory(),想主動(dòng)解除綁定可使用Contex.unbindService(),系統(tǒng)依次調(diào)用onUnbind()-->onDestory();Service比較流程示意圖

擁有service的進(jìn)程具有較高的優(yōu)先級(jí)

官方文檔告訴我們,Android系統(tǒng)會(huì)盡量保持擁有service的進(jìn)程運(yùn)行,只要在該service已經(jīng)被啟動(dòng)(start)或者客戶端連接(bindService)到它。當(dāng)內(nèi)存不足時(shí),需要保持,擁有service的進(jìn)程具有較高的優(yōu)先級(jí)。

1.如果service正在調(diào)用onCreate,onStartCommand或者onDestory方法,那么用于當(dāng)前service的進(jìn)程則變?yōu)榍芭_(tái)進(jìn)程以避免被killed。

2.如果當(dāng)前service已經(jīng)被啟動(dòng)(start),擁有它的進(jìn)程則比那些用戶可見的進(jìn)程優(yōu)先級(jí)低一些,但是比那些不可見的進(jìn)程更重要,這就意味著service一般不會(huì)被killed.

3.如果客戶端已經(jīng)連接到service(bindService),那么擁有Service的進(jìn)程則擁有最高的優(yōu)先級(jí),可以認(rèn)為service是可見的。

4.如果service可以使用startForeground(int,Notification)方法來將service設(shè)置為前臺(tái)狀態(tài),那么系統(tǒng)就認(rèn)為是對(duì)用戶可見的,并不會(huì)在內(nèi)存不足時(shí)killed。如果有其他的應(yīng)用組件作為Service,Activity等運(yùn)行在相同的進(jìn)程中,那么將會(huì)增加該進(jìn)程的重要性。本地service不需和Activity交互的本地服務(wù)Activity:在AndroidManifest.xml添加:否則啟動(dòng)服務(wù)時(shí)會(huì)提示newIntent找不到"com.demo.SERVICE_DEMO"。

對(duì)于這類不需和Activity交互的本地服務(wù),是使用startService/stopService的最好例子。運(yùn)行時(shí)可以發(fā)現(xiàn)第一次startService時(shí),會(huì)調(diào)用onCreate和onStart,在沒有stopService前,無論點(diǎn)擊多少次startService,都只會(huì)調(diào)用onStart。而stopService時(shí)調(diào)用onDestroy。再次點(diǎn)擊stopService,會(huì)發(fā)現(xiàn)不會(huì)進(jìn)入service的生命周期的,即不會(huì)再調(diào)用onCreate,onStart和onDestroy。而onBind在startService/stopService中沒有調(diào)用。ContentProvider內(nèi)容提供者:ContentProvider(內(nèi)容提供者)是Android中的四大組件之一。主要用于對(duì)外共享數(shù)據(jù),也就是通過ContentProvider把應(yīng)用中的數(shù)據(jù)共享給其他應(yīng)用訪問,其他應(yīng)用可以通過ContentProvider對(duì)指定應(yīng)用中的數(shù)據(jù)進(jìn)行操作。ContentProvider分為系統(tǒng)的和自定義的,系統(tǒng)的也就是例如聯(lián)系人,圖片等數(shù)據(jù)。

以下這段是GoogleDoc中對(duì)ContentProvider的大致概述。

內(nèi)容提供者將一些特定的應(yīng)用程序數(shù)據(jù)供給其它應(yīng)用程序使用。數(shù)據(jù)可以存儲(chǔ)于文件系統(tǒng)、SQLite數(shù)據(jù)庫(kù)或其它方式。內(nèi)容提供者繼承于ContentProvider基類,為其它應(yīng)用程序取用和存儲(chǔ)它管理的數(shù)據(jù)實(shí)現(xiàn)了一套標(biāo)準(zhǔn)方法。然而,應(yīng)用程序并不直接調(diào)用這些方法,而是使用一個(gè)ContentResolver對(duì)象,調(diào)用它的方法作為替代。ContentResolver可以與任意內(nèi)容提供者進(jìn)行會(huì)話,與其合作來對(duì)所有相關(guān)交互通訊進(jìn)行管理。1.ContentProviderAndroid提供了一些主要數(shù)據(jù)類型的ContentProvider,比如音頻、視頻、圖片和私人通訊錄等??稍趘ider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的數(shù)據(jù),當(dāng)然前提是已獲得適當(dāng)?shù)淖x取權(quán)限。

主要方法:publicbooleanonCreate()在創(chuàng)建ContentProvider時(shí)調(diào)用。

publicCursorquery(Uri,String[],String,String[],String)用于查詢指定Uri的ContentProvider,返回一個(gè)Cursor。

publicUriinsert(Uri,ContentValues)用于添加數(shù)據(jù)到指定Uri的ContentProvider中。

publicintupdate(Uri,ContentValues,String,String[])用于更新指定Uri的ContentProvider中的數(shù)據(jù)。

publicintdelete(Uri,String,String[])用于從指定Uri的ContentProvider中刪除數(shù)據(jù)。

publicStringgetType(Uri)用于返回指定的Uri中的數(shù)據(jù)的MIME類型。

如果操作的數(shù)據(jù)屬于集合類型,那么MIME類型字符串應(yīng)該以vnd.android.cursor.dir/開頭。

例如:要得到所有person記錄的Uri為content://contacts/person,那么返回的MIME類型字符串為"vnd.android.cursor.dir/person"。如果要操作的數(shù)據(jù)屬于非集合類型數(shù)據(jù),那么MIME類型字符串應(yīng)該以vnd.android.cursor.item/開頭。例如:要得到id為10的person記錄的Uri為content://contacts/person/10,那么返回的MIME類型字符串應(yīng)為"vnd.android.cursor.item/person"。2.ContentResolver當(dāng)外部應(yīng)用需要對(duì)ContentProvider中的數(shù)據(jù)進(jìn)行添加、刪除、修改和查詢操作時(shí),可以使用ContentResolver類來完成,要獲取ContentResolver對(duì)象,可以使用Context提供的getContentResolver()方法。ContentResolvercr=getContentResolver();ContentResolver提供的方法和ContentProvider提供的方法對(duì)應(yīng)的有以下幾個(gè)方法。

publicUriinsert(Uriuri,ContentValuesvalues)用于添加數(shù)據(jù)到指定Uri的ContentProvider中。//插入聯(lián)系人privatevoidinsert(Personp){ //獲得ContentResolver對(duì)象 ContentResolvercr=getContentResolver(); ContentValuesvalues=newContentValues(); values.put(People.NAME,); //表示是否把聯(lián)系人添加到收藏(加星),1表示加入,0表示不加入,這行代碼注釋默認(rèn)是不加入。 values.put(Contacts.People.STARRED,1); Uriuri=Contacts.People.createPersonInMyContactsGroup(cr,values); //獲得聯(lián)系人People表的Uri Uriurl=Uri.withAppendedPath(uri, Contacts.People.Phones.CONTENT_DIRECTORY); values.clear(); values.put(Contacts.Phones.TYPE,Contacts.Phones.NUMBER); values.put(Contacts.Phones.NUMBER,p.number); //插入操作 cr.insert(url,values); }publicintdelete(Uriuri,Stringselection,String[]selectionArgs)用于從指定Uri的ContentProvider中刪除數(shù)據(jù)。//刪除聯(lián)系人privatevoiddelete(Stringname){ //獲得ContentResolver對(duì)象 ContentResolvercr=getContentResolver(); Uriurl=Contacts.People.CONTENT_URI; //設(shè)置刪除條件 Stringwhere=People.NAME+"=?"; String[]selectionArgs={name}; cr.delete(url,where,selectionArgs);}publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)用于查詢指定Uri的ContentProvider。//查詢聯(lián)系人privateCursorquery(Stringname){ //獲得ContentResolver對(duì)象 ContentResolvercr=getContentResolver(); Uriuri=Contacts.People.CONTENT_URI; //查詢對(duì)象 String[]projection={People._ID,People.NAME,People.NUMBER}; //設(shè)置查詢條件,selection和selectionArgs參數(shù)為null,表示查詢?nèi)繑?shù)據(jù) Stringselection=null; String[]selectionArgs=null; if(!"".equals(name)){ selection=People.NAME+"=?"; selectionArgs=newString[]{name};} //設(shè)置排序條件 StringsortOrder=Contacts.People._ID; Cursorc=cr.query(uri,projection,selection,selectionArgs,sortOrder); returnc; }}3.UriUri指定了將要操作的ContentProvider,其實(shí)可以把一個(gè)Uri看作是一個(gè)網(wǎng)址,我們把Uri分為三部分。如要操作設(shè)備上

所有聯(lián)系人的數(shù)據(jù)。對(duì)應(yīng)Uri如下:content://contacts/people/

第一部分是"content://"。

第二部分是主機(jī)名或authority,用于唯一標(biāo)識(shí)這個(gè)ContentProvider,外部應(yīng)用需要根據(jù)這個(gè)標(biāo)識(shí)來找到它。

第三部分是路徑名,用來表示將要操作的數(shù)據(jù)。BroadcastReceiver消息廣播:廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實(shí)現(xiàn)的。通常一個(gè)廣播Intent可以被訂閱了此Intent的多個(gè)廣播接收者所接收。

廣播是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。而BroadcastReceiver是對(duì)發(fā)送出來的廣播進(jìn)行過濾接收并響應(yīng)的一類組件;來自普通應(yīng)用程序,如一個(gè)應(yīng)用程序通知其他應(yīng)用程序某些數(shù)據(jù)已經(jīng)下載完畢。BroadcastReceiver自身并不實(shí)現(xiàn)圖形用戶界面,但是當(dāng)它收到某個(gè)通知后,BroadcastReceiver可以啟動(dòng)Activity作為響應(yīng),或者通過NotificationMananger提醒用戶,或者啟動(dòng)Service等等。BroadCastReceiver的機(jī)制1.機(jī)制在Android里面有各種各樣的廣播,比如電池的使用狀態(tài),電話的接收和短信的接收都會(huì)產(chǎn)生一個(gè)廣播,應(yīng)用程序開發(fā)者也可以監(jiān)聽這些廣播并做出程序邏輯的處理。如圖:2.實(shí)現(xiàn)

用接收短信舉例:第一種方式:系統(tǒng)注冊(cè):在AndroidManifest.xml中注冊(cè)第二種方式:

//廣播接收者-廣播的接收代碼中注冊(cè):IntentFilterintentFilter=newIntentFilter("vider.Telephony.SMS_RECEIVED");registerReceiver(mBatteryInfoReceiver,intentFilter);3.生命周期下圖描述了Android中廣播的生命周期,它遠(yuǎn)沒有Activity的生命周期那么復(fù)雜:廣播的生命周期只有十秒左右,如果在onReceive()內(nèi)做超過十秒內(nèi)的事情,就會(huì)報(bào)錯(cuò)。

每次廣播到來時(shí),會(huì)重新創(chuàng)建

BroadcastReceiver

對(duì)象,并且調(diào)用onReceive()方法,執(zhí)行完以后,該對(duì)象即被銷毀。當(dāng)onReceive()方法在

10

秒內(nèi)沒有執(zhí)行完畢,Android會(huì)認(rèn)為該程序無響應(yīng)。所以在BroadcastReceiver

里不能做一些比較耗時(shí)的操作,否側(cè)會(huì)彈出

ANR(ApplicationNoResponse)的對(duì)話框。怎么用好

BroadcastReceiver

?如果需要完成一項(xiàng)比較耗時(shí)的工作,應(yīng)該通過發(fā)送Intent給Service,由Service來完成。這里不能使用子線程來解決,因?yàn)锽roadcastReceiver的生命周期很短,子線程可能還沒有結(jié)束。BroadcastReceiver就先結(jié)束了.BroadcastReceiver

一旦結(jié)束,此時(shí)BroadcastReceiver的所在進(jìn)程很容易在系統(tǒng)需要內(nèi)存時(shí)被優(yōu)先殺死,因?yàn)樗鼘儆诳者M(jìn)程(沒有任何活動(dòng)組件的進(jìn)程)。如果它的宿主進(jìn)程被殺死,那么正在工作的子線程也會(huì)被殺死。所以采用子線程來解決是不可靠的。廣播類型

普通廣播(Normalbroadcasts)

發(fā)送一個(gè)廣播,所以監(jiān)聽該廣播的廣播接收者都可以監(jiān)聽到改廣播。異步廣播,當(dāng)處理完之后的Intent,依然存在,這時(shí)候registerRe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論