




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于Android教務(wù)信息管理系統(tǒng)摘要:針對(duì)現(xiàn)在高校教務(wù)信息系統(tǒng)不足,提出一個(gè)基于Android教務(wù)信息查詢(xún)管理系統(tǒng),它不僅能夠幫助師生查詢(xún)常見(jiàn)信息,同時(shí)系統(tǒng)也提供學(xué)生選課、上課提醒等實(shí)用輔助功效,為本校大學(xué)生使用教務(wù)系統(tǒng)提供便利。該系統(tǒng)充足利用Android平臺(tái)功效特點(diǎn),采取Http請(qǐng)求方法完美實(shí)現(xiàn)手機(jī)端和服務(wù)器數(shù)據(jù)通信,利用jsoup和sax等方法進(jìn)行數(shù)據(jù)解析處理,同時(shí)也對(duì)界面進(jìn)行精心設(shè)計(jì),增強(qiáng)用戶體驗(yàn)。關(guān)鍵詞:Android;教務(wù)信息管理系統(tǒng);手機(jī)用戶端;UIAcademicInformationManagementSystembasedonAndroidAbstract:Forlessthanthecurrentuniversityeducationalinformationsystems,theSenateproposedaAndroid-basedinformationsystem,whichcanbeusednotonlytohelpstudentsandteachersqueryinformation,andthesystemalsoprovidesstudentenrollment,schoolremindersandotherusefulauxiliaryfunctions,deanoftheUniversityStudents'useThesystemprovidesconvenience.ThesystemfeaturesfulladvantageoftheAndroidplatform,usingHttprequestmethodtoachievetheperfectmobileclientandserverdatacommunicationusingjsoupandsaxandothermethodsofdataanalysisprocessing,butalsoontheinterfacecarefullydesignedtoenhancetheuserexperience.Keywords:Android;AcademicInformationManagementSystem;Mobileclient;UI;目錄第一章緒論 11.1課題背景 11.2安卓平臺(tái)介紹 11.2.1安卓平臺(tái)特色介紹 21.2.2安卓系統(tǒng)編程語(yǔ)言 21.3安卓開(kāi)發(fā)現(xiàn)實(shí)狀況 3第二章系統(tǒng)開(kāi)發(fā)環(huán)境和相關(guān)技術(shù) 32.1系統(tǒng)開(kāi)發(fā)環(huán)境 32.2系統(tǒng)開(kāi)發(fā)軟件介紹 42.2.1Eclipse介紹 42.2.2其它軟件介紹 42.3安卓環(huán)境搭建 52.3.1軟件下載準(zhǔn)備 52.3.2JDK安裝 52.3.3AndroidSDK安裝 52.3.4ADT安裝 52.3.5創(chuàng)建AVD 62.4系統(tǒng)開(kāi)發(fā)編程語(yǔ)言介紹 6第三章系統(tǒng)需求分析及概要設(shè)計(jì) 83.1系統(tǒng)需求 83.2可行性分析 83.3系統(tǒng)概要設(shè)計(jì) 83.3.1系統(tǒng)功效模塊說(shuō)明 83.3.2系統(tǒng)功效結(jié)構(gòu)圖 9第四章系統(tǒng)具體設(shè)計(jì) 104.1登錄功效和實(shí)現(xiàn) 104.1.1登錄界面 104.1.2登錄按鈕監(jiān)聽(tīng)器 124.1.3新開(kāi)線程 124.1.4提交驗(yàn)證信息 134.1.5Activity響應(yīng)判定 134.2程序主頁(yè)面實(shí)現(xiàn) 144.2.1主界面頭部菜單欄 144.2.2頁(yè)面跳轉(zhuǎn) 154.2.3經(jīng)過(guò)WebView顯示信息 184.3選課功效實(shí)現(xiàn) 194.3.1頁(yè)面設(shè)計(jì) 204.3.2開(kāi)辟新線程 214.3.3用handler更新UI 224.3.4用戶點(diǎn)擊事件 224.4公共類(lèi) 234.4.1XML文件解析 234.4.2下載服務(wù)器返回?cái)?shù)據(jù) 254.4.3保留用戶狀態(tài) 254.4.4HTML文件解析 27第五章總結(jié) 29參考文件 31第一章緒論1.1課題背景當(dāng)今社會(huì)是信息社會(huì),大家不管何時(shí)、不管何地全部是在和信息打交道,您閱讀報(bào)紙是信息、看到廣告是信息、電視傳輸是信息、上網(wǎng)瀏覽是信息,現(xiàn)代人簡(jiǎn)直生活在“信息海洋”中。這么多信息哪些是有用,哪些是無(wú)用,大家在信息豐富社會(huì)中,難免會(huì)忘記部分關(guān)鍵信息,有時(shí)會(huì)掉一個(gè)尋呼機(jī),有時(shí)會(huì)掉一個(gè)電話本或筆記本什么,這些“信息載體”可能包含著關(guān)鍵個(gè)人信息。怎樣將這些有用信息存放起來(lái)避免忘記或丟失,怎樣對(duì)這些有用信息進(jìn)行有序地組織、管理以資對(duì)生活決議提供幫助,這正是信息管理軟件要處理問(wèn)題。進(jìn)入二十一世紀(jì)以來(lái),無(wú)所不在計(jì)算將打破傳統(tǒng)意義上計(jì)算機(jī)概念:使用更方便、移動(dòng)更輕易、功效更多樣化多種含有計(jì)算機(jī)功效設(shè)備大量出現(xiàn),而且在需要時(shí),能夠隨時(shí)經(jīng)過(guò)無(wú)線方法連接到移動(dòng)數(shù)據(jù)通信網(wǎng)絡(luò)中,方便高效地交換信息和取得多種服務(wù)。這種設(shè)備大家稱(chēng)之為無(wú)線設(shè)備。移動(dòng)設(shè)備最根本特征是移動(dòng)性,即能夠利用無(wú)線電波、微波或紅外線等傳輸介質(zhì)許可通信中設(shè)備在一定范圍內(nèi)自由移動(dòng),其位置不受束縛,從而實(shí)現(xiàn)通信雙方最少有一方在移動(dòng)中進(jìn)行信息傳輸和交換目標(biāo)。移動(dòng)設(shè)備從產(chǎn)生到現(xiàn)在歷史并不長(zhǎng),然而其發(fā)展速度卻遠(yuǎn)遠(yuǎn)超出大家預(yù)料?,F(xiàn)現(xiàn)在,移動(dòng)設(shè)備大行其道,全球有超出十億部移動(dòng)電話正在被使用,而且這個(gè)數(shù)目正在逐步增加。在除美國(guó)之外每個(gè)發(fā)達(dá)國(guó)家,擁有手機(jī)人數(shù)比擁有計(jì)算機(jī)人數(shù)更多。而現(xiàn)在,伴隨移動(dòng)設(shè)備越來(lái)越普及及移動(dòng)硬件提升,移動(dòng)設(shè)備功效越來(lái)越完善,移動(dòng)設(shè)備系統(tǒng)平臺(tái)也日漸火熱起來(lái)。現(xiàn)在中國(guó)最常見(jiàn)移動(dòng)開(kāi)發(fā)平臺(tái)有Symbian,iPhone,WindowsPhone和Android。現(xiàn)在中國(guó)外全部有很多Android系統(tǒng)用戶。自從第一季度,Android在全球份額首次超出Symbian,躍居全球第一。截止2月?lián)珹ndroid占據(jù)全球智能手機(jī)操作系統(tǒng)市場(chǎng)52.5%份額,中國(guó)市場(chǎng)擁有率為68.4%。[1]考慮到現(xiàn)在手機(jī)系統(tǒng)發(fā)展現(xiàn)實(shí)狀況,和Android平臺(tái)系統(tǒng)本身所擁有優(yōu)勢(shì)。所以,基于安卓平臺(tái)開(kāi)發(fā)一款手機(jī)應(yīng)用軟件含有較大意義和可行性。1.2安卓平臺(tái)介紹Android一詞本義指“機(jī)器人”,同時(shí)也是谷歌于11月5日宣告基于Linux平臺(tái)開(kāi)源手機(jī)操作系統(tǒng)名稱(chēng),該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,號(hào)稱(chēng)是首個(gè)為移動(dòng)終端打造真正開(kāi)放和完整移動(dòng)軟件?,F(xiàn)在,最新版本為Android4.0IceCreamSandwich(冰激凌三明治)和還在測(cè)試中Android5.0JellyBean(果凍豆)。1.2.1安卓平臺(tái)特色介紹1.開(kāi)放性在優(yōu)勢(shì)方面,Android平臺(tái)首先就是其開(kāi)放性,開(kāi)放平臺(tái)許可任何移動(dòng)終端廠商加入到Android聯(lián)盟中來(lái)。顯著開(kāi)放性能夠使其擁有更多開(kāi)發(fā)者,伴隨用戶和應(yīng)用日益豐富,一個(gè)嶄新平臺(tái)也將很快走向成熟。開(kāi)發(fā)性對(duì)于Android發(fā)展而言,有利于積累人氣,這里人氣包含消費(fèi)者和廠商,而對(duì)于消費(fèi)者來(lái)講,最大受益正是豐富軟件資源。開(kāi)放平臺(tái)也會(huì)帶來(lái)更大競(jìng)爭(zhēng),如此一來(lái),消費(fèi)者將能夠用更低價(jià)位購(gòu)得心儀手機(jī)。2.擺脫運(yùn)行商束縛在過(guò)去很長(zhǎng)一段時(shí)間,尤其是在歐美地域,手機(jī)應(yīng)用往往受到運(yùn)行商制約,使用什么功效接入什么網(wǎng)絡(luò),幾乎全部受到運(yùn)行商控制。自從iPhone上市,用戶能夠愈加方便地連接網(wǎng)絡(luò),運(yùn)行商制約降低。伴隨EDGE、HSDPA這些2G至3G移動(dòng)網(wǎng)絡(luò)逐步過(guò)渡和提升,手機(jī)隨意接入網(wǎng)絡(luò)已不是運(yùn)行商口中笑談。3.豐富硬件選擇這一點(diǎn)還是和Android平臺(tái)開(kāi)放性相關(guān),因?yàn)锳ndroid開(kāi)放性,眾多廠商會(huì)推出千奇百怪,功效特色各具多個(gè)產(chǎn)品。功效上差異和特色,卻不會(huì)影響到數(shù)據(jù)同時(shí)、甚至軟件兼容。好比你從諾基亞Symbian風(fēng)格手機(jī)一下改用蘋(píng)果iPhone,同時(shí)還可將Symbian中優(yōu)異軟件帶到iPhone上使用、聯(lián)絡(luò)人等資料更是能夠方便地轉(zhuǎn)移。4.不受任何限制開(kāi)發(fā)商Android平臺(tái)提供給第三方開(kāi)發(fā)商一個(gè)十分寬泛、自由環(huán)境。所以不會(huì)受到多種條條框框阻擾,可想而知,會(huì)有多少新奇別致軟件會(huì)誕生。但也有其兩面性,血腥、暴力、情色方面程序和游戲怎樣控制正是留給Android難題之一。1.2.2安卓系統(tǒng)編程語(yǔ)言在Android中,開(kāi)發(fā)者能夠使用Java作為編程語(yǔ)言來(lái)開(kāi)發(fā)應(yīng)用程序,也能夠經(jīng)過(guò)NDK使用C/C++作為編程語(yǔ)言來(lái)開(kāi)發(fā)應(yīng)用程序,也可使用SL4A來(lái)使用其它多種腳本語(yǔ)言進(jìn)行編程(如:python、lua、tcl、php等等),還有其它諸如:Qt(qtforandroid)、Mono(monoforandroid)等部分著名編程框架也開(kāi)始支持Android編程,甚至經(jīng)過(guò)MonoDroid,開(kāi)發(fā)者還能夠使用C#作為編程語(yǔ)言來(lái)開(kāi)發(fā)應(yīng)用程序。另外,谷歌還在尤其公布了針對(duì)初學(xué)者AndroidSimple語(yǔ)言,該語(yǔ)言類(lèi)似Basic語(yǔ)言。而在網(wǎng)頁(yè)編程語(yǔ)言方面,JavaScript,ajax,HTML5,jquery、sencha、dojo、mobl、PhoneGap等等全部已經(jīng)支持Android開(kāi)發(fā)。在Android系統(tǒng)底層方面,Android使用C/C++作為開(kāi)發(fā)語(yǔ)言。而Android應(yīng)用層開(kāi)發(fā),基礎(chǔ)上全部是采取Java開(kāi)發(fā)。但和我們通?;ヂ?lián)網(wǎng)上應(yīng)用JAVA還是有些區(qū)分。此“JAVA”是谷歌自己做一套實(shí)現(xiàn)來(lái)實(shí)現(xiàn),和SUN底層是不太一樣。不過(guò)對(duì)開(kāi)發(fā)應(yīng)用區(qū)分不大。1.3安卓開(kāi)發(fā)現(xiàn)實(shí)狀況現(xiàn)在中國(guó)Android開(kāi)發(fā)還是關(guān)鍵以應(yīng)用開(kāi)發(fā)為主,關(guān)鍵分成3類(lèi):為企業(yè)開(kāi)發(fā)應(yīng)用、開(kāi)發(fā)通用應(yīng)用(放到AndroidMarket或其它AppMarket銷(xiāo)售)和游戲開(kāi)發(fā)(放到AndroidMarket或其它AppMarket銷(xiāo)售)。第一類(lèi)開(kāi)發(fā)者通常身處規(guī)模較大企業(yè),這些企業(yè)關(guān)鍵為自有品牌或其它品牌設(shè)計(jì)手機(jī)或平板電腦總體方案。除了依據(jù)需求對(duì)系統(tǒng)進(jìn)行定制外,更多工作在于為這些系統(tǒng)編寫(xiě)定制應(yīng)用。第二類(lèi)開(kāi)發(fā)者,通常處于創(chuàng)業(yè)型企業(yè)或是獨(dú)立開(kāi)發(fā)者,她們盈利方法關(guān)鍵是2種:為國(guó)外企業(yè)進(jìn)行外包開(kāi)發(fā),或經(jīng)過(guò)谷歌移動(dòng)廣告(AdMob)經(jīng)過(guò)廣告點(diǎn)擊分成。而理論上經(jīng)過(guò)付費(fèi)下載形式來(lái)盈利,現(xiàn)在中國(guó)鮮見(jiàn)成功者。第三類(lèi)開(kāi)發(fā)者,現(xiàn)在和第二類(lèi)開(kāi)發(fā)者類(lèi)似。下圖是開(kāi)發(fā)者提交應(yīng)用和游戲數(shù)目所占百分比圖,從中也能夠看出應(yīng)用開(kāi)發(fā)數(shù)目遠(yuǎn)超游戲開(kāi)發(fā)。圖1.1開(kāi)發(fā)者提交應(yīng)用和游戲百分比圖第二章系統(tǒng)開(kāi)發(fā)環(huán)境和相關(guān)技術(shù)2.1系統(tǒng)開(kāi)發(fā)環(huán)境Android上層應(yīng)用程序是用Java語(yǔ)言開(kāi)發(fā),同時(shí)還需要基于Dalvik虛擬機(jī),所以,谷歌企業(yè)推薦使用主流Java繼承開(kāi)發(fā)環(huán)境Eclipse。只有Eclipse還不夠,因?yàn)槭鞘褂肑ava語(yǔ)言進(jìn)行開(kāi)發(fā),還應(yīng)該有由SUN企業(yè)提供JavaSDK(其中包含JRE:JavaRuntimeEnvironment)。另外,Android應(yīng)用程序開(kāi)發(fā)和Java開(kāi)發(fā)有較大區(qū)分,所以還需要有谷歌提供AndroidSDK。同時(shí),還需要在Eclipse安裝ADT,為Android開(kāi)發(fā)提供開(kāi)發(fā)工具升級(jí)或變更,是Eclipse下開(kāi)發(fā)工具升級(jí)下載工具。簡(jiǎn)言之,需要以下軟件,才能搭建Android開(kāi)發(fā)環(huán)境,從而進(jìn)行Android應(yīng)用程序開(kāi)發(fā)。(1)Eclipse(2)JDK(3)AndroidSDK(4)ADT(AndroidDevelopmentTools)2.2系統(tǒng)開(kāi)發(fā)軟件介紹2.2.1Eclipse介紹Eclipse是一個(gè)開(kāi)放源代碼、基于Java可擴(kuò)展開(kāi)發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于經(jīng)過(guò)插件組件構(gòu)建開(kāi)發(fā)環(huán)境。幸運(yùn)是,Eclipse附帶了一個(gè)標(biāo)準(zhǔn)插件集,包含Java開(kāi)發(fā)工具(JavaDevelopmentKit,JDK)。即使大多數(shù)用戶很樂(lè)于將Eclipse看成Java集成開(kāi)發(fā)環(huán)境(IDE)來(lái)使用,但Eclipse目標(biāo)卻不僅限于此。Eclipse還包含插件開(kāi)發(fā)環(huán)境(Plug-inDevelopmentEnvironment,PDE),這個(gè)組件關(guān)鍵針對(duì)期望擴(kuò)展Eclipse軟件開(kāi)發(fā)人員,因?yàn)樗S可她們構(gòu)建和Eclipse環(huán)境無(wú)縫集成工具。因?yàn)镋clipse中每樣?xùn)|西全部是插件,對(duì)于給Eclipse提供插件,和給用戶提供一致和統(tǒng)一集成開(kāi)發(fā)環(huán)境而言,全部工具開(kāi)發(fā)人員全部含有相同發(fā)揮場(chǎng)所。這種平等和一致性并不僅限于Java開(kāi)發(fā)工具。盡管Eclipse是使用Java語(yǔ)言開(kāi)發(fā),但它用途并不限于Java語(yǔ)言;比如,支持諸如C/C++和COBOL等編程語(yǔ)言插件已經(jīng)可用,或估計(jì)將會(huì)推出。Eclipse框架還可用來(lái)作為和軟件開(kāi)發(fā)無(wú)關(guān)其它應(yīng)用程序類(lèi)型基礎(chǔ),比如內(nèi)容管理系統(tǒng)。2.2.2其它軟件介紹(1)JDKJDK(JavaDevelopmentKit)是SunMicrosystems針對(duì)Java開(kāi)發(fā)員產(chǎn)品。自從Java推出以來(lái),JDK已經(jīng)成為使用最廣泛JavaSDK。JDK是整個(gè)Java關(guān)鍵,包含了Java運(yùn)行環(huán)境,Java工具和Java基礎(chǔ)類(lèi)庫(kù)。JDK是學(xué)好Java第一步。而專(zhuān)門(mén)運(yùn)行在x86平臺(tái)Jrocket在服務(wù)端運(yùn)行效率也要比SunJDK好很多。從SUNJDK5.0開(kāi)始,提供了泛型等很實(shí)用功效,其版本也不停更新,運(yùn)行效率得到了很大提升。(2)AndroidSDKSDK:(softwaredevelopmentkit)軟件開(kāi)發(fā)工具包。被軟件開(kāi)發(fā)工程師用于為特定軟件包、軟件框架、硬件平臺(tái)、操作系統(tǒng)等建立應(yīng)用軟件開(kāi)發(fā)工具集合。所以,AndroidSDK指既是Android專(zhuān)屬軟件開(kāi)發(fā)工具包。(3)ADT(AndroidDevelopmentTools)現(xiàn)在Android開(kāi)發(fā)所用開(kāi)發(fā)工具是Eclipse,在Eclipse編譯IDE環(huán)境中,安裝ADT,為Android開(kāi)發(fā)提供開(kāi)發(fā)工具升級(jí)或變更,簡(jiǎn)單了解為在Eclipse下開(kāi)發(fā)工具升級(jí)下載工具。2.3安卓環(huán)境搭建2.3.1軟件下載準(zhǔn)備分別下載JDK、Eclipse、AndroidSDK,并首先解壓Eclipse完成安裝。2.3.2JDK安裝首先按提醒完成SDK安裝,然后設(shè)置環(huán)境變量(非必需)。1.我電腦->屬性->高級(jí)->環(huán)境變量->系統(tǒng)變量中添加以下環(huán)境變量:2.JAVA_HOME值為:E:\Android\Java\jdk1.6.0_21(我所安裝JDK目錄)3.CLASSPATH值:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin;4.Path:在開(kāi)始追加%JAVA_HOME%\bin;安裝完成以后,檢驗(yàn)JDK是否安裝成功。打開(kāi)cmd窗口,輸入java–version查看JDK版本信息。出現(xiàn)下面畫(huà)面表示安裝成功了,圖2-1:圖2-1安卓環(huán)境設(shè)置JDK效果測(cè)試圖2.3.3AndroidSDK安裝下載完成后解壓到任意路徑運(yùn)行SDKSetup.exe,點(diǎn)擊AvailablePackages。選擇期望安裝SDK及其文檔或其它包,按需點(diǎn)擊下面選項(xiàng)(開(kāi)始下載安裝所選包)在用戶變量中新建PATH值為:AndroidSDK中tools絕對(duì)路徑(本機(jī)為D:\AndroidDevelop\android-sdk-windows\tools)。完成按“確定”后,重新開(kāi)啟計(jì)算機(jī)。重啟計(jì)算機(jī)以后,進(jìn)入cmd命令窗口,檢驗(yàn)SDK是不是安裝成功。運(yùn)行android–h出現(xiàn)參數(shù)選擇,表明安裝成功。2.3.4ADT安裝打開(kāi)Eclipse,進(jìn)入菜單中"Help"->"InstallNewSoftware"點(diǎn)擊Add...按鈕,彈出對(duì)話框要求輸入Name和Location:Name自己隨便取,Location輸入。確定返回后,在workwith后下拉列表中選擇我們剛才添加ADT,點(diǎn)擊下面出現(xiàn)DeveloperTools,展開(kāi)它會(huì)有AndroidDDMS和AndroidDevelopmentTool,勾選她們,然后按步驟完成。完成以后:選擇Window>Preferences...在左邊面板選擇Android,然后在右側(cè)點(diǎn)擊Browse...并選中SDK路徑,本機(jī)為:E:\Android\android-sdk-windows點(diǎn)擊Apply。配置完成。2.3.5創(chuàng)建AVD為使Android應(yīng)用程序能夠在模擬器上運(yùn)行,必需創(chuàng)建AVD。1、在Eclipse中。選擇Windows>AndroidSDKandAVDManager2、點(diǎn)擊左側(cè)面板VirtualDevices,再右側(cè)點(diǎn)擊New3、填入Name,選擇TargetAPI,SDCard大小任意,Skin隨便選,Hardware現(xiàn)在保持默認(rèn)值4、點(diǎn)擊CreateAVD即可完成創(chuàng)建AVD綜上一切完成后安卓環(huán)境搭建完成。2.4系統(tǒng)開(kāi)發(fā)編程語(yǔ)言介紹Java是一個(gè)簡(jiǎn)單,跨平臺(tái),面向?qū)ο?,分布式,解釋?zhuān)寻踩?,結(jié)構(gòu)中立,可移植,性能很優(yōu)異多線程,動(dòng)態(tài)語(yǔ)言。Java編程語(yǔ)言風(fēng)格十分靠近C、C++語(yǔ)言。Java是一個(gè)純面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,它繼承了C++語(yǔ)言面向?qū)ο蠹夹g(shù)關(guān)鍵,Java舍棄了C++語(yǔ)言中輕易引發(fā)錯(cuò)誤指針(以引用替換)、運(yùn)算符重載(operatoroverloading)、多重繼承(以接口替換)等特征,增加了垃圾回收器功效用于回收不再被引用對(duì)象所占據(jù)內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在JavaSE1.5版本中,Java又引入了泛型編程(GenericProgramming)、類(lèi)型安全枚舉、不定長(zhǎng)參數(shù)和自動(dòng)裝/拆箱等語(yǔ)言特征。Java不一樣于通常編譯實(shí)施計(jì)算機(jī)語(yǔ)言和解釋實(shí)施計(jì)算機(jī)語(yǔ)言。它首先將源代碼編譯成二進(jìn)制字節(jié)碼(bytecode),然后依靠多種不一樣平臺(tái)上虛擬機(jī)來(lái)解釋實(shí)施字節(jié)碼,從而實(shí)現(xiàn)了“一次編譯、四處實(shí)施”跨平臺(tái)特征。不過(guò),每次編譯實(shí)施需要消耗一定時(shí)間,這同時(shí)也在一定程度上降低了Java程序運(yùn)行效率。但在J2SE1.4.2公布后,Java實(shí)施速度有了大幅提升。和傳統(tǒng)程序不一樣,Sun企業(yè)在推出Java之際就將其作為一個(gè)開(kāi)放技術(shù)。全球數(shù)以萬(wàn)計(jì)Java開(kāi)發(fā)企業(yè)被要求所設(shè)計(jì)Java軟件必需相互兼容。“Java語(yǔ)言靠群體力量而非企業(yè)力量”是Sun企業(yè)口號(hào)之一,并取得了廣大軟件開(kāi)發(fā)商認(rèn)同。這和微軟企業(yè)所提倡重視精英和封閉式模式完全不一樣。Sun企業(yè)對(duì)Java編程語(yǔ)言解釋是:Java編程語(yǔ)言是個(gè)簡(jiǎn)單、面向?qū)ο?、分布式、解釋性、健壯、安全和系統(tǒng)無(wú)關(guān)、可移植、高性能、多線程和動(dòng)態(tài)語(yǔ)言。Java平臺(tái)是基于Java語(yǔ)言平臺(tái)。。Java特點(diǎn):1.平臺(tái)無(wú)關(guān)性平臺(tái)無(wú)關(guān)性是指Java能運(yùn)行于不一樣平臺(tái)。Java引進(jìn)虛擬機(jī)原理,并運(yùn)行于虛擬機(jī),實(shí)現(xiàn)不一樣平臺(tái)Java接口之間。使用Java編寫(xiě)程序能在世界范圍內(nèi)共享。Java數(shù)據(jù)類(lèi)型和機(jī)器無(wú)關(guān),Java虛擬機(jī)(JavaVirtualMachine)是建立在硬件和操作系統(tǒng)之上,實(shí)現(xiàn)Java二進(jìn)制代碼解釋實(shí)施功效,提供于不一樣平臺(tái)接口。2.安全性Java編程類(lèi)似C++,學(xué)習(xí)過(guò)C++讀者將很快掌握J(rèn)ava精髓。Java舍棄了C++指針對(duì)存放器地址直接操作,程序運(yùn)行時(shí),內(nèi)存由操作系統(tǒng)分配,這么能夠避免病毒經(jīng)過(guò)指針侵入系統(tǒng)。Java對(duì)程序提供了安全管理器,預(yù)防程序非法訪問(wèn)。3.面向?qū)ο驤ava吸收了C++面向?qū)ο蟾拍?,將?shù)據(jù)封裝于類(lèi)中,利用類(lèi)優(yōu)點(diǎn),實(shí)現(xiàn)了程序簡(jiǎn)練性和便于維護(hù)性。類(lèi)封裝性、繼承性等相關(guān)對(duì)象特征,使程序代碼只需一次編譯,然后經(jīng)過(guò)上述特征反復(fù)利用。程序員只需把關(guān)鍵精力用在類(lèi)和接口設(shè)計(jì)和應(yīng)用上。Java提供了眾多通常對(duì)象類(lèi),經(jīng)過(guò)繼承即可使用父類(lèi)方法。在Java中,類(lèi)繼承關(guān)系是單一非多重,一個(gè)子類(lèi)只有一個(gè)父類(lèi),子類(lèi)父類(lèi)又有一個(gè)父類(lèi)。Java提供Object類(lèi)及其子類(lèi)繼承關(guān)系如同一棵倒立樹(shù)形,根類(lèi)為Object類(lèi),Object類(lèi)功效強(qiáng)大,常常會(huì)使用到它及其它派生子類(lèi)。4.分布式Java建立在擴(kuò)展TCP/IP網(wǎng)絡(luò)平臺(tái)上。庫(kù)函數(shù)提供了用HTTP和FTP協(xié)議傳送和接收信息方法。這使得程序員使用網(wǎng)絡(luò)上文件和使用本機(jī)文件一樣輕易。5.健壯性Java致力于檢驗(yàn)程序在編譯和運(yùn)行時(shí)錯(cuò)誤。類(lèi)型檢驗(yàn)幫助檢驗(yàn)出很多開(kāi)發(fā)早期出現(xiàn)錯(cuò)誤。Java自己操縱內(nèi)存降低了內(nèi)存犯錯(cuò)可能性。Java還實(shí)現(xiàn)了真數(shù)組,避免了覆蓋數(shù)據(jù)可能,這些功效特征大大提升了開(kāi)發(fā)Java應(yīng)用程序周期。而且Java還提供了Null指針檢測(cè)、數(shù)組邊界檢測(cè)、異常出口、Bytecode校驗(yàn)等功效。6.解釋型我們知道C,C++等語(yǔ)言,全部是針對(duì)CPU芯片進(jìn)行編譯,生成機(jī)器代碼,該代碼運(yùn)行就和特定CPU相關(guān)。Java不像C或C++,它不針對(duì)CPU芯片進(jìn)行編譯,而是把程序編譯成稱(chēng)為字節(jié)碼一個(gè)“中間代碼”。字節(jié)碼是很靠近機(jī)器碼文件,能夠在提供了java虛擬機(jī)(JVM)任何系統(tǒng)上被解釋實(shí)施。7.動(dòng)態(tài)JAVA程序基礎(chǔ)組成單元就是類(lèi),有些類(lèi)是自己編寫(xiě),有些是從類(lèi)庫(kù)中引入,而類(lèi)又是運(yùn)行時(shí)動(dòng)態(tài)裝載,這就使得Java能夠在分部環(huán)境中動(dòng)態(tài)維護(hù)程序及分類(lèi),而不像C++那樣,沒(méi)檔期類(lèi)庫(kù)升級(jí)以后,假如想讓程序含有新類(lèi)庫(kù)提供功效,就需要修改程序,重新編譯。第三章系統(tǒng)需求分析及概要設(shè)計(jì)3.1系統(tǒng)需求該系統(tǒng)是一個(gè)基于學(xué)校選課系統(tǒng)針對(duì)學(xué)生手機(jī)用戶端。它是為本軟件持有者提供對(duì)選課系統(tǒng)部分功效進(jìn)行基礎(chǔ)操作。它包含成績(jī)查詢(xún),課表查詢(xún),本學(xué)期所選課程查詢(xún),學(xué)籍查詢(xún),考試信息查詢(xún),修改密碼,選課等操作。本軟件為在校學(xué)生方便快捷使用學(xué)校選課系統(tǒng)提供一個(gè)路徑。3.2可行性分析經(jīng)過(guò)對(duì)學(xué)校選課系統(tǒng)整體研究分析,本學(xué)校選課系統(tǒng)不提供對(duì)外接口,所以不能獨(dú)立存在,只能依附于選課系統(tǒng)jsp頁(yè)面。經(jīng)過(guò)對(duì)選課系統(tǒng)http請(qǐng)求處理研究發(fā)覺(jué),只要提供正確參數(shù),系統(tǒng)后臺(tái)servlet會(huì)返回對(duì)應(yīng)Xml或Html頁(yè)面。經(jīng)過(guò)對(duì)返回?cái)?shù)據(jù)處理,基礎(chǔ)能夠?qū)崿F(xiàn)上述功效。3.3系統(tǒng)概要設(shè)計(jì)3.3.1系統(tǒng)功效模塊說(shuō)明(1)登錄模塊:作為系統(tǒng)開(kāi)啟后第一個(gè)界面,其中包含用戶名密碼輸入(其中用戶名為學(xué)生學(xué)號(hào))。登錄成功后自動(dòng)保留用戶名和密碼,有利于提升用戶體驗(yàn)。最終提供服務(wù)器驗(yàn)證信息返回提醒,假如驗(yàn)證經(jīng)過(guò)提醒后跳轉(zhuǎn)頁(yè)面,假如失敗則提醒重新登錄。(2)系統(tǒng)主界面:用戶登錄后跳轉(zhuǎn)到此界面,該界面用標(biāo)簽方法同時(shí)加載3個(gè)頁(yè)面在手機(jī),用戶可經(jīng)過(guò)下方按鈕選擇目前需要界面,提升手機(jī)屏幕所顯示信息量,于軟件運(yùn)行速度。(3)數(shù)據(jù)解析模塊:用于處理服務(wù)器返回?cái)?shù)據(jù)。(4)數(shù)據(jù)下載模塊:利用HTTP請(qǐng)求接收返回?cái)?shù)據(jù)3.3.2系統(tǒng)功效結(jié)構(gòu)圖在程序設(shè)計(jì)分析基礎(chǔ)上,結(jié)合實(shí)際情況,得出本程序功效模塊結(jié)構(gòu)圖。在結(jié)構(gòu)圖中包含了功效模塊表示及其中部分功效實(shí)現(xiàn)原理。1、總體設(shè)計(jì)選課系統(tǒng)課表查詢(xún)課程查詢(xún)成績(jī)查詢(xún)選課系統(tǒng)課表查詢(xún)課程查詢(xún)成績(jī)查詢(xún)學(xué)籍查詢(xún)選課修改密碼圖3.1整體功效示意2、系統(tǒng)步驟圖跟據(jù)需求,程序步驟以下:用戶登錄后加載主框架,經(jīng)過(guò)框架加載常見(jiàn)查詢(xún)頁(yè)面和服務(wù)器授權(quán)才能使用查詢(xún)頁(yè)面,如選課,選課查詢(xún),考試查詢(xún)等。整體步驟圖3-2.。學(xué)生選課系統(tǒng)學(xué)生選課系統(tǒng)登錄主界面常見(jiàn)查詢(xún)授權(quán)查詢(xún)相關(guān)/退出課表查詢(xún)課程查詢(xún)成績(jī)查詢(xún)學(xué)籍信息修改密碼選課考試信息查詢(xún)圖3.2軟件步驟3、登錄模塊設(shè)計(jì)學(xué)生選課系統(tǒng)登錄生成URL判定登錄狀態(tài)學(xué)生選課系統(tǒng)登錄生成URL判定登錄狀態(tài)HttpDownloader返回XML驗(yàn)證數(shù)據(jù)解析XML數(shù)據(jù)返回驗(yàn)證數(shù)據(jù)UI線程新開(kāi)線程登錄成功并跳轉(zhuǎn)01圖3-3登錄數(shù)據(jù)步驟第四章系統(tǒng)具體設(shè)計(jì)4.1登錄功效和實(shí)現(xiàn)4.1.1登錄界面本界面采取線性布局LinearLayout將標(biāo)簽,文本框,按鈕,選項(xiàng)框組織排列。值得注意是這里用戶名輸入框使用了AutoCompleteTextView控件而不是一般EditText,這么做是為了使程序能夠使用保留下用戶名密碼,而且在開(kāi)始輸入時(shí)能夠提醒用戶。這么做能夠降低用戶反復(fù)輸入,有助提升軟件可操作性。首先建立好Android工程,在工程下res/layout下建立一個(gè)名為L(zhǎng)ogin空xml文件。然后根據(jù)設(shè)計(jì)將布局完成。結(jié)果以下圖4-1所表示。圖4-1登錄界面然后在工程src目錄下所對(duì)應(yīng)Activity中創(chuàng)建控件,并用findViewById()方法得到所創(chuàng)建控件ID并轉(zhuǎn)換成對(duì)應(yīng)控件,實(shí)現(xiàn)代碼以下:cardNumAuto=(AutoCompleteTextView)findViewById(R.id.cardNumAuto);passwordET=(EditText)findViewById(R.id.passwordET);logBT=(Button)findViewById(R.id.logBT);sp=this.getSharedPreferences("passwordFile",MODE_PRIVATE);savePasswordCB=(CheckBox)findViewById(R.id.savePasswordCB);savePasswordCB.setChecked(true);cardNumAuto.setThreshold(1);passwordET.setInputType(InputType.TYPE_CLASS_TEXT |InputType.TYPE_TEXT_VARIATION_PASSWORD);其中savePassword為多選框,只有這個(gè)值為true時(shí)才會(huì)保留密碼。當(dāng)用戶登錄過(guò)以后,下次登錄會(huì)在輸入第一個(gè)字符時(shí)開(kāi)始提醒用戶。用戶名密碼保留使用SharedPreferences,Android自帶微型數(shù)據(jù)存放類(lèi),SharedPreferences保留數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/<packagename>/shared_prefs目錄下。其中數(shù)據(jù)數(shù)據(jù)適配器實(shí)現(xiàn)代碼以下:newTextWatcher(){publicvoidonTextChanged(CharSequences,intstart,intbefore, intcount){ String[]allUserName=newString[sp.getAll().size()]; allUserName=sp.getAll().keySet().toArray(newString[0]); ArrayAdapter<String>adapter=newArrayAdapter<String>( Login_Activity.this, android.R.layout.simple_dropdown_item_1line, allUserName); cardNumAuto.setAdapter(adapter);}publicvoidbeforeTextChanged(CharSequences,intstart,intcount, intafter){}publicvoidafterTextChanged(Editables){ passwordET.setText(sp.getString(cardNumAuto.getText().toString(),"")); }}4.1.2登錄按鈕監(jiān)聽(tīng)器當(dāng)用戶名密碼輸入完成點(diǎn)擊登錄將會(huì)實(shí)施登錄操作,所以,必需給登錄按鈕添加監(jiān)聽(tīng)器,用來(lái)監(jiān)聽(tīng)點(diǎn)擊事件。具體步驟為,得到用戶輸入用戶名和密碼,并新開(kāi)線程。并在用提醒框通知用戶現(xiàn)在正在驗(yàn)證用戶信息。具體實(shí)現(xiàn)代碼以下:logBT.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ cardNumStr=cardNumAuto.getText().toString(); passwordStr=passwordET.getText().toString(); mDialog=newProgressDialog(Login_Activity.this); mDialog.setIcon(DEFAULT_KEYS_DISABLE); mDialog.setTitle("登陸"); mDialog.setMessage("正在登陸服務(wù)器,請(qǐng)稍后..."); mDialog.show(); ThreadloginThread=newThread(newLoginThread()); loginThread.start();}});}4.1.3新開(kāi)線程監(jiān)聽(tīng)器綁定以后,在用戶點(diǎn)擊登錄按鈕時(shí)將會(huì)新開(kāi)一個(gè)線程,全部驗(yàn)證中操作全部在新線程中實(shí)施。新開(kāi)線程關(guān)鍵用于發(fā)送http請(qǐng)求并接收驗(yàn)證信息,以后通知頁(yè)面顯示登錄結(jié)果實(shí)現(xiàn)代碼以下所表示:classLoginThreadimplementsRunnable{ publicvoidrun(){ Stringusername=cardNumAuto.getText().toString(); Stringpassword=passwordET.getText().toString(); ArrayList<String>userStr=loginServer(username,password); Messagemsg=handler.obtainMessage(); if(!(userStr.get(0).equals("0"))){ msg.what=1; handler.sendMessage(msg); }else{ if(savePasswordCB.isChecked()){//登陸成功才保留密碼 sp.edit().putString(cardNumStr,passwordStr).commit();} msg.what=0; handler.sendMessage(msg);}}}新開(kāi)線程又包含幾項(xiàng)對(duì)數(shù)據(jù)處理工作,和對(duì)返回處理結(jié)果,并對(duì)目前頁(yè)面部分操作。4.1.4提交驗(yàn)證信息handler為接收返回驗(yàn)證信息并在界面顯示登錄結(jié)果,鑒于本學(xué)校服務(wù)器返回驗(yàn)證信息為一XML文件,解析后用泛型ArrayList存放,其中第一條為用戶名密碼驗(yàn)證信息,返回1為驗(yàn)證不經(jīng)過(guò),返回0為經(jīng)過(guò),并附加部分用戶基礎(chǔ)數(shù)據(jù)作為以后操作參數(shù)。其中http請(qǐng)求URL和數(shù)據(jù)處理實(shí)現(xiàn)代碼以下:privateArrayList<String>loginServer(Stringusername,Stringpassword){ ArrayList<String>userStr=null; StringuserName=username; StringpassWord=password; Stringpath=":8080/webdu/loginservlet?action=1&ucode="+userName+"&upwd="+passWord+"&utype=S"; path=path.replaceAll("\\s*",""); HttpDownloaderhttpdownloader=newHttpDownloader(); Stringjson=newString(httpdownloader.download(path));try{userStr=Method.xmlParse(json); }catch(Exceptione){}returnuserStr;}因?yàn)樵贏ndroid中,在輸入完成后自動(dòng)添加上一個(gè)空格,但http請(qǐng)求URL中,服務(wù)器接收時(shí)沒(méi)有控制,所以在這里得對(duì)生成URL進(jìn)行處理,path=path.replaceAll("\\s*","")為去掉字符串中全部空格。該方法返回一個(gè)ArrayList,這個(gè)ArrayList是可變長(zhǎng)數(shù)組,為方便返回?cái)?shù)據(jù)可操作性。4.1.5Activity響應(yīng)判定將服務(wù)器返回?cái)?shù)據(jù)解析后,我們就知道了這次登錄操作中到底有沒(méi)有經(jīng)過(guò)服務(wù)器驗(yàn)證,不過(guò)在新線程中下載解析后數(shù)據(jù)我們無(wú)法直接在Activity中使用。所以目前Activity必需在新線程實(shí)施結(jié)束前處于等候狀態(tài),而且隨時(shí)準(zhǔn)備響應(yīng)。新開(kāi)線程和Activity不處于同一線程,不能直接對(duì)Activity進(jìn)行操作。所以這里必需有一個(gè)Handler來(lái)接收新線程發(fā)送數(shù)據(jù),并用此數(shù)據(jù)配合根本程更新Activity。前面新開(kāi)線程中,我們判定了服務(wù)器返回值是否為0,并為一個(gè)狀態(tài)量設(shè)置了值,這個(gè)值就是Handler所接收值。經(jīng)過(guò)新線程值來(lái)控制UI更新,實(shí)現(xiàn)代碼以下:Handlerhandler=newHandler(){ publicvoidhandleMessage(Messagemsg) {switch(msg.what){ case0: mDialog.cancel(); Toast.makeText(getApplicationContext(),"登錄成功", Toast.LENGTH_SHORT).show(); Intentintent=newIntent(); intent.setClass(Login_Activity.this,Main_Bootom_Tab.class); startActivity(intent); finish(); break; case1: mDialog.cancel(); Toast.makeText(getApplicationContext(),"賬戶或密碼錯(cuò)誤", Toast.LENGTH_SHORT).show(); break;} }};這是一個(gè)內(nèi)部類(lèi),寫(xiě)在在Activity中。假如新線程返回msg.what=0則關(guān)閉Activity中對(duì)話框,并提醒登錄成功,然后跳轉(zhuǎn)到程序主頁(yè)面,并將登錄頁(yè)面銷(xiāo)毀。假如不為0則提醒用戶賬戶或密碼錯(cuò)誤。4.2程序主頁(yè)面實(shí)現(xiàn)4.2.1主界面頭部菜單欄用戶登錄經(jīng)過(guò)服務(wù)器驗(yàn)證后界面將跳轉(zhuǎn)到Main_bootom_Tab頁(yè)面,此頁(yè)面知識(shí)一個(gè)框架,經(jīng)過(guò)這個(gè)Activity能夠同時(shí)加載多個(gè)頁(yè)面,增加屏幕可顯示信息量。在頁(yè)面底部放置一個(gè)菜單欄,用戶能夠經(jīng)過(guò)點(diǎn)擊此菜單欄來(lái)實(shí)現(xiàn)頁(yè)面之間切換。制作這個(gè)頭部菜單欄是為了提升軟件可操作性,用是TabHost+RadioGroup相結(jié)合方法來(lái)制作這個(gè)部分。菜單欄底部位置是經(jīng)過(guò)TabHost這個(gè)布局來(lái)實(shí)現(xiàn),然后是LinearLayout線性布局來(lái)部署內(nèi)容。內(nèi)部選項(xiàng)卡是經(jīng)過(guò)TabWiget來(lái)實(shí)現(xiàn)在工程下res/layout下建立一個(gè)名為main空xml文件,然后在這個(gè)文件里根據(jù)思緒來(lái)添加布局代碼。主界面菜單選項(xiàng)使用RadioGroup來(lái)建立,在這里布局中RadioGroup里容納4個(gè)RadioButton,而RadioButton是單選按鈕。在這種情況下就只有也只能有一個(gè)RadioButton能被選擇,而且在開(kāi)始時(shí)默認(rèn)了第一個(gè)按鈕被選中。其中RadioButton實(shí)現(xiàn)方法是在設(shè)置了內(nèi)部文字,然后再按鈕頂部上添加上圖片,實(shí)現(xiàn)代碼以下:<RadioButton android:text="@string/main_date" android:drawableTop="@drawable/tab_date" android:id="@+id/radio_button0" android:checked="true" style="@style/main_tab_bottom"/>從上述代碼能夠看到,在菜單每個(gè)選項(xiàng)卡樣式全部是調(diào)用了style上main_tab_bottom來(lái)實(shí)現(xiàn)樣式,而main_tab_bottom背景background值是@drawable/btn_bg,btn_bg不是一個(gè)簡(jiǎn)單背景圖片,而是一個(gè)xml文件,經(jīng)過(guò)這個(gè)文件能夠?qū)崿F(xiàn)菜單選項(xiàng)卡切換時(shí)背景切換效果,使得這個(gè)菜單欄愈加美觀,代碼是使用了安卓selector來(lái)實(shí)現(xiàn),在這里是經(jīng)過(guò)不停條件來(lái)判定使用哪一個(gè)item,里面包含了多個(gè)屬性值,如是否取得焦點(diǎn)、是否響應(yīng)事件、是否點(diǎn)擊三個(gè)條件。實(shí)施代碼以下:<selectorxmlns:android=""><itemandroid:state_focused="true"android:state_enabled="true"android:state_pressed="false"android:drawable="@drawable/btn_bg_s"/><itemandroid:state_enabled="true"android:state_pressed="true"android:drawable="@drawable/btn_bg_s"/><itemandroid:state_enabled="true"android:state_checked="true"android:drawable="@drawable/btn_bg_d"/></selector>制訂完主頁(yè)面布局后,在src/com.manage.activity下MainPage文件中OnCreate(OnCreate方法是用來(lái)初始化Activity實(shí)例對(duì)象)中調(diào)用布局,到現(xiàn)在為止頂部菜單欄布局已經(jīng)基礎(chǔ)完成,但現(xiàn)在里面所對(duì)應(yīng)內(nèi)容還是空。所以就需要在這里給tabHost中添加tab內(nèi)容,以第一格tab為例,先是經(jīng)過(guò)Intent方法新建個(gè)mDate,用來(lái)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)方法,然后動(dòng)態(tài)用tabHost來(lái)經(jīng)過(guò)addTab方法添加對(duì)應(yīng)TabSpec值和各個(gè)屬性。最終在添加RadioGroup選擇操作函數(shù),這里是經(jīng)過(guò)switch來(lái)完成對(duì)應(yīng)按鈕功效實(shí)現(xiàn),在每個(gè)case項(xiàng)中經(jīng)過(guò)tabHost.setCurrentTabByTag來(lái)給和特定值實(shí)現(xiàn)頁(yè)面上跳轉(zhuǎn)。最終效果圖4-1:圖4-2主頁(yè)界面頭部菜單4.2.2頁(yè)面跳轉(zhuǎn)在Main_bootom_Tab中添加兩個(gè)頁(yè)面,里面添加系統(tǒng)功效選項(xiàng)。第一個(gè)為MainActivity,第二個(gè)為ChoiseCourse。實(shí)現(xiàn)效果以下圖所表示:圖4-3系統(tǒng)主界面其中每一個(gè)選項(xiàng)是一個(gè)自定義RelativeLayout,定義樣式為:<RelativeLayout android:id="@+id/course" android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dip"android:gravity="center_vertical"android:clickable="true"> <ImageView android:id="@+id/add_friend_shake" android:layout_marginLeft="10dip" android:layout_width="40dip" android:layout_height="40dip" android:layout_margin="4dip" android:src="@drawable/tqyb"/><TextViewandroid:id="@+id/miaoshuzbcs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/add_friend_shake" android:layout_marginLeft="10dip" android:layout_marginTop="4dip" android:textColor="#068FFF" android:textSize="14sp" android:text="已選課程"/> <TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_toRightOf="@id/add_friend_shake" android:layout_below="@id/miaoshuzbcs" android:layout_marginLeft="10dip" android:textColor="#666666" android:textSize="8sp" android:padding="2dip" android:text="(查詢(xún)當(dāng)學(xué)期所選課程具體信息)"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:src="@drawable/mm_submenu"/> </RelativeLayout>在主類(lèi)當(dāng)中經(jīng)過(guò)results=(RelativeLayout)findViewById(R.id.results);方法直接得到一個(gè)對(duì)象,然后對(duì)象上綁定監(jiān)聽(tīng)器。results.setOnClickListener(newgotoActivity());經(jīng)過(guò)判定所點(diǎn)擊對(duì)象ID將Intent中添加標(biāo)志,最終用Intent對(duì)象開(kāi)啟新Activity,具體實(shí)現(xiàn)代碼以下:classgotoActivityimplementsOnClickListener{ publicvoidonClick(Viewv){ Intentintent=newIntent(); intent.setClass(MainActivity.this,resInformation.class); if(v.getId()==R.id.results){intent.putExtra("mark","1"); }elseif(v.getId()==R.id.course){ intent.putExtra("mark","2");} elseif(v.getId()== R.id.schedule){ intent.putExtra("mark","3");} elseif(v.getId()==R.id.status){ System.out.println("第四個(gè)頁(yè)面>waterlevenow——logn!!"); intent.putExtra("mark","4");} elseif(v.getId()==R.id.examinfi){ System.out.println("第五個(gè)頁(yè)面>waterlevenow——logn!!"); intent.putExtra("mark","5"); }else{return;} MainActivity.this.startActivity(intent); }新開(kāi)啟Activity被開(kāi)啟后,去除Intent中傳入鍵值對(duì),經(jīng)過(guò)標(biāo)志信息判定,來(lái)選擇所需要發(fā)送URL。由前期分析到,學(xué)校教務(wù)系統(tǒng)只能經(jīng)過(guò)http請(qǐng)求發(fā)送接收數(shù)據(jù),從系統(tǒng)整體結(jié)構(gòu)分析,加個(gè)連接池類(lèi)能夠增加系統(tǒng)可擴(kuò)展性和可管理性。整個(gè)連接池類(lèi)只作為字符串返回和修飾,在這里不做介紹。4.2.3經(jīng)過(guò)WebView顯示信息在Android手機(jī)中內(nèi)置了一款高性能webkit內(nèi)核瀏覽器,在SDK中封裝為一個(gè)叫做WebView組件。WebKit是MacOSXv10.3及以上版本所包含軟件框架。同時(shí),WebKit也是MacOSXSafari網(wǎng)頁(yè)瀏覽器基礎(chǔ)。WebKit是一個(gè)開(kāi)源項(xiàng)目,關(guān)鍵由KDEKHTML修改而來(lái)而且包含了部分來(lái)自蘋(píng)果企業(yè)部分組件。傳統(tǒng)上,WebKit包含一個(gè)網(wǎng)頁(yè)引擎WebCore和一個(gè)腳本引擎JavaScriptCore,它們分別對(duì)應(yīng)是KDEKHTML和KJS。不過(guò),伴隨JavaScript引擎獨(dú)立性越來(lái)越強(qiáng),現(xiàn)在WebKit和WebCore已經(jīng)基礎(chǔ)上混用不分。在這里經(jīng)過(guò)添加一個(gè)WebView來(lái)顯示服務(wù)器返回頁(yè)面,實(shí)現(xiàn)代碼以下:packagecom.keen.electivesystem;importcom.keen.electivesystem.utils.ExtractionUrl;importcom.keen.electivesystem.utils.myApplication;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.KeyEvent;importandroid.webkit.WebView;importandroid.webkit.WebViewClient;publicclassresInformationextendsActivity{ privateWebViewwebview; privatemyApplicationmyApp; @Override protectedvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); setContentView(R.layout.resinfo); Stringurl=null; myApp=(myApplication)getApplication(); ExtractionUrlfacUrl=newExtractionUrl(); Intentintent=getIntent(); Stringmark=intent.getStringExtra("mark"); intmk=Integer.parseInt(mark); switch(mk){ case1:url=facUrl.getResults(myApp.getStid());break; case2:url=facUrl.getCourse(myApp.getStid()); break; case3:url=facUrl.getSchedule(myApp.getStid(),myApp.getStuName()); break; case4:url=facUrl.getStatus(myApp.getStid(),myApp.getDpcode_g()); break; case5:url=facUrl.getExamInfi(myApp.getStid());break; case6: Stringcuid=intent.getStringExtra("cuid"); Stringtpcode=intent.getStringExtra("tpcode"); Stringstid=myApp.getStid(); Stringgrade=myApp.getDpcode_g(); Stringspid=myApp.getDpid(); Stringclid=myApp.getUserOther(); Stringfx=myApp.getFx(); url=facUrl.getCourseDetail(cuid,tpcode,stid,grade,spid,clid,fx); System.out.println(url); } webview=(WebView)findViewById(R.id.webview); //設(shè)置WebView屬性,能夠?qū)嵤㎎avascript腳本 webview.getSettings().setJavaScriptEnabled(true); //加載需要顯示網(wǎng)頁(yè) webview.loadUrl(url); //設(shè)置Web視圖 webview.setWebViewClient(newHelloWebViewClient());} @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent){if((keyCode==KeyEvent.KEYCODE_BACK)&&webview.canGoBack()){webview.goBack();//goBack()表示返回WebView上一頁(yè)面returntrue;}returnfalse;}privateclassHelloWebViewClientextendsWebViewClient{@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){view.loadUrl(url);returntrue;}}}經(jīng)過(guò)重寫(xiě)WebViewonKeyDown方法能夠處理點(diǎn)擊返回鍵時(shí)直接退出頁(yè)面。4.3選課功效實(shí)現(xiàn)選課功效因?yàn)閿?shù)據(jù)量比較多,但對(duì)于通常學(xué)生用戶而言選課只能選擇所對(duì)應(yīng)專(zhuān)業(yè)課程和通識(shí)課程,所以在這里其它專(zhuān)業(yè)課程將不做顯示。4.3.1頁(yè)面設(shè)計(jì)學(xué)生選課因?yàn)樾枰@示項(xiàng)比較多,但在手機(jī)界面顯示項(xiàng)目太多會(huì)影響用戶對(duì)其操作和體驗(yàn)。所以在這里,只顯示了老師,學(xué)分,課程名稱(chēng),和教室。整個(gè)信息關(guān)鍵使用ListView動(dòng)態(tài)加載可選課程信息。ListView所需要布局文件以下:<LinearLayoutxmlns:android=""xmlns:tools=""android:layout_width="fill_parent"android:layout_height="fill_parent" android:orientation="horizontal" android:paddingLeft="1dip" android:paddingRight="1dip"android:paddingTop="1dip" android:paddingBottom="1dip"> <LinearLayout android:id="@+id/listLinearLayouttop" android:layout_width="120dip" android:layout_height="60dip" android:orientation="vertical"> <TextViewandroid:id="@+id/coursrTracher" android:layout_width="fill_parent" android:layout_height="30dip" android:textSize="25sp" android:singleLine="true"/> <TextViewandroid:id="@+id/courseScore" android:layout_width="fill_parent" android:layout_height="30dip" android:gravity="left" android:textSize="25sp"/> </LinearLayout> <LinearLayout android:id="@+id/listLinearLayoutdown" android:layout_width="fill_parent" android:layout_height="60dip" android:orientation="vertical"> <TextViewandroid:id="@+id/coursrName" android:layout_width="fill_parent" android:layout_height="30dip" android:textSize="25sp" android:singleLine="true"/> <TextViewandroid:id="@+id/courseClassroom" android:layout_width="fill_parent" android:layout_height="30dip" android:gravity="left" android:textSize="12sp"/> </LinearLayout></LinearLayout>該布局文件定義了四個(gè)TextView作為顯示信息框架,經(jīng)過(guò)代碼動(dòng)態(tài)加載數(shù)據(jù),而且生成對(duì)象。頁(yè)面加載時(shí)因?yàn)橐獜木W(wǎng)絡(luò)上下載數(shù)據(jù),做部分耗時(shí)操作,所以在這里必需得加入一個(gè)新線程用來(lái)處理耗時(shí)操作,并提醒用戶等候。以下代碼寫(xiě)入onCreate方法中: bld=newBinderListData(); bld.setContext(this); mDialog=newProgressDialog(CourseList.this); mDialog.setMessage("正在下載數(shù)據(jù),請(qǐng)稍候..."); mDialog.show(); ThreadDownLoader=newThread(newdownThread()); DownLoader.start(); 4.3.2開(kāi)辟新線程新線程中關(guān)鍵用來(lái)做下載服務(wù)器返回?cái)?shù)據(jù),和解析返回?cái)?shù)據(jù)等操作。最終將處理完數(shù)據(jù)裝入一個(gè)HashMap中用作ListView填入數(shù)據(jù)。具體實(shí)現(xiàn)代碼以下:classdownThreadimplementsRunnable { @Override publicvoidrun(){ myApp=(myApplication)getApplication(); Stringpath=et.getChoiseCourse(myApp.getDpid(),myApp.getDpcode_g()); Stringstr=null; HttpDownloaderdownhtml=newHttpDownloader(); str=downhtml.download(path,2); AnalyticHtmlhtmla=newAnalyticHtml(); try{stinfo=htmla.getResult(str,1); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace();} for(inti=1;i<stinfo.size()-1;i++){ HashMap<String,String>map=newHashMap<String,String>(); map.put("courseTeacher","老師:"+stinfo.get(i)[3]); map.put("courseName","課名:"+stinfo.get(i)[2]); map.put("courseScore","學(xué)分:"+stinfo.get(i)[7]); map.put("courseClassroom","教室:"+stinfo.get(i)[4]); list.add(map);} Messagemsg=handler.obtainMessage(); msg.what=0; msg.obj=list; handler.sendMessage(msg);}}其myApp對(duì)象為應(yīng)用開(kāi)始運(yùn)行時(shí)自動(dòng)創(chuàng)建一個(gè)對(duì)象,通常見(jiàn)于存放全局變量,在這里用來(lái)存放用戶登錄信息。新線程被運(yùn)行后調(diào)用run()方法,先下載所需Html頁(yè)面,然后解析得到一個(gè)ArrayList對(duì)象,里面存放字符串?dāng)?shù)組,每一個(gè)數(shù)組表示一條信息。然后將這些信息有選擇裝入一個(gè)HashMap對(duì)象,以后將對(duì)象傳給Handle用來(lái)更新UI。4.3.3用handler更新UI經(jīng)過(guò)前面操作,我們得到一個(gè)HashMap對(duì)象,里面存放著要顯示到ListView中各個(gè)位置數(shù)據(jù),但因?yàn)樾麻_(kāi)線程和UI根本程不在一個(gè)線程里,所以,在新開(kāi)線程中無(wú)法對(duì)UI進(jìn)行更新操作,這里就需要引入Handler。在新線程處理完數(shù)據(jù)后通知Handler,并將處理后數(shù)據(jù)傳入。Handler接收狀態(tài)信息后,取出傳入數(shù)據(jù),更新UI,將數(shù)據(jù)一一顯示到用戶界面。實(shí)現(xiàn)代碼以下:Handlerhandler=newHandler(){ publicvoidhandleMessage(Messagemsg){ SimpleAdapterlistAdapter; switch(msg.what){ case0:list=(ArrayList<HashMap<String,String>>)msg.obj; bld.setlistData(list,layoutId,headMsg,headId); listAdapter=bld.getListAdapter(); setListAdapter(listAdapter); mDialog.cancel(); break; case1:break; }}};4.3.4用戶點(diǎn)擊事件到這里,程序已經(jīng)將ListView數(shù)據(jù)添加完成,得到頁(yè)面以下圖所表示:圖4-4可選課程到這里還不夠,我需要讓用戶點(diǎn)擊某一條就能夠顯示出該條目標(biāo)具體信息和添加課程到用戶課表。所以,這里必選先給這些ListView添加事件監(jiān)聽(tīng)。ListView控件在設(shè)計(jì)上符合這里需求,而且這里添加事件操作也比較簡(jiǎn)單,只要重寫(xiě)onListItemClick(ListViewl,Viewv,intposition,longid)方法即可。這個(gè)方法有四個(gè)參數(shù),第一個(gè)為L(zhǎng)istView本身,第二個(gè)為用戶所點(diǎn)擊View,第三個(gè)為用戶所點(diǎn)擊View位置,第四個(gè)為ViewId。經(jīng)過(guò)這多個(gè)參數(shù)就能夠確定用戶操作,而且依據(jù)操作做出響應(yīng)。在這里當(dāng)用戶點(diǎn)擊某個(gè)項(xiàng),取出這個(gè)項(xiàng)課程號(hào)和編碼,經(jīng)過(guò)Intent攜帶參數(shù)開(kāi)啟前面定義WebView,然后經(jīng)過(guò)判定生成該頁(yè)面URL然后顯示在屏幕供用戶操作。關(guān)鍵實(shí)現(xiàn)代碼以下:protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){ //TODOAuto-generatedmethodstub super.onListItemClick(l,v,position,id); String[]listInfo; listInfo=stinfo.get(position+1); Intentintent=newIntent(); intent.setClass(this,resInformation.class); intent.putExtra("mark","6"); intent.putExtra("cuid",listInfo[0]); intent.putExtra("tpcode",listInfo[1]); CourseList.this.startActivity(intent);}4.4公共類(lèi)4.4.1XML文件解析XML在多種開(kāi)發(fā)中全部廣泛應(yīng)用,Android也不例外。作為承載數(shù)據(jù)一個(gè)關(guān)鍵角色,怎樣讀寫(xiě)XML成為Android開(kāi)發(fā)中一項(xiàng)關(guān)鍵技能。在Android中,常見(jiàn)XML解析器分別為DOM解析器、SAX解析器和PULL解析器。在這里采取SAX解析器。SAX(SimpleAPIforXML)解析器是一個(gè)基于事件解析器,事件驅(qū)動(dòng)流式解析方法是,從文件開(kāi)始次序解析到文檔結(jié)束,不可暫?;虻雇恕KP(guān)鍵是事件處理模式,關(guān)鍵是圍繞著事件源和事件處理器來(lái)工作。當(dāng)事件源產(chǎn)生事件后,調(diào)用事件處理器對(duì)應(yīng)處理方法,一個(gè)事件就能夠得四處理。在事件源調(diào)用事件處理器中特定方法時(shí)候,還要傳輸給事件處理器對(duì)應(yīng)事件狀態(tài)信息,這么事件處理器才能夠依據(jù)提供事件信息來(lái)決定自己行為。SAX解析器優(yōu)點(diǎn)是解析速度快,占用內(nèi)存少。很適合在Android移動(dòng)設(shè)備中使用。所以在這里使用SAX方法解析此XML文件。經(jīng)過(guò)前面操作接下來(lái)就是解析服務(wù)器返回信息。通常返回信息格式以下:1、服務(wù)器驗(yàn)證成功返回格式:<UINF> <INF>0</INF> <INF>學(xué)生號(hào)</INF> <INF>姓名^專(zhuān)業(yè)班級(jí)^入課時(shí)間</INF> <INF>{dpid}{dpcode_grade}{userother}{FX}~學(xué)號(hào)^@權(quán)限$</INF></UINF>2、服務(wù)器驗(yàn)證失敗返回:<UINF> <INF>1</INF></UINF>登錄成功后返回?cái)?shù)據(jù)是以后使用系統(tǒng)其它功效時(shí)參數(shù),現(xiàn)在需要吧這些數(shù)據(jù)解析成單獨(dú)部分而且保留下。保留之前先得將XML文件解析成本系統(tǒng)可用數(shù)據(jù)。在這里,我用SAX方法將標(biāo)簽中數(shù)據(jù)解析成一個(gè)ArrayList可變長(zhǎng)數(shù)組形式。在登錄判定時(shí),直接判定ArrayList對(duì)象存放第0項(xiàng)數(shù)據(jù)是否為0,假如是則保留密碼和登錄狀態(tài),并跳轉(zhuǎn)頁(yè)面,不然提醒用戶輸入錯(cuò)誤,并清空輸入欄。在解析XML文件時(shí)我封裝兩個(gè)類(lèi)Method.java和ExampleHandler.java。第一個(gè)負(fù)責(zé)接收返回?cái)?shù)據(jù)并創(chuàng)建工廠模式準(zhǔn)備解析,第二個(gè)是一個(gè)專(zhuān)門(mén)以SAX方法建立一個(gè)XML文件處理器,具體實(shí)現(xiàn)代碼以下(關(guān)鍵代碼):Method.javatry{SAXPars
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西鐵道職業(yè)技術(shù)學(xué)院《激光原理與技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 成都航空職業(yè)技術(shù)學(xué)院《數(shù)據(jù)通信技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安翻譯學(xué)院《中外學(xué)前教育史》2023-2024學(xué)年第二學(xué)期期末試卷
- 武昌首義學(xué)院《完井工程》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東女子學(xué)院《設(shè)計(jì)基礎(chǔ)I》2023-2024學(xué)年第二學(xué)期期末試卷
- 新疆農(nóng)業(yè)大學(xué)《材料力學(xué)(土木工程)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新聞報(bào)道范文(9篇)
- 中山市青年旅社承包經(jīng)營(yíng)合同(28篇)
- 新高級(jí)會(huì)計(jì)師工作總結(jié)
- 研究院三季度安全生產(chǎn)培訓(xùn)
- 教育測(cè)量與評(píng)價(jià)第三版PPT完整全套教學(xué)課件
- 中小學(xué)教師教育法律法規(guī)培訓(xùn)PPT頁(yè)
- 醫(yī)療器械可用性工程文檔
- 非遺文化介紹推廣課件
- 火電機(jī)組整套啟動(dòng)前安全技術(shù)交底卡
- 菲斯特轉(zhuǎn)子秤的
- 藥學(xué)專(zhuān)業(yè)教學(xué)資源庫(kù)建設(shè)申報(bào)書(shū)
- 解讀《泰州市市區(qū)城市排水管理辦法》
- 人教版五年級(jí)下冊(cè)口算題大全(全冊(cè)齊全)
- 林則徐課件完整版
- 旅行社運(yùn)營(yíng)實(shí)務(wù)電子課件 6.1 初涉旅行社管理
評(píng)論
0/150
提交評(píng)論