版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育3G應(yīng)用開發(fā)之Android講師:黎活明—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育什么是3G3G,全稱為3rd
Generation,中文含義就是指第三代數(shù)字通信。所謂3G,是指將無線通信與國際互聯(lián)網(wǎng)等多媒體通信結(jié)合的新一代移動通信系統(tǒng)。
3G只是一種通信技術(shù)標(biāo)準(zhǔn),符合這個標(biāo)準(zhǔn)的技術(shù)有WCDMA、CDMA2000、TD-SCDMA三種制式。中國聯(lián)通使用的是WCDMA(世界上大部分3G網(wǎng)絡(luò)都采用的是該標(biāo)準(zhǔn));中國電信使用的是CDMA2000
(日、韓和北美使用);中國移動使用的是具有自主知識產(chǎn)權(quán)的TD-SCDMA(只有中國才使用)。相對第一代模擬制式手機(jī)(1G)和第二代GSM、CDMA等數(shù)字手機(jī)(2G),3G網(wǎng)絡(luò)能處理圖像、音樂、視頻等多種媒體形式,提供包括網(wǎng)頁瀏覽、電話會議、電子商務(wù)等多種信息服務(wù)。第三代與前兩代的主要區(qū)別是在傳輸聲音和數(shù)據(jù)的速度上有很大的提升。由于3G商用需要相當(dāng)浩大的工程,要從目前的2G邁向3G不可能一下就銜接得上,因此前幾年2.5G的手機(jī)就出現(xiàn)了。符合2.5G標(biāo)準(zhǔn)的技術(shù)有
CDMA2000
1X和GPRS,中國聯(lián)通使用的是CDMA2000
1X標(biāo)準(zhǔn),中國移動使用的是GPRS標(biāo)準(zhǔn)。目前,我們可以把2.5G移動通信技術(shù)看作是2G邁向
3G的銜接性技術(shù),在2.5G網(wǎng)絡(luò)下出現(xiàn)了如WAP、藍(lán)牙(Bluetoot)等技術(shù)。—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育智能手機(jī)軟件平臺智能手機(jī)軟件平臺有:Symbian,Windows
Mobile,RIM
BlackBerry,Android,iPhone,Palm,Brew,Java/J2ME。2009年市場份額:Symbian
51%RIM
BlackBerry
18%iPhone
13.3windows
Mobile
9.3%linux
4.6%Android
1.8%—高級軟件人才實(shí)作培訓(xùn)專家!什么是AndroidAndroid一詞的本義指“機(jī)器人”,Android是
Google于07年11月5日宣布的基于Linux平臺開源手機(jī)操作系統(tǒng)名稱,該平臺由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成。在國內(nèi),聯(lián)想、戴爾、多普達(dá)、飛利浦、中興、三星、摩托羅拉、LG、宇龍酷派、海信、TCL等十余家廠商計劃
將在09年底推出基于Android平臺的智能手機(jī)。在3G應(yīng)用開發(fā)領(lǐng)域,Android的發(fā)展前景不容小視,也將會成為未來主流的手機(jī)操作系統(tǒng)。北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育如何安裝Android
SDK和Eclipse插件所需開發(fā)環(huán)境:JDK
5或JDK
6(僅有JRE不夠)Eclipse
3.5
(galileo)下載ADT的Eclipse插件/android/ADT-0.9.5.zip安裝Eclipse插件(ADT)啟動Eclipse,選擇Help>Install
New
Software,在出現(xiàn)的對話框里,點(diǎn)擊Add按鈕,在對話框的name一欄輸入“ADT”,然后點(diǎn)擊Archive...,瀏覽和選擇已經(jīng)下載的ADT插件壓縮文件。
點(diǎn)擊OK.。返回可用軟件的視圖,你會看到這個插件,然后選擇Developer
Tools(會選中下面的“Android
Developer
Tools”和“Android
Editors“),點(diǎn)擊Next,最后重啟Eclipse。下載Android
SDK:/android/android-sdk_r04-windows.zip下載完SDK后,把.zip文件解壓到你電腦上合適位置。啟動Eclipse,選擇window->preferences,在打開的視圖左邊點(diǎn)擊android,在右邊的SDK
Location中選擇Android
SDK所在位置?!呒壾浖瞬艑?shí)作培訓(xùn)專家!開發(fā)第一個Android應(yīng)用打開Eclipse,新建項(xiàng)目(點(diǎn)擊File
New Project),在項(xiàng)目列表中展開Android目錄,選擇AndroidProject,如下圖:北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!開發(fā)第一個Android應(yīng)用北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!開發(fā)第一個Android應(yīng)用點(diǎn)擊”finish”即可完成項(xiàng)目的創(chuàng)建,創(chuàng)建后的項(xiàng)目已經(jīng)是一個可運(yùn)行的Android應(yīng)用,我們可以通過下面方式運(yùn)行此應(yīng)用:點(diǎn)擊工具欄上手機(jī)形狀的虛擬設(shè)備管理器(簡稱“AVD“),如下:北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!開發(fā)第一個Android應(yīng)用在打開的虛擬設(shè)備管理器中創(chuàng)建一個虛擬手機(jī):北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!開發(fā)第一個Android應(yīng)用在項(xiàng)目上右鍵點(diǎn)擊run
as Android
application,如下圖:北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育Android應(yīng)用程序架構(gòu)src/java原代碼存放目錄
gen/自動生成目錄gen目錄中存放所有由Android開發(fā)工具自動生成的文件。目錄中最重要的就是R.java文件。這個文件由Android開發(fā)工具自動產(chǎn)生的。Android開發(fā)工具會自動根據(jù)你放入res目錄的xml界面文件、圖標(biāo)與常量,同步更新修改R.java文件。正因?yàn)镽.java文件是由開發(fā)工具自動生成的,所以我們應(yīng)避免手工修改R.java。R.java在應(yīng)用中起到了字典的作用,它包含了界面、圖標(biāo)、常量等各種資源的id,通過R.java,應(yīng)用可以很方便地找到對應(yīng)資源。另外編繹器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編繹進(jìn)軟件中,這樣可以減少應(yīng)用在手機(jī)占用的空間。res/資源(Resource)目錄在這個目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖標(biāo)或常量
res/drawable
專門存放圖標(biāo)文件res/layout
專門存放xml界面文件,xml界面文件和HTML文件一樣,主要用于用戶界面顯示
res/values
專門存放應(yīng)用使用到的各種常量,作用和struts中的國際化資源文件一樣。
AndroidManifest.xml
功能清單文件這個文件列出了應(yīng)用程序所提供的功能,在這個文件中,你可以指定應(yīng)用程序使用到的服務(wù)(如電話服務(wù)、互聯(lián)網(wǎng)服務(wù)、短信服務(wù)、GPS服務(wù)等等)。另外當(dāng)你新添加一個Activity的時候,也需要在這個文件中進(jìn)行相應(yīng)配置,只有配置好后,才能調(diào)用此Activity。perties
系統(tǒng)默認(rèn)信息,一般是不需要修改此文件—高級軟件人才實(shí)作培訓(xùn)專家!電話拔號器效果圖:北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育電話拔號器因?yàn)閼?yīng)用要使用手機(jī)的電話服務(wù),所以要在清單文件AndroidManifest.xml中添加電話服務(wù)權(quán)限:<?xml
version="1.0"
encoding="utf-8"?><manifest
xmlns:android="/apk/res/android"package="cn.itcast.action"android:versionCode="1"android:versionName="1.0">略....<uses-sdk
android:minSdkVersion=“6"
/><uses-permission
android:name="android.permission.CALL_PHONE"/></manifest>—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育電話拔號器界面布局:<?xml
version="1.0"
encoding="utf-8"?><LinearLayout
xmlns:android="/apk/res/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/inputmobile"/><EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/mobile"/><Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button"android:id="@+id/button"/></LinearLayout>LinearLayout(線性布局)、AbsoluteLayout(絕對布局)、RelativeLayout(相對布局)、
TableLayout(表格布局)、FrameLayout(幀布局)—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育電話拔號器Activity:public
class
DialerAction
extends
Activity
{@Overridepublic
void
onCreate(Bundle
savedInstanceState)
{super.onCreate(savedInstanceState);setContentView(R.layout.main);Button
button
=
(Button)findViewById(R.id.button);button.setonclickListener(new
View.onclickListener(){public
void
onclick(View
v)
{EditText
editText
=
(EditText)findViewById(R.id.mobile);
Intent
intent
=
new
Intent(Intent.ACTION_CALL,
Uri.parse("tel:"+editText.getText()));DialerAction.this.startActivity(intent);}});}}—高級軟件人才實(shí)作培訓(xùn)專家!電話拔號器測試步驟:1>在Eclipse中運(yùn)行此應(yīng)用2>在Dos窗口中進(jìn)入android
SDK安裝路徑的tools目錄,輸入以下命令再開啟一個Android模擬器:
emulator-data
itcast注:itcast為用戶數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件3>在電話擾號器中輸入上圖現(xiàn)顯的電話號碼北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!短信發(fā)送器效果圖:北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育短信發(fā)送器因?yàn)閼?yīng)用要使用手機(jī)的短信服務(wù),所以要在清單文件AndroidManifest.xml中添加短信服務(wù)權(quán)限:<?xml
version="1.0"
encoding="utf-8"?><manifest
xmlns:android="/apk/res/android"package="cn.itcast.sms"android:versionCode="1"android:versionName="1.0">略....<uses-sdk
android:minSdkVersion=“4"
/><uses-permission
android:name="android.permission.SEND_SMS"/></manifest>—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育短信發(fā)送器界面布局:<?xml
version="1.0"
encoding="utf-8"?><LinearLayout
xmlns:android="/apk/res/android"android:orientation="vertical“
android:layout_width="fill_parent“
android:layout_height="fill_parent"
><TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/inputmobile"/><EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/mobile"/><TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/content"/><EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minLines="3"android:id="@+id/content"/><Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button"android:id="@+id/button"/></LinearLayout>—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育短信發(fā)送器Activity主要代碼:String
mobile
=
mobileView.getText().toString();String
content
=
contentView.getText().toString();SmsManager
smsManager
=
SmsManager.getDefault();PendingIntent
sentIntent
=
PendingIntent.getBroadcast(SMSSender.this,
0,
newIntent(),
0);if(content.length()>70){//如果字?jǐn)?shù)超過70,需拆分成多條短信發(fā)送
List<String>
msgs=smsManager.divideMessage(content);for(String
msg:msgs){smsManager.sendTextMessage(mobile,
null,
msg,
sentIntent,
null);//最后二個參數(shù)為短信已發(fā)送的廣播意圖,最后一個參數(shù)為短信對方已收到短信的廣播意圖}}else{smsManager.sendTextMessage(mobile,
null,
content,
sentIntent,
null);}Toast.makeText(SMSSender.this,"短信發(fā)送完成",Toast.LENGTH_LONG).show();—高級軟件人才實(shí)作培訓(xùn)專家!短信發(fā)送器測試步驟:1>在Eclipse中運(yùn)行此應(yīng)用2>在Dos窗口中進(jìn)入android
SDK安裝路徑的tools目錄,輸入以下命令再開啟一個Android模擬器:
emulator-data
itcast注:itcast為用戶數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件3>在短信發(fā)送器的手機(jī)號中輸入上圖現(xiàn)顯的電話號碼注:目前Android系統(tǒng)對中文短信尚未支持,所以發(fā)送中文短信會有亂碼,這個問題日后會被解決的。北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育數(shù)據(jù)存儲與訪問很多時候我們的軟件需要對處理后的數(shù)據(jù)進(jìn)行存儲或再次訪問。Android為數(shù)據(jù)存儲提供了多種方式,分別有如下幾種:文件
SharedPreferencesSQLite數(shù)據(jù)庫內(nèi)容提供者(Content
provider)網(wǎng)絡(luò)—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用文件進(jìn)行數(shù)據(jù)存儲首先給大家介紹使用文件如何對數(shù)據(jù)進(jìn)行存儲,Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中,具體的實(shí)現(xiàn)過程與在J2SE環(huán)境中保存數(shù)據(jù)到文件中是一樣的。public
class
FileActivity
extends
Activity
{@Override
public
void
onCreate(Bundle
savedInstanceState)
{...FileOutputStream
outStream=this.openFileOutput("itcast.txt",Context.MODE_PRIVATE);outStream.write("傳智播客".getBytes());outStream.close();}}openFileOutput()方法的第一參數(shù)用于指定文件名稱,不能包含路徑分隔符“/”,如果文件不存在,Android會自動創(chuàng)建它。創(chuàng)建的文件保存在/data/data/<package
name>/files目錄,如:/data/data/cn.itcast.action/files/itcast.txt
,通過點(diǎn)擊Eclipse菜單“Window”-“Show
View”-“Other”,在對話窗口中展開android文件夾,選擇下面的File
Explorer視圖,然后在FileExplorer視圖中展開/data/data/<package
name>/files目錄就可以看到該文件。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為:Context.MODE_PRIVATE =
0Context.MODE_APPEND =
32768Context.MODE_WORLD_READABLE
=
1Context.MODE_WORLD_WRITEABLE
=
2—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用文件進(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用來控制其他應(yīng)用是否有權(quán)限讀寫該文件。MODE_WORLD_READABLE:表示當(dāng)前文件可以被其他應(yīng)用讀??;
MODE_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)建的文件,
sharedpreferences,數(shù)據(jù)庫都應(yīng)該是私有的(位于/data/data/<package
name>/files),其他程序無法訪問。除非在創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者
Context.MODE_WORLD_WRITEABLE,只有這樣其他程序才能正確訪問。public
static
String
readInStream(FileInputStream
inStream){try
{ByteArrayOutputStreamoutStream=
new
ByteArrayOutputStream();byte[]
buffer
=
new
byte[1024];int
length
=-1;while((length
=
inStream.read(buffer))
!=
-1
){outStream.write(buffer,
0,
length);}outStream.close();inStream.close();return
outStream.toString();}
catch(IOException
e){Log.i("FileTest",
e.getMessage());}return
null;}—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育讀取文件內(nèi)容如果要打開存放在/data/data/<package
name>/files目錄應(yīng)用私有的文件,可以使用Activity提供
openFileInput()方法。FileInputStream
inStream
=
this.getContext().openFileInput("itcast.txt");Log.i("FileTest",
readInStream(inStream));readInStream()的方法請看本頁下面?zhèn)渥?。或者直接使用文件的絕對路徑:File
file
=
new
File("/data/data/cn.itcast.action/files/itcast.txt");FileInputStream
inStream
=
new
FileInputStream(file);Log.i("FileTest",
readInStream(inStream));注意:上面文件路徑中的“cn.itcast.action”為應(yīng)用所在包,當(dāng)你在編寫代碼時應(yīng)替換為你自己應(yīng)用使用的包。對于私有文件只能被創(chuàng)建該文件的應(yīng)用訪問,如果希望文件能被其他應(yīng)用讀和寫,可以在創(chuàng)建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。Activity還提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于獲取/data/data/<package
name>/cache目錄
getFilesDir()方法用于獲取/data/data/<package
name>/files目錄—高級軟件人才實(shí)作培訓(xùn)專家!把文件存放在SDCard使用Activity的openFileOutput()方法保存文件,文件是存放在手機(jī)空間上,一般手機(jī)的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。對于像視頻這樣的大文件,我們可以把它存放在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)入android
SDK安裝路徑的tools目錄,輸入以下命令創(chuàng)建一張容量為2G的SDCard,文件后綴可以隨便取,建議使用.img:mksdcard
2048M
D:\AndroidTool\sdcard.img在程序中訪問SDCard,你需要申請訪問SDCard的權(quán)限。在AndroidManifest.xml中加入訪問SDCard的權(quán)限如下:<!--在SDCard中創(chuàng)建與刪除文件權(quán)限--><uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!--往SDCard寫入數(shù)據(jù)權(quán)限--><uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>北京傳智播客教育—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育把文件存放在SDCard要往SDCard存放文件,程序必須先判斷手機(jī)是否裝有SDCard,并且可以進(jìn)行讀寫。注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權(quán)限if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File
sdCardDir=Environment.getExternalStorageDirectory();//獲取SDCard目錄
File
saveFile=new
File(sdCardDir,
“itcast.txt”);FileOutputStream
outStream=new
FileOutputStream(saveFile);outStream.write("傳智播客".getBytes());
outStream.close();}Environment.getExternalStorageState()方法用于獲取SDCard的狀態(tài),如果手機(jī)裝有SDCard,并且可以進(jìn)行讀寫,那么方法返回的狀態(tài)等于Environment.MEDIA_MOUNTED。Environment.getExternalStorageDirectory()方法用于獲取SDCard的目錄,當(dāng)然要獲取SDCard的目錄,你也可以這樣寫:File
sdCardDir=new
File("/sdcard");
//獲取SDCard目錄
File
saveFile=new
File(sdCardDir,
"itcast.txt");//上面兩句代碼可以合成一句:File
saveFile=new
File("/sdcard/itcast.txt");FileOutputStream
outStream=new
FileOutputStream(saveFile);outStream.write("傳智播客test".getBytes());outStream.close();public
class
Person
{private
Integer
id;private
String
name;private
Short
age;public
Integer
getId()
{return
id;}public
void
setId(Integer
id)
{this.id
=
id;}public
String
getName()
{return
name;}public
void
setName(Stringname){
=
name;}public
Short
getAge()
{return
age;}public
void
setAge(Short
age)
{this.age
=
age;}}—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用SAX或者DOM或者pull讀取XML文件在Android平臺上可以使用Simple
API
for
XML(SAX)、Document
Object
Model(DOM)和Android附帶的
pull解析器解析XML文件。下面是本例子要解析的XML文件:文件名稱:itcast.xml<?xml
version="1.0"
encoding="UTF-8"?><persons><person
id="23"><name>李明</name><age>30</age></person><person
id="20"><name>李向梅</name><age>25</age></person></persons>例子定義了一個javabean用于存放上面解析出來的xml內(nèi)容,這個javabean為Person,代碼請見本頁下面?zhèn)渥ⅲ?lt;?xml
version="1.0"
encoding="UTF-8"?><persons><person
id="23"><name>李明</name><age>30</age></person><person
id="20"><name>李向梅</name><age>25</age></person></persons>解析itcast.xml觸發(fā)的事件為:
讀到的標(biāo)簽及內(nèi)容 觸發(fā)事件{文檔開始}
startDocument()<persons>
startElement(,
"persons",
null,
"{Attributes}")"\n\t"
characters("<persons>...</persons>",
"12",
"2")<person>
startElement(,
"person",
null,
"{Attributes}")"\n\t\t"
characters("<persons>...</persons>",
"31",
"3")<name>
startElement(,
"name",
null,
"{Attributes}")"李明"
characters("<persons>...</persons>",
"40",
"2")</name>
endElement("",
"name",
null)"\n\t\t"
characters("<persons>...</persons>",
"50",
"3")<age>
startElement(,
"age",
null,
"{Attributes}")"30"
characters("<persons>...</persons>",
"58",
"2")</age>
endElement("",
"age",
null)"\n\t"
characters("<persons>...</persons>",
"67",
"2")</person>
endElement("",
"person",
null)"\n\t"
characters("<persons>...</persons>",
"79",
"2")<person>
startElement(,
"person",
null,
"{Attributes}")"\n\t\t"
characters("<persons>...</persons>",
"98",
"3")<name>
startElement(,
"name",
null,
"{Attributes}")"李向梅"
characters("<persons>...</persons>",
"107",
"3")</name>
endElement("",
"name",
null)"\n\t\t"
characters("<persons>...</persons>",
"118",
"3")<age>startElement(,
"age",
nul,
"{Attributes}")—高級軟件人才實(shí)作培訓(xùn)專家!使用SAX讀取XML文件SAX是一個解析速度快并且占用內(nèi)存少的xml解析器,非常適合用于Android等移動設(shè)備。SAX解析XML文件采用的是事件驅(qū)動,也就是說,它并不需要解析完整個文檔,在按內(nèi)容順序解析文檔的過程中,SAX會判斷當(dāng)前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發(fā)事件。所謂事件,其實(shí)就是一些回調(diào)(callback)方法,這些方法(事件)定義在ContentHandler接口。下面是一些ContentHandler接口常用的方法:startDocument()當(dāng)遇到文檔的開頭的時候,調(diào)用這個方法,可以在其中做一些預(yù)處理的工作。
endDocument()和上面的方法相對應(yīng),當(dāng)文檔結(jié)束的時候,調(diào)用這個方法,可以在其中做一些善后的工作。
startElement(String
namespaceURI,String
localName,String
qName,Attributes
atts)當(dāng)讀到一個開始標(biāo)簽的時候,會觸發(fā)這個方法。namespaceURI就是命名空間,localName是不帶命名空間
前綴的標(biāo)簽名,qName是帶命名空間前綴的標(biāo)簽名。通過atts可以得到所有的屬性名和相應(yīng)的值。要注意的是SAX中一個重要的特點(diǎn)就是它的流式處理,當(dāng)遇到一個標(biāo)簽的時候,它并不會紀(jì)錄下以前所碰到的標(biāo)簽,也就是說,在startElement()方法中,所有你所知道的信息,就是標(biāo)簽的名字和屬性,至于標(biāo)簽的嵌套結(jié)構(gòu),上層標(biāo)簽的名字,是否有子元屬等等其它與結(jié)構(gòu)相關(guān)的信息,都是不得而知的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM來得那么方便。endElement(String
uri,
String
localName,
String
name)這個方法和上面的方法相對應(yīng),在遇到結(jié)束標(biāo)簽的時候,調(diào)用這個方法。
characters(char[]ch,int
start,int
length)這個方法用來處理在XML文件中讀到的內(nèi)容,第一個參數(shù)用于存放文件的內(nèi)容,后面兩個參數(shù)是讀到的字符串在這個數(shù)組中的起始位置和長度,使用new
String(ch,start,length)就可以獲取內(nèi)容。北京傳智播客教育import
java.util.ArrayList;import
java.util.List;import
org.xml.sax.Attributes;import
org.xml.sax.SAXException;import
org.xml.sax.helpers.DefaultHandler;import
cn.itcast.xml.domain.Person;public
class
XMLContentHandler
extends
DefaultHandler
{private
List<Person>
persons
=
null;private
Person
currentPerson;private
StringtagName=null;//當(dāng)前解析的元素標(biāo)簽public
List<Person>
getPersons()
{return
persons;}/**
接收文檔的開始的通知。*/@Override
public
void
startDocument()
throws
SAXException
{persons
=
newArrayList<Person>();}/**
接收字符數(shù)據(jù)的通知。*/@Override
public
void
characters(char[]
ch,
int
start,
int
length)
throws
SAXException
{if(tagName!=null){String
data
=
new
String(ch,
start,
length);if(tagName.equals("name")){this.currentPerson.setName(data);}else
if(tagName.equals("age")){this.currentPerson.setAge(Short.parseShort(data));}—高級軟件人才實(shí)作培訓(xùn)專家!使用SAX讀取XML文件只要為SAX提供實(shí)現(xiàn)ContentHandler接口的類,那么該類就可以得到通知事件(實(shí)際上就是SAX調(diào)用了該類中的回調(diào)方法)。因?yàn)镃ontentHandler是一個接口,在使用的時候可能會有些不方便,因此,SAX還為其制定了一個Helper類:DefaultHandler,它實(shí)現(xiàn)了這個接口,但是其所有的方法體都為空,在實(shí)現(xiàn)的時候,你只需要繼承這個類,然后重載相應(yīng)的方法即可。使用SAX解析itcast.xml的代碼如下:public
static
List<Person>
readXML(InputStream
inStream)
{try
{SAXParserFactory
spf=SAXParserFactory.newInstance();
SAXParser
saxParser=spf.newSAXParser();//創(chuàng)建解析器//設(shè)置解析器的相關(guān)特性,/sax/features/namespaces=true表示開啟命名空間特性saxParser.setProperty("/sax/features/namespaces",true);
XMLContentHandler
handler=new
XMLContentHandler();saxParser.parse(inStream,
handler);inStream.close();return
handler.getPersons();}
catch
(Exception
e)
{e.printStackTrace();}return
null;}SAX支持已內(nèi)置到JDK1.5中,你無需添加任何的jar文件。關(guān)于XMLContentHandler的代碼實(shí)現(xiàn)請看本頁下面?zhèn)渥ⅰ1本﹤髦遣タ徒逃齷importjava.io.InputStream;import
java.util.ArrayList;import
java.util.List;import
javax.xml.parsers.DocumentBuilder;import
javax.xml.parsers.DocumentBuilderFactory;import
org.w3c.dom.Document;import
org.w3c.dom.Element;import
org.w3c.dom.Node;import
org.w3c.dom.NodeList;import
cn.itcast.xml.domain.Person;/***
使用Dom解析xml文件**/public
class
DomXMLReader{public
static
List<Person>
readXML(InputStreaminStream)
{
List<Person>
persons
=
new
ArrayList<Person>();DocumentBuilderFactory
factory
=
DocumentBuilderFactory.newInstance();try
{DocumentBuilder
builder
=
factory.newDocumentBuilder();Documentdom=
builder.parse(inStream);Element
root=
dom.getDocumentElement();NodeList
items=root.getElementsByTagName("person");//查找所有person節(jié)點(diǎn)
for(int
i=0;i<items.getLength();i++){Person
person
=
new
Person();//得到第一個person節(jié)點(diǎn)Element
personNode
=
(Element)items.item(i);//獲取person節(jié)點(diǎn)的id屬性值person.setId(new
Integer(personNode.getAttribute("id")));//獲取person節(jié)點(diǎn)下的所有子節(jié)點(diǎn)(標(biāo)簽之間的空白節(jié)點(diǎn)和name/age元素)—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育NodeList
childsNodes
=
personNode.getChildNodes();使用DOM讀取XML文件除了可以使用SAX解析XML文件,大家也可以使用熟悉的DOM來解析XML文件。DOM解析XML文件時,會將XML文件的所有內(nèi)容讀取到內(nèi)存中,然后允許您使用DOM
API遍歷XML樹、檢索所需的數(shù)據(jù)。使用DOM操作XML的代碼看起來比較直觀,并且,在某些方面比基于SAX的實(shí)現(xiàn)更加簡單。但是,因?yàn)镈OM需要將XML文件的所有內(nèi)容讀取到內(nèi)存中,所以內(nèi)存的消耗比較大,特別對于運(yùn)行Android的移動設(shè)備來說,因?yàn)樵O(shè)備的資源比較寶貴,所以建議還是采用SAX來解析XML文件,當(dāng)然,如果XML文件的內(nèi)容比較小采用DOM是可行的。代碼請看本頁下方備注import
org.xmlpull.v1.XmlPullParser;import
android.util.Xml;import
cn.itcast.xml.domain.Person;public
class
PullXMLReader
{public
static
List<Person>
readXML(InputStreaminStream)
{XmlPullParser
parser
=
Xml.newPullParser();try
{parser.setInput(inStream,
"UTF-8");
int
eventType
=parser.getEventType();Person
currentPerson
=
null;List<Person>
persons
=
null;while
(eventType
!=
XmlPullParser.END_DOCUMENT)
{switch
(eventType)
{case
XmlPullParser.START_DOCUMENT://文檔開始事件,可以進(jìn)行數(shù)據(jù)初始化處理
persons=newArrayList<Person>();break;case
XmlPullParser.START_TAG://開始元素事件
String
name=parser.getName();if
(name.equalsIgnoreCase("person"))
{currentPerson
=
new
Person();currentPerson.setId(new
Integer(parser.getAttributeValue(null,
"id")));}
else
if
(currentPerson
!=
null)
{if
(name.equalsIgnoreCase("name"))
{currentPerson.setName(parser.nextText());//如果后面是Text元素,即返回它的值}
else
if(name.equalsIgnoreCase("age"))
{currentPerson.setAge(new
Short(parser.nextText()));}}break;case
XmlPullParser.END_TAG://結(jié)束元素事件if(parser.getName().equalsIgnoreCase("person")
&&
currentPerson
!=
null)
{persons.add(currentPerson);currentPerson
=nul;—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用Pull解析器讀取XML文件除了可以使用SAX和DOM解析XML文件,大家也可以使用Android內(nèi)置的Pull解析器解析XML文件。Pull解析器的運(yùn)行方式與SAX解析器相似。它提供了類似的事件,如:開始元素和結(jié)束元素事件,使用parser.next()可以進(jìn)入下一個元素并觸發(fā)相應(yīng)事件。事件將作為數(shù)值代碼被發(fā)送,因此可以使用一個switch對感興趣的事件進(jìn)行處理。當(dāng)元素開始解析時,調(diào)用parser.nextText()方法可以獲取下一個Text類型元素的值。使用Pull解析器讀取itcast.xml的代碼在本頁下方備注Pull解析器的源碼及文檔下載網(wǎng)址:/public
static
StringwriteXML(List<Person>
persons,
Writer
writer){XmlSerializer
serializer
=
Xml.newSerializer();try
{serializer.setOutput(writer);serializer.startDocument("UTF-8",
true);//第一個參數(shù)為命名空間,如果不使用命名空間,可以設(shè)置為nullserializer.startTag("","persons");for
(Person
person
:
persons){serializer.startTag("",
"person");serializer.attribute("",
"id",
person.getId().toString());serializer.startTag("",
"name");serializer.text(person.getName());serializer.endTag("",
"name");serializer.startTag("",
"age");serializer.text(person.getAge().toString());serializer.endTag("",
"age");serializer.endTag("",
"person");}serializer.endTag("",
"persons");serializer.endDocument();return
writer.toString();}
catch
(Exception
e)
{e.printStackTrace();}return
null;}—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用Pull解析器生成XML文件有些時候,我們需要生成一個XML文件,生成XML文件的方法有很多,如:可以只使用一個StringBuilder組拼XML內(nèi)容,然后把內(nèi)容寫入到文件中;或者使用DOM
API生成XML文件,或者也可以使用pull解析器生成XML文件,這里推薦大家使用Pull解析器。使用Pull解析器生成一個與itcast.xml文件內(nèi)容相同的myitcast.xml文件,代碼在本頁下方備注使用代碼如下(生成XML文件):File
xmlFile
=
new
File("myitcast.xml");FileOutputStream
outStream
=
new
FileOutputStream(xmlFile);OutputStreamWriter
outStreamWriter
=
new
OutputStreamWriter(outStream,
"UTF-8");BufferedWriter
writer
=
new
BufferedWriter(outStreamWriter);writeXML(persons,
writer);writer.flush();writer.close();如果只想得到生成的xml內(nèi)容,可以使用StringWriter:StringWriter
writer=new
StringWriter();writeXML(persons,
writer);String
content
=
writer.toString();—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用SharedPreferences進(jìn)行數(shù)據(jù)存儲很多時候我們開發(fā)的軟件需要向用戶提供軟件參數(shù)設(shè)置功能,例如我們常用的QQ,用戶可以設(shè)置是否允許陌生人添加自己為好友。對于軟件配置參數(shù)的保存,如果是window軟件通常我們會采用ini文件進(jìn)行保存,如果是j2se應(yīng)用,我們會采用properties屬性文件進(jìn)行保存。如果是Android應(yīng)用,我們最適合采用什么方式保存軟件配置參數(shù)呢?Android平臺給我們提供了一個SharedPreferences類,它是一個輕量級的存儲類,特別適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/<package
name>/shared_prefs目錄下:SharedPreferences
sharedPreferences
=
getSharedPreferences("itcast",
Context.MODE_PRIVATE);Editor
editor=sharedPreferences.edit();//獲取編輯器editor.putString("name","傳智播客");editor.putInt("age",4);mit();//提交修改生成的itcast.xml文件內(nèi)容如下:<?xml
version="1.0"
encoding="utf-8"
standalone="yes"
?><map><string
name="name">傳智播客</string><int
name="age"
value="4"
/></map>因?yàn)镾haredPreferences背后是使用xml文件保存數(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,這個方法默認(rèn)使用當(dāng)前類不帶包名的類名作為文件的名稱?!呒壾浖瞬艑?shí)作培訓(xùn)專家!北京傳智播客教育訪問SharedPreferences中的數(shù)據(jù)訪問SharedPreferences中的數(shù)據(jù)代碼如下:SharedPreferences
sharedPreferences
=
getSharedPreferences("itcast",
Context.MODE_PRIVATE);//getString()第二個參數(shù)為缺省值,如果preference中不存在該key,將返回缺省值String
name=sharedPreferences.getString("name","");int
age
=
sharedPreferences.getInt("age",
1);如果訪問其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時指定了
Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個<package
name>為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)用所在包下的shared_prefs目錄找到preference:Context
otherAppsContext
=
createPackageContext("cn.itcast.action",
Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences
sharedPreferences
=
otherAppsContext.getSharedPreferences("itcast",
Context.MODE_WORLD_READABLE);String
name
=
sharedPreferences.getString("name",
"");int
age
=
sharedPreferences.getInt("age",
0);如果不通過創(chuàng)建Context訪問其他應(yīng)用的preference,可以以讀取xml文件方式直接訪問其他應(yīng)用preference對應(yīng)的xml文件,如:File
xmlFile=new
File(“/data/data/<package
name>/shared_prefs/itcast.xml”);//<package
name>應(yīng)替換成應(yīng)用的名—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用嵌入式關(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(浮點(diǎn)數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型雖然只有五種,但實(shí)際上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等數(shù)據(jù)類型,只不過在運(yùn)算或保存時會轉(zhuǎn)成對應(yīng)的五種數(shù)據(jù)類型。SQLite最大的特點(diǎn)是你可以保存任何類型的數(shù)據(jù)到任何字段中,無論這列聲明的數(shù)據(jù)類型是什么。例如:可以在Integer字段中存放字符串,或者在布爾型字段中存放浮點(diǎn)數(shù),或者在字符型字段中存放日期型值。但有一種情況例外:定義為INTEGER
PRIMARY
KEY的字段只能存儲64位整數(shù),當(dāng)向這種
字段中保存除整數(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可以解析大部分標(biāo)準(zhǔn)SQL語句,如:查詢語句:select
*
from表名
where條件子句
group
by分組字句
having...order
by排序子句如:select
*
from
personselect
*
from
person
order
by
id
descselectname
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條件子句。如:updatepersonsetname=‘傳智‘whereid=10刪除語句:delete
from表名
where條件子句。如:delete
from
person
where
id=10—高級軟件人才實(shí)作培訓(xùn)專家!北京傳智播客教育使用SQLiteDatabase操作SQLite數(shù)據(jù)庫Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作數(shù)據(jù)庫的API,使用該類可以完成對數(shù)
據(jù)進(jìn)行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)。對
SQLiteDatabase的學(xué)習(xí),我們應(yīng)該重點(diǎn)掌握execSQL()和rawQuery()方法。execSQL()方法可以執(zhí)行insert、delete、update和CREATE
TABLE之類有更改行為的SQL語句;rawQuery()方法可以執(zhí)行select語句。execSQL()方法的使用例子:
SQLiteDatabase
db=....;db.execSQL("insert
into
person(name,
age)
values("傳智播客",4)");db.close();執(zhí)行上面SQL語句會往person表中添加進(jìn)一條記錄,在實(shí)際應(yīng)用中,語句中的“傳智播客”這些參數(shù)值應(yīng)該由用戶輸入界面提供,如果把用戶輸入的內(nèi)容原樣組拼到上面的insert語句,當(dāng)用戶輸入的內(nèi)容含有單引號時,組拼出來的SQL語句就會存在語法錯誤。要解決這個問題需要對單引號進(jìn)行轉(zhuǎn)義,也就是把單引號轉(zhuǎn)換成兩個單引號。有些時候用戶往往還會輸入像“&”這些特殊SQL符號,為保證組拼好的SQL語句語法正確,必須對SQL語句中的這些特殊SQL符號都進(jìn)行轉(zhuǎn)義,顯然,對每條SQL語句都做這樣的處理工作是比較煩瑣的。SQLiteDatabase類提供了一個重載后的execSQL(String
sql,
Object[]
bindArgs)方法,使用這個方法可以解決前面提到的問題,因?yàn)檫@個方法支持使用占位符參數(shù)(?)。使用例子如下:SQLiteDatabase
db
=
....;db.execSQL("insert
into
person(name,
age)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廠內(nèi)電力維修合同模板
- 北京公司注銷合同范例
- 債款回購合同范例
- 2024年國際 container 物流運(yùn)輸合同
- 2024年度網(wǎng)絡(luò)安全監(jiān)控防護(hù)服務(wù)合同
- 企業(yè)轉(zhuǎn)移員工勞動合同模板
- 伙合合同范例
- 二手空調(diào)租賃合同范例
- 書店生意轉(zhuǎn)讓合同模板
- 住建部公租房建設(shè)合同范例
- 生活中的工業(yè)設(shè)計智慧樹知到期末考試答案章節(jié)答案2024年南開大學(xué)
- 化妝品生產(chǎn)工藝驗(yàn)證報告范文模板-新規(guī)要求工藝參數(shù)及關(guān)鍵控制點(diǎn)驗(yàn)證
- AutoCAD 2018基礎(chǔ)教程綜合實(shí)例
- 服務(wù)類驗(yàn)收單
- 城市管理大數(shù)據(jù)平臺 第2部分:數(shù)據(jù)分級分類
- 工程施工合同履約課件
- 《整式的加減》第1課時 教學(xué)設(shè)計
- 醫(yī)院科研工作計劃及實(shí)施方案
- 橋梁結(jié)構(gòu)健康監(jiān)測系統(tǒng)實(shí)施和驗(yàn)收規(guī)范
- 2024安徽交控集團(tuán)所屬企業(yè)校園招聘筆試參考題庫附帶答案詳解
- 退休項(xiàng)目經(jīng)理返聘合同-工程管理
評論
0/150
提交評論