版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、北京傳智播客教育,3G應(yīng)用開發(fā)之Android,講師:黎活明,北京傳智播客教育,什么是3G,3G,全稱為3rdGeneration,中文含義就是指第三代數(shù)字通信。所謂3G,是指將無線通信與國際互聯(lián)網(wǎng)等多媒體通信結(jié)合的新一代移動通信系統(tǒng)。3G只是一種通信技術(shù)標(biāo)準(zhǔn),符合這個標(biāo)準(zhǔn)的技術(shù)有WCDMA、CDMA2000、TD-SCDMA三種無線接口標(biāo)準(zhǔn)。中國聯(lián)通使用的是WCDMA(世界上大部分3G網(wǎng)絡(luò)都采用的是該標(biāo)準(zhǔn));中國電信使用的是CDMA2000(日、韓和北美使用);中國移動使用的是具有自主知識產(chǎn)權(quán)的TD-SCDMA(只有中國才使用)。相對第一代模擬制式手機(1G)和第二代GSM、CDMA等數(shù)字手
2、機(2G),3G手機能處理圖像、音樂、視頻等多種媒體形式,提供包括網(wǎng)頁瀏覽、電話會議、電子商務(wù)等多種信息服務(wù)。3G網(wǎng)絡(luò)與前兩代的主要區(qū)別是在傳輸聲音和數(shù)據(jù)的速度上有很大的提升。目前中國正在建設(shè)3G網(wǎng)絡(luò),大城市的3G網(wǎng)絡(luò)基本上已經(jīng)鋪設(shè)好,像北京鋪設(shè)好了超過2000個基站,深圳鋪設(shè)了1000多個基站。但是要全民普及到3G手機尚且需要幾年時間。現(xiàn)在,大家使用的手機大多還是2.5G手機,符合2.5G網(wǎng)絡(luò)的接口標(biāo)準(zhǔn)有CDMA20001X和GPRS,中國聯(lián)通使用的是CDMA20001X標(biāo)準(zhǔn),中國移動使用的是GPRS標(biāo)準(zhǔn)。目前,我們可以把2.5G移動通信技術(shù)看作是2G邁向3G的銜接性技術(shù),在2.5G網(wǎng)絡(luò)下出
3、現(xiàn)了如WAP、藍(lán)牙(Bluetoot)等技術(shù)。對于2.5G網(wǎng)絡(luò),我們應(yīng)該也要有所了解,因為以后大家到企業(yè)中有可能會面對2.5G網(wǎng)絡(luò)下的應(yīng)用,如:wap項目。,北京傳智播客教育,什么是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應(yīng)用的范圍不僅僅在手機,還被應(yīng)用在汽車
4、、平板電腦、和智能上網(wǎng)設(shè)備上,聽說國外已經(jīng)有了安裝有Android系統(tǒng),并且能夠上網(wǎng)的智能電飯煲,用戶在千里之外就可以操作電飯煲進(jìn)行煮飯。由于大家大多使用的手機都屬傻瓜手機,也就是打打電話、發(fā)發(fā)短信。從今天開始,大家就應(yīng)該改變這個觀念了,你們需要把智能手機看作是一臺電腦,它能完成電腦所能完成的一切。所以你可以像在電腦一樣,在智能手機上安裝軟件,以滿足你工作和生活的需要。,北京傳智播客教育,智能手機軟件平臺,智能手機軟件平臺有:Symbian,WindowsMobile,RIMBlackBerry,Android,iPhone,Java/J2ME。2009年市場份額:Symbian51%RIMB
5、lackBerry18%iPhone13.3windowsMobile9.3%linux4.6%Android1.8%,北京傳智播客教育,如何安裝AndroidSDK和Eclipse插件,所需開發(fā)環(huán)境:JDK5或以上版本(僅有JRE不夠)、Eclipse3.4或以上版本下載用于在Eclipse開發(fā)android應(yīng)用的ADT插件在企業(yè)開發(fā)中,很多程序員使用EclipseIDE作為應(yīng)用的開發(fā)環(huán)境。為了使得Android應(yīng)用的創(chuàng)建,運行和調(diào)試更加方便快捷。Android的開發(fā)團(tuán)隊專門針對EclipseIDE定制了一個插件:AndroidDevelopmentTools(ADT)下載地址:,北京傳智播
6、客教育,開發(fā)第一個Android應(yīng)用,打開Eclipse,新建項目(點擊FileNewProject),在項目列表中展開Android目錄,選擇AndroidProject,如下圖:,北京傳智播客教育,開發(fā)第一個Android應(yīng)用,北京傳智播客教育,開發(fā)第一個Android應(yīng)用,點擊”finish”即可完成項目的創(chuàng)建,創(chuàng)建后的項目已經(jīng)是一個可運行的Android應(yīng)用,我們可以通過下面方式運行此應(yīng)用:點擊工具欄上機器人形狀的虛擬設(shè)備管理器(簡稱“AVD“),如下:,北京傳智播客教育,開發(fā)第一個Android應(yīng)用,在打開的虛擬設(shè)備管理器中創(chuàng)建一個虛擬手機:,北京傳智播客教育,開發(fā)第一個Androi
7、d應(yīng)用,在項目上右鍵點擊runasAndroidapplication,如下圖:,北京傳智播客教育,Android應(yīng)用程序架構(gòu),src/java原代碼存放目錄gen/自動生成目錄gen目錄中存放所有由Android開發(fā)工具自動生成的文件。目錄中最重要的就是R.java文件。這個文件由Android開發(fā)工具自動產(chǎn)生的。Android開發(fā)工具會自動根據(jù)你放入res目錄的資源,同步更新修改R.java文件。正因為R.java文件是由開發(fā)工具自動生成的,所以我們應(yīng)避免手工修改R.java。R.java在應(yīng)用中起到了字典的作用,它包含了各種資源的id,通過R.java,應(yīng)用可以很方便地找到對應(yīng)資源。另外
8、編繹器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編繹進(jìn)軟件中,這樣可以減少應(yīng)用在手機占用的空間。res/資源(Resource)目錄在這個目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。具體請看ppt下方備注欄。assets資源目錄Android除了提供/res目錄存放資源文件外,在/assets目錄也可以存放資源文件,而且/assets目錄下的資源文件不會在R.java自動生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑,如:file:/android_asset/xxx.3gpAndroidManifest.xml項目清單文件這
9、個文件列出了應(yīng)用程序所提供的功能,以后你開發(fā)好的各種組件需要在該文件中進(jìn)行配置,如果應(yīng)用使用到了系統(tǒng)內(nèi)置的應(yīng)用(如電話服務(wù)、互聯(lián)網(wǎng)服務(wù)、短信服務(wù)、GPS服務(wù)等等),你還需在該文件中聲明使用權(quán)限。perties項目環(huán)境信息,一般是不需要修改此文件,北京傳智播客教育,電話拔號器,效果圖:,北京傳智播客教育,電話拔號器,因為應(yīng)用要使用手機的電話服務(wù),所以要在清單文件AndroidManifest.xml中添加電話服務(wù)權(quán)限:略.,北京傳智播客教育,電話拔號器,界面布局:LinearLayout(線性布局)、AbsoluteLayout(絕對布局)、RelativeLayout(相
10、對布局)、TableLayout(表格布局)、FrameLayout(幀布局),北京傳智播客教育,Android中的顯示單位,px(pixels)像素一般HVGA代表320 x480像素,這個用的比較多。dip或dp(deviceindependentpixels)設(shè)備獨立像素這個和設(shè)備硬件有關(guān),一般為了支持WVGA、HVGA和QVGA推薦使用這個,不依賴像素。sp(scaledpixelsbestfortextsize)比例像素主要處理字體的大小,可以根據(jù)系統(tǒng)的字體自適應(yīng)。除了上面三個顯示單位,下面還有幾個不太常用:in(inches)英寸mm(millimeters)毫米pt(points
11、)點,1/72英寸為了適應(yīng)不同分辨率,不同的像素密度,推薦使用dip,文字使用sp。,北京傳智播客教育,電話拔號器,Activity:publicclassDialerActionextendsActivityOverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);Buttonbutton=(Button)findViewById(R.id.button);button.setOnClickListener(newVi
12、ew.OnClickListener()publicvoidonClick(Viewv)EditTexteditText=(EditText)findViewById(R.id.mobile);Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse(tel:+editText.getText();DialerAction.this.startActivity(intent););,北京傳智播客教育,電話拔號器,測試步驟:1在Eclipse中運行此應(yīng)用2在Dos窗口中進(jìn)入androidSDK安裝路徑的tools目錄,輸入以下命令再開啟一個Andro
13、id模擬器:emulator-dataitcast注:itcast為用戶數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件3在電話擾號器中輸入上圖現(xiàn)顯的電話號碼,北京傳智播客教育,“尚未注冊網(wǎng)絡(luò)”錯誤信息的解決辦法,打開Android模擬器時,出現(xiàn)無信號,拔打電話或發(fā)短信時,提示“尚未注冊網(wǎng)絡(luò)”錯誤信息的解決方案如下。場景一:你的電腦沒有連接上互聯(lián)網(wǎng),同時也沒有在局域網(wǎng)。解決辦法:右鍵點擊網(wǎng)上鄰居,選擇屬性,在網(wǎng)絡(luò)連接窗口中右鍵點擊本地連接,選擇屬性,設(shè)置TCP/IP屬性如下:IP地址:00子網(wǎng)掩碼:默認(rèn)網(wǎng)關(guān):0
14、0首選DNS服務(wù)器:00場景二:你的電腦沒有連接上互聯(lián)網(wǎng),但在局域網(wǎng)。解決辦法:右鍵點擊網(wǎng)上鄰居,選擇屬性,在網(wǎng)絡(luò)連接窗口中右鍵點擊本地連接,選擇屬性,設(shè)置TCP/IP屬性如下:IP地址:設(shè)置成你所在局域網(wǎng)的IP,如:00子網(wǎng)掩碼:設(shè)置成你所在局域網(wǎng)的掩碼,如:默認(rèn)網(wǎng)關(guān):設(shè)置成你所在局域網(wǎng)的網(wǎng)關(guān),一般網(wǎng)關(guān)的IP格式為:*.*.*.1,如:首選DNS服務(wù)器:設(shè)置成你所在局域網(wǎng)的路由器IP,一般路由器的IP格式為:*.*.*.1,如:最后一種解決方案是:讓你的電腦連接上互聯(lián)網(wǎng)。,北京傳
15、智播客教育,短信發(fā)送器,效果圖:,北京傳智播客教育,短信發(fā)送器,因為應(yīng)用要使用手機的短信服務(wù),所以要在清單文件AndroidManifest.xml中添加短信服務(wù)權(quán)限:略.,北京傳智播客教育,短信發(fā)送器,界面布局:,北京傳智播客教育,短信發(fā)送器,Activity主要代碼:Stringmobile=mobileView.getText().toString();Stringcontent=contentView.getText().toString();SmsManagersmsManager=SmsManager.getDefault();PendingIntentsentIntent=Pen
16、dingIntent.getBroadcast(SMSSender.this,0,newIntent(),0);/如果字?jǐn)?shù)超過70,需拆分成多條短信發(fā)送Listmsgs=smsManager.divideMessage(content);for(Stringmsg:msgs)smsManager.sendTextMessage(mobile,null,msg,sentIntent,null);/最后二個參數(shù)為短信已發(fā)送的廣播意圖,最后一個參數(shù)為短信對方已收到短信的廣播意圖Toast.makeText(SMSSender.this,短信發(fā)送完成,Toast.LENGTH_LONG).show()
17、;,北京傳智播客教育,短信發(fā)送器,測試步驟:1在Eclipse中運行此應(yīng)用2在Dos窗口中進(jìn)入androidSDK安裝路徑的tools目錄,輸入以下命令再開啟一個Android模擬器:emulator-dataitcast注:itcast為用戶數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件3在短信發(fā)送器的手機號中輸入上圖現(xiàn)顯的電話號碼注:目前Android系統(tǒng)對中文短信尚未支持,所以發(fā)送中文短信會有亂碼,這個問題日后會被解決的。,北京傳智播客教育,發(fā)送彩信,可以通過調(diào)用系統(tǒng)自帶的短信程序發(fā)送彩信:Intentintent=newIntent(Intent.ACTION_SEND
18、);intent.putExtra(Intent.EXTRA_STREAM,Uri.parse(file:/sdcard/cong.png);intent.putExtra(address,);intent.putExtra(exit_on_sent,true);intent.putExtra(subject,itssubject);intent.putExtra(sms_body,itscontent);intent.setType(“image/jpeg”);/視頻:video/mpeg*,文本:text/plain,北京傳智播客教育,對應(yīng)用進(jìn)行單元測試,在實際開
19、發(fā)中,開發(fā)android軟件的過程需要不斷地進(jìn)行測試。而使用Junit測試框架,側(cè)是正規(guī)Android開發(fā)的必用技術(shù),在Junit中可以得到組件,可以模擬發(fā)送事件和檢測程序處理的正確性。第一步:首先在AndroidManifest.xml中加入下面紅色代碼:.上面targetPackage指定的包要和應(yīng)用的package相同。第二步:編寫單元測試代碼(選擇要測試的方法,右鍵點擊“RunAs”-“AndroidJunitTest”):importandroid.test.AndroidTestCase;importandroid.util.Log;publicclassXMLTestextend
20、sAndroidTestCasepublicvoidtestSomething()throwsThrowableAssert.assertTrue(1+1=3);,北京傳智播客教育,數(shù)據(jù)存儲與訪問,很多時候我們的軟件需要對處理后的數(shù)據(jù)進(jìn)行存儲或再次訪問。Android為數(shù)據(jù)存儲提供了如下幾種方式:文件SharedPreferences(參數(shù))SQLite數(shù)據(jù)庫內(nèi)容提供者(Contentprovider)網(wǎng)絡(luò),北京傳智播客教育,使用文件進(jìn)行數(shù)據(jù)存儲,首先給大家介紹使用文件如何對數(shù)據(jù)進(jìn)行存儲,Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中,具體的實現(xiàn)過程與在J
21、2SE環(huán)境中保存數(shù)據(jù)到文件中是一樣的。publicclassFileActivityextendsActivityOverridepublicvoidonCreate(BundlesavedInstanceState).FileOutputStreamoutStream=this.openFileOutput(itcast.txt,Context.MODE_PRIVATE);outStream.write(傳智播客.getBytes();outStream.close();openFileOutput()方法的第一參數(shù)用于指定文件名稱,不能包含路徑分隔符“/”,如果文件不存在,Android會
22、自動創(chuàng)建它。創(chuàng)建的文件保存在/data/data/files目錄,如:/data/data/cn.itcast.action/files/itcast.txt,通過點擊Eclipse菜單“Window”-“ShowView”-“Other”,在對話窗口中展開android文件夾,選擇下面的FileExplorer視圖,然后在FileExplorer視圖中展開/data/data/files目錄就可以看到該文件。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為:Context.MODE_PRIVATE=0Context.MODE_APPEND=32768Cont
23、ext.MODE_WORLD_READABLE=1Context.MODE_WORLD_WRITEABLE=2,北京傳智播客教育,使用文件進(jìn)行數(shù)據(jù)存儲,Context.MODE_PRIVATE:為默認(rèn)操作模式,代表該文件是私有數(shù)據(jù),只能被應(yīng)用本身訪問,在該模式下,寫入的內(nèi)容會覆蓋原文件的內(nèi)容,如果想把新寫入的內(nèi)容追加到原文件中??梢允褂肅ontext.MODE_APPENDContext.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內(nèi)容,否則就創(chuàng)建新文件。Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制
24、其他應(yīng)用是否有權(quán)限讀寫該文件。MODE_WORLD_READABLE:表示當(dāng)前文件可以被其他應(yīng)用讀?。籑ODE_WORLD_WRITEABLE:表示當(dāng)前文件可以被其他應(yīng)用寫入。如果希望文件被其他應(yīng)用讀和寫,可以傳入:openFileOutput(itcast.txt,Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);android有一套自己的安全模型,當(dāng)應(yīng)用程序(.apk)在安裝時系統(tǒng)就會分配給他一個userid,當(dāng)該應(yīng)用要去訪問其他資源比如文件的時候,就需要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建的文件,sharedpref
25、erences,數(shù)據(jù)庫都應(yīng)該是私有的(位于/data/data/files),其他程序無法訪問。除非在創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,只有這樣其他程序才能正確訪問。,北京傳智播客教育,讀取文件內(nèi)容,如果要打開存放在/data/data/files目錄應(yīng)用私有的文件,可以使用Activity提供openFileInput()方法。FileInputStreaminStream=this.getContext().openFileInput(itcast.txt);Log.i(FileTest,read
26、InStream(inStream);readInStream()的方法請看本頁下面?zhèn)渥?。或者直接使用文件的絕對路徑:Filefile=newFile(/data/data/cn.itcast.action/files/itcast.txt);FileInputStreaminStream=newFileInputStream(file);Log.i(FileTest,readInStream(inStream);注意:上面文件路徑中的“cn.itcast.action”為應(yīng)用所在包,當(dāng)你在編寫代碼時應(yīng)替換為你自己應(yīng)用使用的包。對于私有文件只能被創(chuàng)建該文件的應(yīng)用訪問,如果希望文件能被其他應(yīng)用讀
27、和寫,可以在創(chuàng)建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。Activity還提供了getCacheDir()和getFilesDir()方法:getCacheDir()方法用于獲取/data/data/cache目錄getFilesDir()方法用于獲取/data/data/files目錄,北京傳智播客教育,把文件存放在SDCard,使用Activity的openFileOutput()方法保存文件,文件是存放在手機空間上,一般手機的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行
28、的。對于像視頻這樣的大文件,我們可以把它存放在SDCard。SDCard是干什么的?你可以把它看作是移動硬盤或U盤。在模擬器中使用SDCard,你需要先創(chuàng)建一張SDCard卡(當(dāng)然不是真的SDCard,只是鏡像文件)。創(chuàng)建SDCard可以在Eclipse創(chuàng)建模擬器時隨同創(chuàng)建,也可以使用DOS命令進(jìn)行創(chuàng)建,如下:在Dos窗口中進(jìn)入androidSDK安裝路徑的tools目錄,輸入以下命令創(chuàng)建一張容量為2G的SDCard,文件后綴可以隨便取,建議使用.img:mksdcard2048MD:AndroidToolsdcard.img在程序中訪問SDCard,你需要申請訪問SDCard的權(quán)限。在And
29、roidManifest.xml中加入訪問SDCard的權(quán)限如下:,北京傳智播客教育,把文件存放在SDCard,要往SDCard存放文件,程序必須先判斷手機是否裝有SDCard,并且可以進(jìn)行讀寫。注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權(quán)限if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)FilesdCardDir=Environment.getExternalStorageDirectory();/獲取SDCard目錄FilesaveFile=n
30、ewFile(sdCardDir,“itcast.txt”);FileOutputStreamoutStream=newFileOutputStream(saveFile);outStream.write(傳智播客.getBytes();outStream.close();Environment.getExternalStorageState()方法用于獲取SDCard的狀態(tài),如果手機裝有SDCard,并且可以進(jìn)行讀寫,那么方法返回的狀態(tài)等于Environment.MEDIA_MOUNTED。Environment.getExternalStorageDirectory()方法用于獲取SDCa
31、rd的目錄,當(dāng)然要獲取SDCard的目錄,你也可以這樣寫:FilesdCardDir=newFile(/mnt/sdcard);/獲取SDCard目錄FilesaveFile=newFile(sdCardDir,itcast.txt);/上面兩句代碼可以合成一句:FilesaveFile=newFile(/mnt/sdcard/itcast.txt);FileOutputStreamoutStream=newFileOutputStream(saveFile);outStream.write(傳智播客test.getBytes();outStream.close();,北京傳智播客教育,使用S
32、AX或者DOM或者pull解析XML文件,在Android平臺上可以使用SimpleAPIforXML(SAX)、DocumentObjectModel(DOM)和Android附帶的pull解析器解析XML文件。下面是本例子要解析的XML文件:文件名稱:itcast.xmlliming30zhangxiaoxiao25例子定義了一個javabean用于存放上面解析出來的xml內(nèi)容,這個javabean為Person,代碼請見本頁下面?zhèn)渥ⅲ?北京傳智播客教育,使用SAX讀取XML文件,SAX是一個解析速度快并且占用內(nèi)存少的xml解析器,非常適合用于Android等移動設(shè)備。SAX解析XML文件
33、采用的是事件驅(qū)動,也就是說,它并不需要解析完整個文檔,在按內(nèi)容順序解析文檔的過程中,SAX會判斷當(dāng)前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發(fā)事件。所謂事件,其實就是一些回調(diào)(callback)方法,這些方法(事件)定義在ContentHandler接口。下面是一些ContentHandler接口常用的方法:startDocument()當(dāng)遇到文檔的開頭的時候,調(diào)用這個方法,可以在其中做一些預(yù)處理的工作。endDocument()和上面的方法相對應(yīng),當(dāng)文檔結(jié)束的時候,調(diào)用這個方法,可以在其中做一些善后的工作。startElement(StringnamespaceURI,Stri
34、nglocalName,StringqName,Attributesatts)當(dāng)讀到一個開始標(biāo)簽的時候,會觸發(fā)這個方法。namespaceURI就是命名空間,localName是不帶命名空間前綴的標(biāo)簽名,qName是帶命名空間前綴的標(biāo)簽名。通過atts可以得到所有的屬性名和相應(yīng)的值。要注意的是SAX中一個重要的特點就是它的流式處理,當(dāng)遇到一個標(biāo)簽的時候,它并不會紀(jì)錄下以前所碰到的標(biāo)簽,也就是說,在startElement()方法中,所有你所知道的信息,就是標(biāo)簽的名字和屬性,至于標(biāo)簽的嵌套結(jié)構(gòu),上層標(biāo)簽的名字,是否有子元屬等等其它與結(jié)構(gòu)相關(guān)的信息,都是不得而知的,都需要你的程序來完成。這使得SA
35、X在編程處理上沒有DOM來得那么方便。endElement(Stringuri,StringlocalName,Stringname)這個方法和上面的方法相對應(yīng),在遇到結(jié)束標(biāo)簽的時候,調(diào)用這個方法。characters(charch,intstart,intlength)這個方法用來處理在XML文件中讀到的內(nèi)容,第一個參數(shù)為文件的字符串內(nèi)容,后面兩個參數(shù)是讀到的字符串在這個數(shù)組中的起始位置和長度,使用newString(ch,start,length)就可以獲取內(nèi)容。,北京傳智播客教育,使用SAX讀取XML文件,只要為SAX提供實現(xiàn)ContentHandler接口的類,那么該類就可以得到通知事
36、件(實際上就是SAX調(diào)用了該類中的回調(diào)方法)。因為ContentHandler是一個接口,在使用的時候可能會有些不方便,因此,SAX還為其制定了一個Helper類:DefaultHandler,它實現(xiàn)了ContentHandler接口,但是其所有的方法體都為空,在實現(xiàn)的時候,你只需要繼承這個類,然后重寫相應(yīng)的方法即可。使用SAX解析itcast.xml的代碼如下:publicstaticListreadXML(InputStreaminStream)trySAXParserFactoryspf=SAXParserFactory.newInstance();SAXParsersaxParser=
37、spf.newSAXParser();/創(chuàng)建解析器/設(shè)置解析器的相關(guān)特性,/sax/features/namespaces=true表示開啟命名空間特性/saxParser.setProperty(/sax/features/namespaces,true);XMLContentHandlerhandler=newXMLContentHandler();saxParser.parse(inStream,handler);inStream.close();returnhandler.getPersons();catch(Exceptione)e
38、.printStackTrace();returnnull;SAX支持已內(nèi)置到JDK1.5中,你無需添加任何的jar文件。關(guān)于XMLContentHandler的代碼實現(xiàn)請看本頁下面?zhèn)渥ⅰ?北京傳智播客教育,使用DOM讀取XML文件,除了使用SAX可以解析XML文件,大家也可以使用熟悉的DOM來解析XML文件。DOM解析XML文件時,會將XML文件的所有內(nèi)容以文檔樹方式存放在內(nèi)存中,然后允許您使用DOMAPI遍歷XML樹、檢索所需的數(shù)據(jù)。使用DOM操作XML的代碼看起來是比較直觀的,并且在編碼方面比基于SAX的實現(xiàn)更加簡單。但是,因為DOM需要將XML文件的所有內(nèi)容以文檔樹方式存放在內(nèi)存中,所
39、以內(nèi)存的消耗比較大,特別對于運行Android的移動設(shè)備來說,因為設(shè)備的資源比較寶貴,所以建議還是采用SAX來解析XML文件,當(dāng)然,如果XML文件的內(nèi)容比較小采用DOM也是可行的。代碼請看本頁下方備注,北京傳智播客教育,使用Pull解析器讀取XML文件,除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android內(nèi)置的Pull解析器解析XML文件。Pull解析器是一個開源的java項目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入類路徑中,因為Android已經(jīng)集成進(jìn)了Pull解析器,所以無需添加任何jar文件。android系統(tǒng)本
40、身使用到的各種xml文件,其內(nèi)部也是采用Pull解析器進(jìn)行解析的。Pull解析器的運行方式與SAX解析器相似。它提供了類似的事件,如:開始元素和結(jié)束元素事件,使用parser.next()可以進(jìn)入下一個元素并觸發(fā)相應(yīng)事件。跟SAX不同的是,Pull解析器產(chǎn)生的事件是一個數(shù)字,而非方法,因此可以使用一個switch對感興趣的事件進(jìn)行處理。當(dāng)元素開始解析時,調(diào)用parser.nextText()方法可以獲取下一個Text類型節(jié)點的值。使用Pull解析器讀取itcast.xml的代碼在本頁下方備注Pull解析器的源碼及文檔下載網(wǎng)址:/,北京傳智播客教育,使用
41、Pull解析器生成XML文件,有些時候,我們需要生成一個XML文件,生成XML文件的方法有很多,如:可以只使用一個StringBuilder組拼XML內(nèi)容,然后把內(nèi)容寫入到文件中;或者使用DOMAPI生成XML文件,或者也可以使用pull解析器生成XML文件,這里推薦大家使用Pull解析器。使用Pull解析器生成一個與itcast.xml文件內(nèi)容相同的myitcast.xml文件,代碼在本頁下方備注使用代碼如下(生成XML文件):FilexmlFile=newFile(myitcast.xml);FileOutputStreamoutStream=newFileOutputStream(xml
42、File);OutputStreamWriteroutStreamWriter=newOutputStreamWriter(outStream,UTF-8);BufferedWriterwriter=newBufferedWriter(outStreamWriter);writeXML(persons,writer);writer.flush();writer.close();如果只想得到生成的xml字符串內(nèi)容,可以使用StringWriter:StringWriterwriter=newStringWriter();writeXML(persons,writer);Stringcontent
43、=writer.toString();,北京傳智播客教育,使用SharedPreferences進(jìn)行數(shù)據(jù)存儲,很多時候我們開發(fā)的軟件需要向用戶提供軟件參數(shù)設(shè)置功能,例如我們常用的QQ,用戶可以設(shè)置是否允許陌生人添加自己為好友。對于軟件配置參數(shù)的保存,如果是window軟件通常我們會采用ini文件進(jìn)行保存,如果是j2se應(yīng)用,我們會采用properties屬性文件或者xml進(jìn)行保存。如果是Android應(yīng)用,我們最適合采用什么方式保存軟件配置參數(shù)呢?Android平臺給我們提供了一個SharedPreferences類,它是一個輕量級的存儲類,特別適合用于保存軟件配置參數(shù)。使用SharedPre
44、ferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/shared_prefs目錄下:SharedPreferencessharedPreferences=getSharedPreferences(itcast,Context.MODE_PRIVATE);Editoreditor=sharedPreferences.edit();/獲取編輯器editor.putString(name,傳智播客);editor.putInt(age,4);mit();/提交修改生成的itcast.xml文件內(nèi)容如下:傳智播客因為SharedPreferences背后是使用xml
45、文件保存數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個參數(shù)用于指定該文件的名稱,名稱不用帶后綴,后綴會由Android自動加上。方法的第二個參數(shù)指定文件的操作模式,共有四種操作模式,這四種模式前面介紹使用文件方式保存數(shù)據(jù)時已經(jīng)講解過。如果希望SharedPreferences背后使用的xml文件能被其他應(yīng)用讀和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。另外Activity還提供了另一個getPreferences(mode)方法操作SharedPreferences,這個方
46、法默認(rèn)使用當(dāng)前類不帶包名的類名作為文件的名稱。,北京傳智播客教育,訪問SharedPreferences中的數(shù)據(jù),訪問SharedPreferences中的數(shù)據(jù)代碼如下:SharedPreferencessharedPreferences=getSharedPreferences(itcast,Context.MODE_PRIVATE);/getString()第二個參數(shù)為缺省值,如果preference中不存在該key,將返回缺省值Stringname=sharedPreferences.getString(name,);intage=sharedPreferences.getInt(age
47、,1);如果訪問其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個為cn.itcast.action的應(yīng)用使用下面語句創(chuàng)建了preference。getSharedPreferences(itcast,Context.MODE_WORLD_READABLE);其他應(yīng)用要訪問上面應(yīng)用的preference,首先需要創(chuàng)建上面應(yīng)用的Context,然后通過Context訪問preference,訪問preference時會在應(yīng)用所在包下的sha
48、red_prefs目錄找到preference:ContextotherAppsContext=createPackageContext(cn.itcast.action,Context.CONTEXT_IGNORE_SECURITY);SharedPreferencessharedPreferences=otherAppsContext.getSharedPreferences(itcast,Context.MODE_WORLD_READABLE);Stringname=sharedPreferences.getString(name,);intage=sharedPreferences.g
49、etInt(age,0);如果不通過創(chuàng)建Context訪問其他應(yīng)用的preference,也可以以讀取xml文件方式直接訪問其他應(yīng)用preference對應(yīng)的xml文件,如:FilexmlFile=newFile(“/data/data/shared_prefs/itcast.xml”);/應(yīng)替換成應(yīng)用的包名,北京傳智播客教育,使用嵌入式關(guān)系型SQLite數(shù)據(jù)庫存儲數(shù)據(jù),除了可以使用文件或SharedPreferences存儲數(shù)據(jù),還可以選擇使用SQLite數(shù)據(jù)庫存儲數(shù)據(jù)。在Android平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫SQLite,SQLite3支持NULL、INTEGER、REAL(浮
50、點數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等數(shù)據(jù)類型,只不過在運算或保存時會轉(zhuǎn)成對應(yīng)的五種數(shù)據(jù)類型。SQLite最大的特點是你可以把各種類型的數(shù)據(jù)保存到任何字段中,而不用關(guān)心字段聲明的數(shù)據(jù)類型是什么。例如:可以在Integer類型的字段中存放字符串,或者在布爾型字段中存放浮點數(shù),或者在字符型字段中存放日期型值。但有一種情況例外:定義為INTEGERPRIMARYKEY的字段只能存儲64位整數(shù),當(dāng)向這種字段保存除整數(shù)以外的數(shù)據(jù)時,將會產(chǎn)生錯誤。另外,SQLi
51、te在解析CREATETABLE語句時,會忽略CREATETABLE語句中跟在字段名后面的數(shù)據(jù)類型信息,如下面語句會忽略name字段的類型信息:CREATETABLEperson(personidintegerprimarykeyautoincrement,namevarchar(20)SQLite可以解析大部分標(biāo)準(zhǔn)SQL語句,如:查詢語句:select*from表名where條件子句groupby分組字句having.orderby排序子句如:select*frompersonselect*frompersonorderbyiddescselectnamefrompersongroupbyn
52、amehavingcount(*)1分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面3條記錄select*fromAccountlimit5offset3或者select*fromAccountlimit3,5插入語句:insertinto表名(字段列表)values(值列表)。如:insertintoperson(name,age)values(傳智,3)更新語句:update表名set字段名=值where條件子句。如:updatepersonsetname=傳智whereid=10刪除語句:deletefrom表名where條件子句。如:deletefrompersonwh
53、ereid=10,北京傳智播客教育,使用SQLiteOpenHelper對數(shù)據(jù)庫進(jìn)行版本管理,我們在編寫數(shù)據(jù)庫應(yīng)用軟件時,需要考慮這樣的問題:因為我們開發(fā)的軟件可能會安裝在很多用戶的手機上,如果應(yīng)用使用到了SQLite數(shù)據(jù)庫,我們必須在用戶初次使用軟件時創(chuàng)建出應(yīng)用使用到的數(shù)據(jù)庫表結(jié)構(gòu)及添加一些初始化記錄,另外在軟件升級的時候,也需要對數(shù)據(jù)表結(jié)構(gòu)進(jìn)行更新。那么,我們?nèi)绾尾拍軐崿F(xiàn)在用戶初次使用或升級軟件時自動在用戶的手機上創(chuàng)建出應(yīng)用需要的數(shù)據(jù)庫表呢?總不能讓我們在每個需要安裝此軟件的手機上通過手工方式創(chuàng)建數(shù)據(jù)庫表吧?因為這種需求是每個數(shù)據(jù)庫應(yīng)用都要面臨的,所以在Android系統(tǒng),為我們提供了一個
54、名為SQLiteOpenHelper的抽象類,必須繼承它才能使用,它是通過對數(shù)據(jù)庫版本進(jìn)行管理來實現(xiàn)前面提出的需求。為了實現(xiàn)對數(shù)據(jù)庫版本進(jìn)行管理,SQLiteOpenHelper類提供了兩個重要的方法,分別是onCreate(SQLiteDatabasedb)和onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion),前者用于初次使用軟件時生成數(shù)據(jù)庫表,后者用于升級軟件時更新數(shù)據(jù)庫表結(jié)構(gòu)。當(dāng)調(diào)用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用于操作數(shù)據(jù)庫的S
55、QLiteDatabase實例的時候,如果數(shù)據(jù)庫不存在,Android系統(tǒng)會自動生成一個數(shù)據(jù)庫,接著調(diào)用onCreate()方法,onCreate()方法在初次生成數(shù)據(jù)庫時才會被調(diào)用,在onCreate()方法里可以生成數(shù)據(jù)庫表結(jié)構(gòu)及添加一些應(yīng)用使用到的初始化數(shù)據(jù)。onUpgrade()方法在數(shù)據(jù)庫的版本發(fā)生變化時會被調(diào)用,一般在軟件升級時才需改變版本號,而數(shù)據(jù)庫的版本是由程序員控制的,假設(shè)數(shù)據(jù)庫現(xiàn)在的版本是1,由于業(yè)務(wù)的變更,修改了數(shù)據(jù)庫表結(jié)構(gòu),這時候就需要升級軟件,升級軟件時希望更新用戶手機里的數(shù)據(jù)庫表結(jié)構(gòu),為了實現(xiàn)這一目的,可以把原來的數(shù)據(jù)庫版本設(shè)置為2(有同學(xué)問設(shè)置為3行不行?當(dāng)然可以
56、,如果你愿意,設(shè)置為100也行),并且在onUpgrade()方法里面實現(xiàn)表結(jié)構(gòu)的更新。當(dāng)軟件的版本升級次數(shù)比較多,這時在onUpgrade()方法里面可以根據(jù)原版號和目標(biāo)版本號進(jìn)行判斷,然后作出相應(yīng)的表結(jié)構(gòu)及數(shù)據(jù)更新。getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用于操作數(shù)據(jù)庫的SQLiteDatabase實例。但getWritableDatabase()方法以讀寫方式打開數(shù)據(jù)庫,一旦數(shù)據(jù)庫的磁盤空間滿了,數(shù)據(jù)庫就只能讀而不能寫,倘若使用getWritableDatabase()打開數(shù)據(jù)庫就會出錯。getReadableDatabas
57、e()方法先以讀寫方式打開數(shù)據(jù)庫,如果數(shù)據(jù)庫的磁盤空間滿了,就會打開失敗,當(dāng)打開失敗后會繼續(xù)嘗試以只讀方式打開數(shù)據(jù)庫。,北京傳智播客教育,使用SQLiteOpenHelper對數(shù)據(jù)庫進(jìn)行版本管理,publicclassDatabaseHelperextendsSQLiteOpenHelper/類沒有實例化,是不能用作父類構(gòu)造器的參數(shù),必須聲明為靜態(tài)privatestaticfinalStringname=itcast;/數(shù)據(jù)庫名稱privatestaticfinalintversion=1;/數(shù)據(jù)庫版本publicDatabaseHelper(Contextcontext)/第三個參數(shù)Curs
58、orFactory指定在執(zhí)行查詢時獲得一個游標(biāo)實例的工廠類,設(shè)置為null,代表使用系統(tǒng)默認(rèn)的工廠類super(context,name,null,version);OverridepublicvoidonCreate(SQLiteDatabasedb)db.execSQL(CREATETABLEIFNOTEXISTSperson(personidintegerprimarykeyautoincrement,namevarchar(20),ageINTEGER);OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewV
59、ersion)db.execSQL(ALTERTABLEpersonADDphoneVARCHAR(12)NULL);/往表中增加一列/DROPTABLEIFEXISTSperson刪除表在實際項目開發(fā)中,當(dāng)數(shù)據(jù)庫表結(jié)構(gòu)發(fā)生更新時,應(yīng)該避免用戶存放于數(shù)據(jù)庫中的數(shù)據(jù)丟失。,北京傳智播客教育,使用SQLiteDatabase操作SQLite數(shù)據(jù)庫,Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作數(shù)據(jù)庫的API,使用該類可以完成對數(shù)據(jù)進(jìn)行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)。對SQLiteDatabase的學(xué)習(xí),我們應(yīng)該重點掌握execSQL()和rawQuery()方法。execSQL()方法可以執(zhí)行insert、delete、u
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 秋分溫泉活動策劃方案(3篇)
- 學(xué)校歷史文化管理制度(3篇)
- 2026年聊城市中醫(yī)醫(yī)院“水城優(yōu)才”青年人才引進(jìn)參考考試題庫及答案解析
- 現(xiàn)代裝飾公司店長管理制度(3篇)
- 2026年度德州市事業(yè)單位公開招聘初級綜合類崗位人員(526人)備考考試題庫及答案解析
- 2026山東事業(yè)單位統(tǒng)考濟南歷城區(qū)屬招聘初級綜合類崗位50人參考考試題庫及答案解析
- 2026浙江興海控股集團(tuán)有限公司下屬企業(yè)招聘3人備考考試試題及答案解析
- 2026年甘肅省酒泉民健康復(fù)醫(yī)院招聘考試備考試題及答案解析
- 2026上半年黑龍江伊春市事業(yè)單位招聘262人參考考試題庫及答案解析
- 2026浙江南方水泥有限公司校園招聘備考考試試題及答案解析
- 2025ACCP實踐指南:危重患者血漿與血小板輸注指南解讀
- 腳手架施工環(huán)境保護(hù)措施方案
- 符號互動理論課件
- 獸藥使用法律法規(guī)學(xué)習(xí)材料
- 農(nóng)村道路交通安全課件兒
- 移動式腳手架培訓(xùn)課件
- 高二上學(xué)期哪吒課堂趣味懲罰游戲(課件版)
- 電石卸車安全操作規(guī)程
- 應(yīng)急救援訓(xùn)練基地建設(shè)項目可行性研究報告
- 安徽控告申訴知識競賽(含答案)
- 2025-2030高端汽車品牌營銷策略與消費者畫像分析報告
評論
0/150
提交評論