




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、AndroidAndroid平臺開發(fā)簡介平臺開發(fā)簡介平臺介紹及開發(fā)基本流程2011-42011-4月月什么是Android? Android是Google在2007年11月5日推出的開源手機操作系統(tǒng)。目前Android在中國的發(fā)展是 非?;鸬模瑸榱斯?jié)省研發(fā)費用,國內(nèi)很多的手機廠商和移動運營商紛紛加入到了android陣營,其中包括中國移動,中國聯(lián)通,中國電信,華為,聯(lián)想等大企業(yè)。在中國不管是知名的手機生產(chǎn)廠商還是山寨手機廠商,都已經(jīng)開始生產(chǎn)Android操作系統(tǒng)的手機。另外android應用的范圍不僅僅在手機,還被應用在汽車、平板電腦、和智能上網(wǎng)設(shè)備上,聽說國外已經(jīng)有了安裝有Android系統(tǒng)
2、,并且能夠上網(wǎng)的智能電飯煲,用戶在千里之外就可以操作電飯煲進行煮飯。由于大家大多使用的手機都屬傻瓜手機,也就是打打電話、發(fā)發(fā)短信。從今天開始,大家就應該改變這個觀念了,你們需要把智能手機看作是一臺電腦,它能完成電腦所能完成的一切。所以你可以像在電腦一樣,在智能手機上安裝軟件,以滿足你工作和生活的需要。如何安裝 Android SDK 和Eclipse 插件所需開發(fā)環(huán)境所需開發(fā)環(huán)境:JDK 5或以上版本(僅有JRE不夠) 、Eclipse 3.4 或以上版本,推薦使用“伽利略”版。下載用于在下載用于在Eclipse 開發(fā)開發(fā)android應用的應用的ADT 插件插件 在企業(yè)開發(fā)中,很多程序員使用
3、Eclipse IDE作為應用的開發(fā)環(huán)境。為了使得Android應用的創(chuàng)建,運行和調(diào)試更加方便快捷。Android的開發(fā)團隊專門針對Eclipse IDE定制了一個插件:Android Development Tools(ADT) 下載地址:http:/ Eclipse 插件插件 (ADT)啟動 Eclipse,選擇 Help Install New Software,在出現(xiàn)的對話框里,點擊Add按鈕,在對話框的name一欄輸入“ADT”, 然后點擊Archive.,瀏覽和選擇已經(jīng)下載的ADT插件插件壓縮文件。 點擊 OK.。返回可用軟件的視圖,你會看到這個插件,然后選擇Developer T
4、ools (會選中下面的“Android Developer Tools”和 “Android Editors“),點擊 Next,最后重啟 Eclipse。下載安裝下載安裝Android SDK:Android SDK包含了開發(fā)Android應用所依賴的jar文件、運行環(huán)境及相關(guān)工具。 下載地址: http:/ Eclipse,選擇window-preferences,在打開的視圖左邊點擊android,在右邊的SDK Location中選擇Android SDK所在位置。開發(fā)第一個Android應用打開Eclipse,新建項目(點擊FileNewProject),在項目列表中展開Andro
5、id目錄,選擇Android Project,如下圖:開發(fā)第一個Android應用開發(fā)第一個Android應用點擊”finish”即可完成項目的創(chuàng)建,創(chuàng)建后的項目已經(jīng)是一個可運行的Android應用,我們可以通過下面方式運行此應用:點擊工具欄上機器人形狀的虛擬設(shè)備管理器(簡稱“AVD“),如下:開發(fā)第一個Android應用“尚未注冊網(wǎng)絡”錯誤信息的解決辦法打開Android模擬器時,出現(xiàn)無信號,拔打電話或發(fā)短信時,提示“尚未注冊網(wǎng)絡”錯誤信息的解決方案如下。l 場景一:你的電腦沒有連接上互聯(lián)網(wǎng),同時也沒有在局域網(wǎng)。 解決辦法:右鍵點擊網(wǎng)上鄰居,選擇屬性,在網(wǎng)絡連接窗口中右鍵點擊本地連接,選擇屬
6、性,設(shè)置TCP/IP屬性如下: IP地址:00 子網(wǎng)掩碼: 默認網(wǎng)關(guān):00 首選DNS服務器:00l 場景二:你的電腦沒有連接上互聯(lián)網(wǎng),但在局域網(wǎng)。 解決辦法:右鍵點擊網(wǎng)上鄰居,選擇屬性,在網(wǎng)絡連接窗口中右鍵點擊本地連接,選擇屬性,設(shè)置TCP/IP屬性如下: IP地址:設(shè)置成你所在局域網(wǎng)的IP,如:00 子網(wǎng)掩碼:設(shè)置成你所在局域網(wǎng)的掩碼,如: 默認網(wǎng)關(guān):設(shè)置成你所在局域網(wǎng)的網(wǎng)關(guān),一般網(wǎng)關(guān)的IP格式為:*.*.*.1,如: 首選DNS
7、服務器:設(shè)置成你所在局域網(wǎng)的路由器IP,一般路由器的IP格式為:*.*.*.1,如:l 最后一種解決方案是:讓你的電腦連接上互聯(lián)網(wǎng)。開發(fā)第一個Android應用在項目上右鍵點擊run as Android application,如下圖:Android應用程序架構(gòu)src/ java原代碼存放目錄原代碼存放目錄gen/ 自動生成目錄自動生成目錄gen 目錄中存放所有由Android開發(fā)工具自動生成的文件。目錄中最重要的就是R.java文件。 這個文件由Android開發(fā)工具自動產(chǎn)生的。Android開發(fā)工具會自動根據(jù)你放入res目錄的xml界面文件、圖標與常量,同步更新修改
8、R.java文件。正因為R.java文件是由開發(fā)工具自動生成的,所以我們應避免手工修改R.java。R.java在應用中起到了字典的作用,它包含了界面、圖標、常量等各種資源的id,通過R.java,應用可以很方便地找到對應資源。另外編繹器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編繹進軟件中,這樣可以減少應用在手機占用的空間。res/ 資源資源(Resource)目錄目錄在這個目錄中我們可以存放應用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。assets資源目錄資源目錄Android除了提供/res目錄存放資源文件外,在/assets目錄也可以存放資源文件,而且/
9、assets目錄下的資源文件不會在R.java自動生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑,如:file:/android_asset/xxx.3gpAndroidManifest.xml 項目清單文件項目清單文件 這個文件列出了應用程序所提供的功能,以后你開發(fā)好的各種組件需要在該文件中進行配置,如果應用使用到了系統(tǒng)內(nèi)置的應用(如電話服務、互聯(lián)網(wǎng)服務、短信服務、GPS服務等等),你還需在該文件中聲明使用權(quán)限。perties 項目環(huán)境信息項目環(huán)境信息,一般是不需要修改此文件Android中的顯示單位l px (pixels)像素 一般HVGA代表320
10、 x480像素,這個用的比較多。l dip或dp (device independent pixels)設(shè)備獨立像素 這個和設(shè)備硬件有關(guān),一般為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。l sp (scaled pixels best for text size)比例像素 主要處理字體的大小,可以根據(jù)系統(tǒng)的字體自適應。除了上面三個顯示單位,下面還有幾個不太常用:l in (inches)英寸l mm (millimeters)毫米 l pt (points)點,1/72英寸為了適應不同分辨率,不同的像素密度,推薦使用dip ,文字使用sp。Android開發(fā)平臺是開放的平臺
11、,而位于四層框架頂端的應用開發(fā),必然涉及到Android組件。本文將為大家詳細介紹Android組件。 組件(Component),在談及所謂架構(gòu)和重用的時候,是一個重要的事情。很多時候都會說基于組件的軟件架構(gòu),指的是期望把程序做樂高似的,有一堆接口標準封裝完整的組件放在哪里,想用的時候取上幾個一搭配,整個程序就構(gòu)建完成了。 在開篇的時候就在說,Android是一個為組件化而搭建的平臺,它引入所謂Mash-Up的概念,這使得你在應用的最上層,想做的不組件化都是很困難的一件事,具體說來,Android有四大組件:Activity、Service、Broadcast Receiver、Conten
12、t Provider。 Android四大組建Activity是為用戶操作而展示的可視化用戶界面。比如說,一個activity可以展示一個菜單項列表供用戶選擇,或者顯示一些包含說明的照片。一個短消息應用程序可以包括一個用于顯示做為發(fā)送對象的聯(lián)系人的列表的activity,一個給選定的聯(lián)系人寫短信的activity以及翻閱以前的短信和改變設(shè)置的activity。盡管它們一起組成了一個內(nèi)聚的用戶界面,但其中每個activity都與其它的保持獨立。每個都是以Activity類為基類的子類實現(xiàn)。一個應用程序可以只有一個activity,或者,如剛才提到的短信應用程序那樣,包含很多個。每個activit
13、y的作用,以及其數(shù)目,自然取決于應用程序及其設(shè)計。一般情況下,總有一個應用程序被標記為用戶在應用程序啟動的時候第一個看到的。從一個activity轉(zhuǎn)向另一個的方式是靠當前的activity啟動下一個。每個activity都被給予一個默認的窗口以進行繪制。一般情況下,這個窗口是滿屏的,但它也可以是一個小的位于其它窗口之上的浮動窗口。一個activity也可以使用超過一個的窗口比如,在activity運行過程中彈出的一個供用戶反應的小對話框,或是當用戶選擇了屏幕上特定項目后顯示的必要信息。窗口顯示的可視內(nèi)容是由一系列視圖構(gòu)成的,這些視圖均繼承自 View 基類。每個視圖均控制著窗口中一塊特定的矩形
14、空間。父級視圖包含并組織它子視圖的布局。葉節(jié)點視圖(位于視圖層次最底端)在它們控制的矩形中進行繪制,并對用戶對其直接操作做出響應。所以,視圖是activity與用戶進行交互的界面。比如說,視圖可以顯示一個小圖片,并在用戶指點它的時候產(chǎn)生動作。Android有很多既定的視圖供用戶直接使用,包括按鈕、文本域、卷軸、菜單項、復選框等等。Activity 活動服務沒有可視化的用戶界面,而是在一段時間內(nèi)在后臺運行。比如說,一個服務可以在用戶做其它事情的時候在后臺播放背景音樂、從網(wǎng)絡上獲取一些數(shù)據(jù)或者計算一些東西并提供給需要這個運算結(jié)果的activity使用。每個服務都繼承自Service基類。一個媒體播
15、放器播放播放列表中的曲目是一個不錯的例子。播放器應用程序可能有一個或多個activity來給用戶選擇歌曲并進行播放。然而,音樂播放這個任務本身不應該為任何activity所處理,因為用戶期望在他們離開播放器應用程序而開始做別的事情時,音樂仍在繼續(xù)播放。為達到這個目的,媒體播放器activity應該啟用一個運行于后臺的服務。而系統(tǒng)將在這個activity不再顯示于屏幕之后,仍維持音樂播放服務的運行。你可以連接至(綁定)一個正在運行的服務(如果服務沒有運行,則啟動之)。連接之后,你可以通過那個服務暴露出來的接口與服務進行通訊。對于音樂服務來說,這個接口可以允許用戶暫停、回退、停止以及重新開始播放。
16、如同activity和其它組件一樣,服務運行于應用程序進程的主線程內(nèi)。所以它不會對其它組件或用戶界面有任何干擾,它們一般會派生一個新線程來進行一些耗時任務(比如音樂回放)。Service服務和接收器廣播接收器是一個專注于接收廣播通知信息,并做出對應處理的組件。很多廣播是源自于系統(tǒng)代碼的比如,通知時區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項。應用程序也可以進行廣播比如說,通知其它應用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。應用程序可以擁有任意數(shù)量的廣播接收器以對所有它感興趣的通知信息予以響應。所有的接收器均繼承自BroadcastReceiver基類。廣播接收器沒有用戶界面。然而,它們
17、可以啟動一個activity來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力閃動背燈、震動、播放聲音等等。一般來說是在狀態(tài)欄上放一個持久的圖標,用戶可以打開它并獲取消息。Broadcast Receiver 接收器內(nèi)容提供者將一些特定的應用程序數(shù)據(jù)供給其它應用程序使用。數(shù)據(jù)可以存儲于文件系統(tǒng)、SQLite數(shù)據(jù)庫或其它方式。內(nèi)容提供者繼承于ContentProvider 基類,為其它應用程序取用和存儲它管理的數(shù)據(jù)實現(xiàn)了一套標準方法。然而,應用程序并不直接調(diào)用這些方法,而是使用一個 ContentResolver 對象,調(diào)用它的方
18、法作為替代。ContentResolver可以與任意內(nèi)容提供者進行會話,與其合作來對所有相關(guān)交互通訊進行管理。參閱獨立的內(nèi)容提供者章節(jié)獲得更多關(guān)于使用內(nèi)容提供者的內(nèi)容。每當出現(xiàn)一個需要被特定組件處理的請求時,Android會確保那個組件的應用程序進程處于運行狀態(tài),或在必要的時候啟動它。并確保那個相應組件的實例的存在,必要時會創(chuàng)建那個實例。Content Provider當接收到ContentResolver發(fā)出的請求后,內(nèi)容提供者被激活。而其它三種組件activity、服務和廣播接收器被一種叫做intent的異步消息所激活。intent是一個保存著消息內(nèi)容的Intent對象。對于activit
19、y和服務來說,它指明了請求的操作名稱以及作為操作對象的數(shù)據(jù)的URI和其它一些信息。比如說,它可以承載對一個activity的請求,讓它為用戶顯示一張圖片,或者讓用戶編輯一些文本。而對于廣播接收器而言,Intent對象指明了聲明的行為。比如,它可以對所有感興趣的對象聲明照相按鈕被按下。對于每種組件來說,激活的方法是不同的:通過傳遞一個Intent對象至 Context.startActivity()或Activity.startActivityForResult()以載入(或指定新工作給)一個activity。相應的activity可以通過調(diào)用 getIntent() 方法來查看激活它的inte
20、nt。Android通過調(diào)用activity的onNewIntent()方法來傳遞給它繼發(fā)的intent。一個activity經(jīng)常啟動了下一個。如果它期望它所啟動的那個activity返回一個結(jié)果,它會以調(diào)用startActivityForResult()來取代startActivity()。比如說,如果它啟動了另外一個activity以使用戶挑選一張照片,它也許想知道哪張照片被選中了。結(jié)果將會被封裝在一個Intent對象中,并傳遞給發(fā)出調(diào)用的activity的onActivityResult() 方法。 組件的連接者-Intent 通過傳遞一個Intent對象至Context.startSe
21、rvice()將啟動一個服務(或給予正在運行的服務以一個新的指令)。Android調(diào)用服務的 onStart()方法并將Intent對象傳遞給它。與此類似,一個Intent可以被調(diào)用組件傳遞給 Context.bindService()以獲取一個正在運行的目標服務的連接。這個服務會經(jīng)由onBind() 方法的調(diào)用獲取這個Intent對象(如果服務尚未啟動,bindService()會先啟動它)。比如說,一個activity可以連接至前述的音樂回放服務,并提供給用戶一個可操作的(用戶界面)以對回放進行控制。這個activity可以調(diào)用 bindService() 來建立連接,然后調(diào)用服務中定義的
22、對象來影響回放。 應用程序可以憑借將Intent對象傳遞給 Context.sendBroadcast() ,Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它類似方法來產(chǎn)生一個廣播。Android會調(diào)用所有對此廣播有興趣的廣播接收器的 onReceive()方法,將intent傳遞給它們。Manifest 文件當Android啟動一個應用程序組件之前,它必須知道那個組件是存在的。所以,應用程序會在一個manifest文件中聲明它的組件,這個文件會被打包到Android包中。這個.apk文件還將涵括應用程序的代碼
23、、文件以及其它資源。這個manifest文件以XML作為結(jié)構(gòu)格式,而且對于所有應用程序,都叫做AndroidManifest.xml。為聲明一個應用程序組件,它還會做很多額外工作,比如指明應用程序所需鏈接到的庫的名稱(除了默認的Android庫之外)以及聲明應用程序期望獲得的各種權(quán)限。但manifest文件的主要功能仍然是向Android聲明應用程序的組件。舉例說明,一個activity可以如下聲明:元素的name屬性指定了實現(xiàn)了這個activity的 Activity的子類。icon和label屬性指向了包含展示給用戶的此activity的圖標和標簽的資源文件。其它組件也以類似的方法聲明 元
24、素用于聲明服務, 元素用于聲明廣播接收器,而 元素用于聲明內(nèi)容提供者。 manifest文件中未進行聲明的activity、服務以及內(nèi)容提供者將不為系統(tǒng)所見,從而也就不會被運行。然而,廣播接收器既可以在manifest文件中聲明,也可以在代碼中進行動態(tài)的創(chuàng)建,并以調(diào)用Context.registerReceiver()的方式注冊至系統(tǒng)。 如前所述,一個activity可以啟動另外一個,甚至包括與它不處于同一應用程序之中的。舉個例子說,假設(shè)你想讓用戶看到某個地方的街道地圖。而已經(jīng)存在一個具有此功能的activity了,那么你的activity所需要做的工作就是把請求信息放到一個Intent對象里
25、面,并把它傳遞給startActivity()。于是地圖瀏覽器就會顯示那個地圖。而當用戶按下BACK鍵的時候,你的activity又會再一次的顯示在屏幕上。對于用戶來說,這看起來就像是地圖瀏覽器是你activity所在的應用程序中的一個組成部分,其實它是在另外一個應用程序中定義,并運行在那個應用程序的進程之中的。Android將這兩個activity放在同一個任務中來維持一個完整的用戶體驗。簡單的說,任務就是用戶所體驗到的“應用程序”。它是安排在一個堆棧中的一組相關(guān)的activity。堆棧中的根activity就是啟動了這整個任務的那個一般情況下,它就是用戶在應用程序加載器中所選擇的。而堆棧最
26、上方的activity則是當前運行的用戶直接對其進行操作的。當一個activity啟動另外一個的時候,新的activity就被壓入堆棧,并成為當前運行的activity。而前一個activity仍保持在堆棧之中。當用戶按下BACK鍵的時候,當前activity出棧,而前一個恢復為當前運行的activity。Activity和任務ActivityActivity生命周期生命周期用戶界面用戶界面User InterfaceUser Interface在一個Android應用中,用戶界面是由View 和ViewGroup對象構(gòu)建的。View與ViewGroup都有很多種類,而它們都是View類的子類
27、。 View View對象是Android平臺中用戶界面體現(xiàn)的基礎(chǔ)單位。View類是它稱為“widgets(工具)”的子類的基礎(chǔ),它們提供了諸如文本輸入框和按鈕之類的UI對象的完整實現(xiàn)。ViewGroup類同樣為其被稱為“Layouts(布局)”的子類奠定了基礎(chǔ),它們提供了象流式布局、表格布局以及相對布局之類的布局架構(gòu)。View對象是一個數(shù)據(jù)體,它的屬性存儲了用于屏幕上一塊矩形區(qū)域的布局參數(shù)及內(nèi)容。并負責這塊它所轄的這個矩形區(qū)域之中所有測量、布局、焦點轉(zhuǎn)換、卷動以及按鍵/觸摸手勢的處理。作為一個用戶界面對象,View同時也擔任著用戶交互關(guān)鍵點以及交互事件接受者的角色。布局布局LayoutLay
28、out定義并展現(xiàn)你的視圖層次的最常用的方法是使用XML布局文件。如同HTML一樣,XML為布局提供了一種可讀的結(jié)構(gòu)。XML中的每個元素都是View或ViewGroup對象(抑或它們的子類)。View對象是樹的葉節(jié)點,而ViewGroup對象是樹的分支(參閱樓上的視圖層次圖)。XML元素的名稱與它體現(xiàn)的Java類相對應。所以一個元素將在你的UI中生成一個TextView,而 則創(chuàng)建一個LinearLayout視圖組。當你載入一個布局資源時,Android系統(tǒng)會根據(jù)你布局中的元素初始化這些運行時對象。舉例來說,一個包含文本視圖和一個按鈕的簡單垂直布局如下: 請注意:LinearLayout 元素包
29、含了TextView 和Button 對象。你可以在其中另外安置一個LinearLayout (或其它類型的視圖組),以延展這個視圖層次,構(gòu)建更復雜的布局。用戶界面事件用戶界面事件UI EventsUI Events當你在用戶界面中加入了一些視圖和工具之后,你可能想要知道如何讓它們與用戶交互,進而實現(xiàn)你的動作。如欲獲得用戶界面事件通知,你需要做以下兩件事情之一:定義一個事件偵聽器并將其注冊至視圖。通常情況下,這是你偵聽事件的主要方式。View類包含了一大堆命名類似 OnListener的接口,每個都帶有一個叫做On()的回調(diào)方法。比如: View.OnClickListener (用以處理視圖
30、中的點擊),View.OnTouchListener (用以處理視圖中的觸屏事件),以及View.OnKeyListener (用以處理視圖中的設(shè)備按鍵事件)。所以,如果你希望你的視圖在它被”點擊”(比如選擇了一個按鈕)的時候獲得通知,你就要實現(xiàn)OnClickListener,定義它的onClick()回調(diào)方法(在其中進行相應處理),并將它用setOnClickListener()方法注冊到視圖上。 為視圖覆寫一個現(xiàn)有的回調(diào)方法。這種方法主要用于你自己實現(xiàn)了一個View類,并想偵聽其上發(fā)生的特定事件。比如說當屏幕被觸摸(onTouchEvent()),當軌跡球發(fā)生了移動(onTrackball
31、Event())或者是設(shè)備上的按鍵被按下(onKeyDown())。這種方式允許你為自己定制的視圖中發(fā)生的每個事件定義默認的行為,并決定是否需要將事件傳遞給其它的子視圖。再說一次,這些是View類相關(guān)的回調(diào)方法,所以你只能在你構(gòu)建自定義組件時定義它們。 如何在視圖中處理用戶交互請參見處理用戶界面事件文檔。資源和資產(chǎn)資源和資產(chǎn)Resources and AssetsResources and Assets資源是Android應用程序不可或缺的部分??傮w而言,資源是你想包含和引入到應用程序里面的一些外部元素,比如圖片、音頻、視頻、文本字符串、布局、主題等。每個Android應用程序包含一個資源目錄
32、(res/)和資產(chǎn)目錄(assets/),資產(chǎn)不經(jīng)常被使用,因為它們的應用程序很少。你僅在需要讀取原始字節(jié)流時才需要保存數(shù)據(jù)為資產(chǎn)。資源和資產(chǎn)目錄均駐留在Android項目樹的頂端,和源代碼目錄(src/)處在同一級上。資源和資產(chǎn)從表面上看沒多大區(qū)別,不過總體上,在存儲外部內(nèi)容時資源用得更多。真正的區(qū)別在于任何放置在資源目錄里的內(nèi)容可以通過您的應用程序的R類訪問,這是被Android編譯過的。而任何存放在資產(chǎn)目錄里的內(nèi)容會保持它的原始文件格式,為了讀取它,你必須使用AssetManager來以字節(jié)流的方式讀取文件。所以保持文件和數(shù)據(jù)在資源中(res/)中會更方便訪問。目錄Directory資源
33、類型Resource Types res/anim/XML文件,它們被編譯進逐幀動畫(frame by frame animation)或補間動畫(tweened animation)對象 res/drawable/.png、.9.png、.jpg文件,它們被編譯進以下的Drawable資源子類型中: 要獲得這種類型的一個資源,可以使用Resource.getDrawable(id) 位圖文件 9-patches(可變尺寸的位圖) 為了獲取資源類型,使用mContext.getResources().getDrawable(R.drawable.imageId)注意:放在這里的圖像資源可能會被
34、aapt工具自動地進行無損壓縮優(yōu)化。比如,一個真彩色但并不需要256色的PNG可能會被轉(zhuǎn)換為一個帶調(diào)色板的8位PNG。這使得同等質(zhì)量的圖片占用更少的資源。所以我們得意識到這些放在該目錄下的二進制圖像在生成時可能會發(fā)生變化。如果你想讀取一個圖像位流并轉(zhuǎn)換成一個位圖(bitmap),請把圖像文件放在res/raw/目錄下,這樣可以避免被自動優(yōu)化。res/layout/被編譯為屏幕布局(或屏幕的一部分)的XML文件。參見布局聲明(Declaring Layout)res/values/可以被編譯成很多種類型的資源的XML文件。注意: 不像其他的res/文件夾,它可以保存任意數(shù)量的文件,這些文件保存了
35、要創(chuàng)建資源的描述,而不是資源本身。XML元素類型控制這些資源應該放在R類的什么地方。盡管這個文件夾里的文件可以任意命名,不過下面使一些比較典型的文件(文件命名的慣例是將元素類型包含在該名稱之中): array.xml定義數(shù)據(jù) colors.xml定義color drawable和顏色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分別獲得這些資源。 dimens.xml定義尺寸值(dimension value)。使用Resources.getDimension()獲得這些資源。 strings.x
36、ml定義字符串(string)值(使用Resources.getString()或者Resources.getText()獲取這些資源。getText()會保留在UI字符串上應用的豐富的文本樣式)。 styles.xml定義樣式(style)對象。res/xml/ 任意的XML文件,在運行時可以通過調(diào)用Resources.getXML()讀取。 res/raw/ 直接復制到設(shè)備中的任意文件。它們無需編譯,添加到你的應用程序編譯產(chǎn)生的壓縮文件中。要使用這些資源,可以調(diào)用Resources.openRawResource(),參數(shù)是資源的ID,即R.raw.somefilename。 數(shù)據(jù)存儲與訪
37、問很多時候我們的軟件需要對處理后的數(shù)據(jù)進行存儲或再次訪問。Android為數(shù)據(jù)存儲提供了多種方式,分別有如下幾種:l文件lSharedPreferences(參數(shù))lSQLite數(shù)據(jù)庫l內(nèi)容提供者(Content provider)l網(wǎng)絡使用文件進行數(shù)據(jù)存儲首先給大家介紹使用文件如何對數(shù)據(jù)進行存儲,Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中,具體的實現(xiàn)過程與在J2SE環(huán)境中保存數(shù)據(jù)到文件中是一樣的。public class FileActivity extends Activity Override public void onCreate(Bundl
38、e savedInstanceState) . FileOutputStream outStream = this.openFileOutput(itcast.txt, Context.MODE_PRIVATE); outStream.write(“ggggg.getBytes(); outStream.close(); openFileOutput()方法的第一參數(shù)用于指定文件名稱,不能包含路徑分隔符“/” ,如果文件不存在,Android 會自動創(chuàng)建它。創(chuàng)建的文件保存在/data/data/files目錄,如: /data/data/cn.itcast.action/files/itcas
39、t.txt ,通過點擊Eclipse菜單“Window”-“Show View”-“Other”,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,然后在File Explorer視圖中展開/data/data/files目錄就可以看到該文件。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為: Context.MODE_PRIVATE = 0Context.MODE_APPEND = 32768Context.MODE_WORLD_READABLE = 1Context.MODE_WORLD_WRITEABLE = 2使用文件進行
40、數(shù)據(jù)存儲Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數(shù)據(jù),只能被應用本身訪問,在該模式下,寫入的內(nèi)容會覆蓋原文件的內(nèi)容,如果想把新寫入的內(nèi)容追加到原文件中??梢允褂肅ontext.MODE_APPENDContext.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內(nèi)容,否則就創(chuàng)建新文件。Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有權(quán)限讀寫該文件。MODE_WORLD_READABLE:表示當前文件可以被其他應用讀?。籑ODE_WORLD_WRITEABLE:
41、表示當前文件可以被其他應用寫入。如果希望文件被其他應用讀和寫,可以傳入: openFileOutput(itcast.txt, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);android有一套自己的安全模型,當應用程序(.apk)在安裝時系統(tǒng)就會分配給他一個userid,當該應用要去訪問其他資源比如文件的時候,就需要userid匹配。默認情況下,任何應用創(chuàng)建的文件,sharedpreferences,數(shù)據(jù)庫都應該是私有的(位于/data/data/files),其他程序無法訪問。除非在創(chuàng)建時指定了Context.MOD
42、E_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程序才能正確訪問。使用SharedPreferences進行數(shù)據(jù)存儲很多時候我們開發(fā)的軟件需要向用戶提供軟件參數(shù)設(shè)置功能,例如我們常用的QQ,用戶可以設(shè)置是否允許陌生人添加自己為好友。對于軟件配置參數(shù)的保存,如果是window軟件通常我們會采用ini文件進行保存,如果是j2se應用,我們會采用properties屬性文件或者xml進行保存。如果是Android應用,我們最適合采用什么方式保存軟件配置參數(shù)呢?Android平臺給我們提供了一個SharedPreferences類,它是一個輕
43、量級的存儲類,特別適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/shared_prefs目錄下:SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIVATE);Editor editor = sharedPreferences.edit();/獲取編輯器editor.putString(name, 傳智播客);editor.putInt(age, 4);mit();/提交修改生成的itcast
44、.xml文件內(nèi)容如下:傳智播客因為SharedPreferences背后是使用xml文件保存數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個參數(shù)用于指定該文件的名稱,名稱不用帶后綴,后綴會由Android自動加上。方法的第二個參數(shù)指定文件的操作模式,共有四種操作模式,這四種模式前面介紹使用文件方式保存數(shù)據(jù)時已經(jīng)講解過。如果希望SharedPreferences背后使用的xml文件能被其他應用讀和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。另外Activity還提供了另一個get
45、Preferences(mode)方法操作SharedPreferences,這個方法默認使用當前類不帶包名的類名作為文件的名稱。訪問SharedPreferences中的數(shù)據(jù)訪問SharedPreferences中的數(shù)據(jù)代碼如下:SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIVATE);/getString()第二個參數(shù)為缺省值,如果preference中不存在該key,將返回缺省值String name = sharedPreferences.getString(name
46、, );int age = sharedPreferences.getInt(age, 1);如果訪問其他應用中的Preference,前提條件是:該preference創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個為cn.itcast.action的應用使用下面語句創(chuàng)建了preference。getSharedPreferences(itcast, Context.MODE_WORLD_READABLE);其他應用要訪問上面應用的preference,首先需要創(chuàng)建上面應用的Context,然后通過C
47、ontext 訪問preference ,訪問preference時會在應用所在包下的shared_prefs目錄找到preference :Context otherAppsContext = createPackageContext(cn.itcast.action, Context.CONTEXT_IGNORE_SECURITY);SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences(itcast, Context.MODE_WORLD_READABLE);String name = sha
48、redPreferences.getString(name, );int age = sharedPreferences.getInt(age, 0);如果不通過創(chuàng)建Context訪問其他應用的preference,也可以以讀取xml文件方式直接訪問其他應用preference對應的xml文件,如: File xmlFile = new File(“/data/data/shared_prefs/itcast.xml”);/應替換成應用的包名使用嵌入式關(guān)系型SQLite數(shù)據(jù)庫存儲數(shù)據(jù)除了可以使用文件或SharedPreferences存儲數(shù)據(jù),還可以選擇使用SQLite數(shù)據(jù)庫存儲數(shù)據(jù)。在And
49、roid平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點數(shù)字)、TEXT(字符串文本)和BLOB(二進制對象)數(shù)據(jù)類型,雖然它支持的類型只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等數(shù)據(jù)類型,只不過在運算或保存時會轉(zhuǎn)成對應的五種數(shù)據(jù)類型。 SQLite最大的特點是你可以把各種類型的數(shù)據(jù)保存到任何字段中,而不用關(guān)心字段聲明的數(shù)據(jù)類型是什么。例如:可以在Integer類型的字段中存放字符串,或者在布爾型字段中存放浮點數(shù),或者在字符型字段中存放日期型值。 但有一種情況例外:定義為I
50、NTEGER PRIMARY KEY的字段只能存儲64位整數(shù), 當向這種字段保存除整數(shù)以外的數(shù)據(jù)時,將會產(chǎn)生錯誤。 另外, SQLite 在解析CREATE TABLE 語句時,會忽略 CREATE TABLE 語句中跟在字段名后面的數(shù)據(jù)類型信息,如下面語句會忽略 name字段的類型信息:CREATE TABLE person (personid integer primary key autoincrement, name varchar(20)SQLite可以解析大部分標準SQL語句,如:查詢語句:select * from 表名 where 條件子句 group by 分組字句 havi
51、ng . order by 排序子句如:select * from person select * from person order by id desc select name from person group by name having count()1分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面*3條記錄select * from Account limit 5 offset 3 或者 select * from Account limit 3,5插入語句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(傳智,3)更新語句:update 表名 set 字段名=值 where 條件子句。如:update person set name=傳智 where id=10刪除語句:delete from 表名 where 條件子句。如:delete from person where id=10使用SQLiteOpenHelper對數(shù)據(jù)庫進行版本管理我們在編寫數(shù)據(jù)庫應用軟件時,需要考慮這樣的問題:因為我們開發(fā)的軟件可能會安裝在很多用戶的手機上,如果應用使用到了SQLite數(shù)據(jù)庫,我們必須在用戶初次使用軟件時創(chuàng)建出應用使用到的數(shù)據(jù)庫表
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基層醫(yī)療衛(wèi)生機構(gòu)信息化建設(shè)中的醫(yī)療信息化與疾病預防控制報告
- 月嫂技能培訓課件
- 新零售背景下便利店智能化供應鏈金融創(chuàng)新報告
- 薄膜干涉題目及答案
- 安全質(zhì)量培訓試題及答案
- 咖啡連鎖品牌擴張戰(zhàn)略布局報告:2025年市場拓展與品牌戰(zhàn)略優(yōu)化方案創(chuàng)新
- 安全護理的試題及答案
- 單位音樂培訓課件模板
- 安檢排爆培訓課件
- cpa培訓課件下載
- 新生兒病區(qū)??评碚摽荚囶}庫
- 健康評估咳嗽咳痰課件
- 白酒酒店合作合同協(xié)議書
- 中國融通農(nóng)業(yè)發(fā)展有限集團有限公司招聘筆試題庫2025
- 實驗室通風系統(tǒng)工程施工方案
- 2024淮安市專業(yè)技術(shù)人員繼續(xù)教育試題參考答案
- 成人體外膜肺氧合循環(huán)輔助護理專家共識-解讀與臨床應用(2025版)
- 慢性活動性EB病毒病診治專家共識(2025版)解讀
- 2025年入團考試常見問題及試題答案
- 績效考核合同協(xié)議書范本
- 2025年公路水運工程重大事故隱患判定標準深度解析
評論
0/150
提交評論