基于Android教务信息综合管理系统_第1页
基于Android教务信息综合管理系统_第2页
基于Android教务信息综合管理系统_第3页
基于Android教务信息综合管理系统_第4页
基于Android教务信息综合管理系统_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Android教务信息管理系统摘要:针对现在高校教务信息系统不足,提出一个基于Android教务信息查询管理系统,它不仅能够帮助师生查询常见信息,同时系统也提供学生选课、上课提醒等实用辅助功效,为本校大学生使用教务系统提供便利。该系统充足利用Android平台功效特点,采取Http请求方法完美实现手机端和服务器数据通信,利用jsoup和sax等方法进行数据解析处理,同时也对界面进行精心设计,增强用户体验。关键词:Android;教务信息管理系统;手机用户端;UIAcademicInformationManagementSystembasedonAndroidAbstract:Forlessthanthecurrentuniversityeducationalinformationsystems,theSenateproposedaAndroid-basedinformationsystem,whichcanbeusednotonlytohelpstudentsandteachersqueryinformation,andthesystemalsoprovidesstudentenrollment,schoolremindersandotherusefulauxiliaryfunctions,deanoftheUniversityStudents'useThesystemprovidesconvenience.ThesystemfeaturesfulladvantageoftheAndroidplatform,usingHttprequestmethodtoachievetheperfectmobileclientandserverdatacommunicationusingjsoupandsaxandothermethodsofdataanalysisprocessing,butalsoontheinterfacecarefullydesignedtoenhancetheuserexperience.Keywords:Android;AcademicInformationManagementSystem;Mobileclient;UI;目录第一章绪论 11.1课题背景 11.2安卓平台介绍 11.2.1安卓平台特色介绍 21.2.2安卓系统编程语言 21.3安卓开发现实状况 3第二章系统开发环境和相关技术 32.1系统开发环境 32.2系统开发软件介绍 42.2.1Eclipse介绍 42.2.2其它软件介绍 42.3安卓环境搭建 52.3.1软件下载准备 52.3.2JDK安装 52.3.3AndroidSDK安装 52.3.4ADT安装 52.3.5创建AVD 62.4系统开发编程语言介绍 6第三章系统需求分析及概要设计 83.1系统需求 83.2可行性分析 83.3系统概要设计 83.3.1系统功效模块说明 83.3.2系统功效结构图 9第四章系统具体设计 104.1登录功效和实现 104.1.1登录界面 104.1.2登录按钮监听器 124.1.3新开线程 124.1.4提交验证信息 134.1.5Activity响应判定 134.2程序主页面实现 144.2.1主界面头部菜单栏 144.2.2页面跳转 154.2.3经过WebView显示信息 184.3选课功效实现 194.3.1页面设计 204.3.2开辟新线程 214.3.3用handler更新UI 224.3.4用户点击事件 224.4公共类 234.4.1XML文件解析 234.4.2下载服务器返回数据 254.4.3保留用户状态 254.4.4HTML文件解析 27第五章总结 29参考文件 31第一章绪论1.1课题背景当今社会是信息社会,大家不管何时、不管何地全部是在和信息打交道,您阅读报纸是信息、看到广告是信息、电视传输是信息、上网浏览是信息,现代人简直生活在“信息海洋”中。这么多信息哪些是有用,哪些是无用,大家在信息丰富社会中,难免会忘记部分关键信息,有时会掉一个寻呼机,有时会掉一个电话本或笔记本什么,这些“信息载体”可能包含着关键个人信息。怎样将这些有用信息存放起来避免忘记或丢失,怎样对这些有用信息进行有序地组织、管理以资对生活决议提供帮助,这正是信息管理软件要处理问题。进入二十一世纪以来,无所不在计算将打破传统意义上计算机概念:使用更方便、移动更轻易、功效更多样化多种含有计算机功效设备大量出现,而且在需要时,能够随时经过无线方法连接到移动数据通信网络中,方便高效地交换信息和取得多种服务。这种设备大家称之为无线设备。移动设备最根本特征是移动性,即能够利用无线电波、微波或红外线等传输介质许可通信中设备在一定范围内自由移动,其位置不受束缚,从而实现通信双方最少有一方在移动中进行信息传输和交换目标。移动设备从产生到现在历史并不长,然而其发展速度却远远超出大家预料。现现在,移动设备大行其道,全球有超出十亿部移动电话正在被使用,而且这个数目正在逐步增加。在除美国之外每个发达国家,拥有手机人数比拥有计算机人数更多。而现在,伴随移动设备越来越普及及移动硬件提升,移动设备功效越来越完善,移动设备系统平台也日渐火热起来。现在中国最常见移动开发平台有Symbian,iPhone,WindowsPhone和Android。现在中国外全部有很多Android系统用户。自从第一季度,Android在全球份额首次超出Symbian,跃居全球第一。截止2月据,Android占据全球智能手机操作系统市场52.5%份额,中国市场拥有率为68.4%。[1]考虑到现在手机系统发展现实状况,和Android平台系统本身所拥有优势。所以,基于安卓平台开发一款手机应用软件含有较大意义和可行性。1.2安卓平台介绍Android一词本义指“机器人”,同时也是谷歌于11月5日宣告基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造真正开放和完整移动软件。现在,最新版本为Android4.0IceCreamSandwich(冰激凌三明治)和还在测试中Android5.0JellyBean(果冻豆)。1.2.1安卓平台特色介绍1.开放性在优势方面,Android平台首先就是其开放性,开放平台许可任何移动终端厂商加入到Android联盟中来。显著开放性能够使其拥有更多开发者,伴随用户和应用日益丰富,一个崭新平台也将很快走向成熟。开发性对于Android发展而言,有利于积累人气,这里人气包含消费者和厂商,而对于消费者来讲,最大受益正是丰富软件资源。开放平台也会带来更大竞争,如此一来,消费者将能够用更低价位购得心仪手机。2.摆脱运行商束缚在过去很长一段时间,尤其是在欧美地域,手机应用往往受到运行商制约,使用什么功效接入什么网络,几乎全部受到运行商控制。自从iPhone上市,用户能够愈加方便地连接网络,运行商制约降低。伴随EDGE、HSDPA这些2G至3G移动网络逐步过渡和提升,手机随意接入网络已不是运行商口中笑谈。3.丰富硬件选择这一点还是和Android平台开放性相关,因为Android开放性,众多厂商会推出千奇百怪,功效特色各具多个产品。功效上差异和特色,却不会影响到数据同时、甚至软件兼容。好比你从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优异软件带到iPhone上使用、联络人等资料更是能够方便地转移。4.不受任何限制开发商Android平台提供给第三方开发商一个十分宽泛、自由环境。所以不会受到多种条条框框阻扰,可想而知,会有多少新奇别致软件会诞生。但也有其两面性,血腥、暴力、情色方面程序和游戏怎样控制正是留给Android难题之一。1.2.2安卓系统编程语言在Android中,开发者能够使用Java作为编程语言来开发应用程序,也能够经过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其它多种脚本语言进行编程(如:python、lua、tcl、php等等),还有其它诸如:Qt(qtforandroid)、Mono(monoforandroid)等部分著名编程框架也开始支持Android编程,甚至经过MonoDroid,开发者还能够使用C#作为编程语言来开发应用程序。另外,谷歌还在尤其公布了针对初学者AndroidSimple语言,该语言类似Basic语言。而在网页编程语言方面,JavaScript,ajax,HTML5,jquery、sencha、dojo、mobl、PhoneGap等等全部已经支持Android开发。在Android系统底层方面,Android使用C/C++作为开发语言。而Android应用层开发,基础上全部是采取Java开发。但和我们通常互联网上应用JAVA还是有些区分。此“JAVA”是谷歌自己做一套实现来实现,和SUN底层是不太一样。不过对开发应用区分不大。1.3安卓开发现实状况现在中国Android开发还是关键以应用开发为主,关键分成3类:为企业开发应用、开发通用应用(放到AndroidMarket或其它AppMarket销售)和游戏开发(放到AndroidMarket或其它AppMarket销售)。第一类开发者通常身处规模较大企业,这些企业关键为自有品牌或其它品牌设计手机或平板电脑总体方案。除了依据需求对系统进行定制外,更多工作在于为这些系统编写定制应用。第二类开发者,通常处于创业型企业或是独立开发者,她们盈利方法关键是2种:为国外企业进行外包开发,或经过谷歌移动广告(AdMob)经过广告点击分成。而理论上经过付费下载形式来盈利,现在中国鲜见成功者。第三类开发者,现在和第二类开发者类似。下图是开发者提交应用和游戏数目所占百分比图,从中也能够看出应用开发数目远超游戏开发。图1.1开发者提交应用和游戏百分比图第二章系统开发环境和相关技术2.1系统开发环境Android上层应用程序是用Java语言开发,同时还需要基于Dalvik虚拟机,所以,谷歌企业推荐使用主流Java继承开发环境Eclipse。只有Eclipse还不够,因为是使用Java语言进行开发,还应该有由SUN企业提供JavaSDK(其中包含JRE:JavaRuntimeEnvironment)。另外,Android应用程序开发和Java开发有较大区分,所以还需要有谷歌提供AndroidSDK。同时,还需要在Eclipse安装ADT,为Android开发提供开发工具升级或变更,是Eclipse下开发工具升级下载工具。简言之,需要以下软件,才能搭建Android开发环境,从而进行Android应用程序开发。(1)Eclipse(2)JDK(3)AndroidSDK(4)ADT(AndroidDevelopmentTools)2.2系统开发软件介绍2.2.1Eclipse介绍Eclipse是一个开放源代码、基于Java可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于经过插件组件构建开发环境。幸运是,Eclipse附带了一个标准插件集,包含Java开发工具(JavaDevelopmentKit,JDK)。即使大多数用户很乐于将Eclipse看成Java集成开发环境(IDE)来使用,但Eclipse目标却不仅限于此。Eclipse还包含插件开发环境(Plug-inDevelopmentEnvironment,PDE),这个组件关键针对期望扩展Eclipse软件开发人员,因为它许可她们构建和Eclipse环境无缝集成工具。因为Eclipse中每样东西全部是插件,对于给Eclipse提供插件,和给用户提供一致和统一集成开发环境而言,全部工具开发人员全部含有相同发挥场所。这种平等和一致性并不仅限于Java开发工具。尽管Eclipse是使用Java语言开发,但它用途并不限于Java语言;比如,支持诸如C/C++和COBOL等编程语言插件已经可用,或估计将会推出。Eclipse框架还可用来作为和软件开发无关其它应用程序类型基础,比如内容管理系统。2.2.2其它软件介绍(1)JDKJDK(JavaDevelopmentKit)是SunMicrosystems针对Java开发员产品。自从Java推出以来,JDK已经成为使用最广泛JavaSDK。JDK是整个Java关键,包含了Java运行环境,Java工具和Java基础类库。JDK是学好Java第一步。而专门运行在x86平台Jrocket在服务端运行效率也要比SunJDK好很多。从SUNJDK5.0开始,提供了泛型等很实用功效,其版本也不停更新,运行效率得到了很大提升。(2)AndroidSDKSDK:(softwaredevelopmentkit)软件开发工具包。被软件开发工程师用于为特定软件包、软件框架、硬件平台、操作系统等建立应用软件开发工具集合。所以,AndroidSDK指既是Android专属软件开发工具包。(3)ADT(AndroidDevelopmentTools)现在Android开发所用开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具升级或变更,简单了解为在Eclipse下开发工具升级下载工具。2.3安卓环境搭建2.3.1软件下载准备分别下载JDK、Eclipse、AndroidSDK,并首先解压Eclipse完成安装。2.3.2JDK安装首先按提醒完成SDK安装,然后设置环境变量(非必需)。1.我电脑->属性->高级->环境变量->系统变量中添加以下环境变量: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:在开始追加%JAVA_HOME%\bin;安装完成以后,检验JDK是否安装成功。打开cmd窗口,输入java–version查看JDK版本信息。出现下面画面表示安装成功了,图2-1:图2-1安卓环境设置JDK效果测试图2.3.3AndroidSDK安装下载完成后解压到任意路径运行SDKSetup.exe,点击AvailablePackages。选择期望安装SDK及其文档或其它包,按需点击下面选项(开始下载安装所选包)在用户变量中新建PATH值为:AndroidSDK中tools绝对路径(本机为D:\AndroidDevelop\android-sdk-windows\tools)。完成按“确定”后,重新开启计算机。重启计算机以后,进入cmd命令窗口,检验SDK是不是安装成功。运行android–h出现参数选择,表明安装成功。2.3.4ADT安装打开Eclipse,进入菜单中"Help"->"InstallNewSoftware"点击Add...按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入。确定返回后,在workwith后下拉列表中选择我们刚才添加ADT,点击下面出现DeveloperTools,展开它会有AndroidDDMS和AndroidDevelopmentTool,勾选她们,然后按步骤完成。完成以后:选择Window>Preferences...在左边面板选择Android,然后在右侧点击Browse...并选中SDK路径,本机为:E:\Android\android-sdk-windows点击Apply。配置完成。2.3.5创建AVD为使Android应用程序能够在模拟器上运行,必需创建AVD。1、在Eclipse中。选择Windows>AndroidSDKandAVDManager2、点击左侧面板VirtualDevices,再右侧点击New3、填入Name,选择TargetAPI,SDCard大小任意,Skin随便选,Hardware现在保持默认值4、点击CreateAVD即可完成创建AVD综上一切完成后安卓环境搭建完成。2.4系统开发编程语言介绍Java是一个简单,跨平台,面向对象,分布式,解释,健壮安全,结构中立,可移植,性能很优异多线程,动态语言。Java编程语言风格十分靠近C、C++语言。Java是一个纯面向对象程序设计语言,它继承了C++语言面向对象技术关键,Java舍弃了C++语言中轻易引发错误指针(以引用替换)、运算符重载(operatoroverloading)、多重继承(以接口替换)等特征,增加了垃圾回收器功效用于回收不再被引用对象所占据内存空间,使得程序员不用再为内存管理而担忧。在JavaSE1.5版本中,Java又引入了泛型编程(GenericProgramming)、类型安全枚举、不定长参数和自动装/拆箱等语言特征。Java不一样于通常编译实施计算机语言和解释实施计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依靠多种不一样平台上虚拟机来解释实施字节码,从而实现了“一次编译、四处实施”跨平台特征。不过,每次编译实施需要消耗一定时间,这同时也在一定程度上降低了Java程序运行效率。但在J2SE1.4.2公布后,Java实施速度有了大幅提升。和传统程序不一样,Sun企业在推出Java之际就将其作为一个开放技术。全球数以万计Java开发企业被要求所设计Java软件必需相互兼容。“Java语言靠群体力量而非企业力量”是Sun企业口号之一,并取得了广大软件开发商认同。这和微软企业所提倡重视精英和封闭式模式完全不一样。Sun企业对Java编程语言解释是:Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全和系统无关、可移植、高性能、多线程和动态语言。Java平台是基于Java语言平台。。Java特点:1.平台无关性平台无关性是指Java能运行于不一样平台。Java引进虚拟机原理,并运行于虚拟机,实现不一样平台Java接口之间。使用Java编写程序能在世界范围内共享。Java数据类型和机器无关,Java虚拟机(JavaVirtualMachine)是建立在硬件和操作系统之上,实现Java二进制代码解释实施功效,提供于不一样平台接口。2.安全性Java编程类似C++,学习过C++读者将很快掌握Java精髓。Java舍弃了C++指针对存放器地址直接操作,程序运行时,内存由操作系统分配,这么能够避免病毒经过指针侵入系统。Java对程序提供了安全管理器,预防程序非法访问。3.面向对象Java吸收了C++面向对象概念,将数据封装于类中,利用类优点,实现了程序简练性和便于维护性。类封装性、继承性等相关对象特征,使程序代码只需一次编译,然后经过上述特征反复利用。程序员只需把关键精力用在类和接口设计和应用上。Java提供了众多通常对象类,经过继承即可使用父类方法。在Java中,类继承关系是单一非多重,一个子类只有一个父类,子类父类又有一个父类。Java提供Object类及其子类继承关系如同一棵倒立树形,根类为Object类,Object类功效强大,常常会使用到它及其它派生子类。4.分布式Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接收信息方法。这使得程序员使用网络上文件和使用本机文件一样轻易。5.健壮性Java致力于检验程序在编译和运行时错误。类型检验帮助检验出很多开发早期出现错误。Java自己操纵内存降低了内存犯错可能性。Java还实现了真数组,避免了覆盖数据可能,这些功效特征大大提升了开发Java应用程序周期。而且Java还提供了Null指针检测、数组边界检测、异常出口、Bytecode校验等功效。6.解释型我们知道C,C++等语言,全部是针对CPU芯片进行编译,生成机器代码,该代码运行就和特定CPU相关。Java不像C或C++,它不针对CPU芯片进行编译,而是把程序编译成称为字节码一个“中间代码”。字节码是很靠近机器码文件,能够在提供了java虚拟机(JVM)任何系统上被解释实施。7.动态JAVA程序基础组成单元就是类,有些类是自己编写,有些是从类库中引入,而类又是运行时动态装载,这就使得Java能够在分部环境中动态维护程序及分类,而不像C++那样,没档期类库升级以后,假如想让程序含有新类库提供功效,就需要修改程序,重新编译。第三章系统需求分析及概要设计3.1系统需求该系统是一个基于学校选课系统针对学生手机用户端。它是为本软件持有者提供对选课系统部分功效进行基础操作。它包含成绩查询,课表查询,本学期所选课程查询,学籍查询,考试信息查询,修改密码,选课等操作。本软件为在校学生方便快捷使用学校选课系统提供一个路径。3.2可行性分析经过对学校选课系统整体研究分析,本学校选课系统不提供对外接口,所以不能独立存在,只能依附于选课系统jsp页面。经过对选课系统http请求处理研究发觉,只要提供正确参数,系统后台servlet会返回对应Xml或Html页面。经过对返回数据处理,基础能够实现上述功效。3.3系统概要设计3.3.1系统功效模块说明(1)登录模块:作为系统开启后第一个界面,其中包含用户名密码输入(其中用户名为学生学号)。登录成功后自动保留用户名和密码,有利于提升用户体验。最终提供服务器验证信息返回提醒,假如验证经过提醒后跳转页面,假如失败则提醒重新登录。(2)系统主界面:用户登录后跳转到此界面,该界面用标签方法同时加载3个页面在手机,用户可经过下方按钮选择目前需要界面,提升手机屏幕所显示信息量,于软件运行速度。(3)数据解析模块:用于处理服务器返回数据。(4)数据下载模块:利用HTTP请求接收返回数据3.3.2系统功效结构图在程序设计分析基础上,结合实际情况,得出本程序功效模块结构图。在结构图中包含了功效模块表示及其中部分功效实现原理。1、总体设计选课系统课表查询课程查询成绩查询选课系统课表查询课程查询成绩查询学籍查询选课修改密码图3.1整体功效示意2、系统步骤图跟据需求,程序步骤以下:用户登录后加载主框架,经过框架加载常见查询页面和服务器授权才能使用查询页面,如选课,选课查询,考试查询等。整体步骤图3-2.。学生选课系统学生选课系统登录主界面常见查询授权查询相关/退出课表查询课程查询成绩查询学籍信息修改密码选课考试信息查询图3.2软件步骤3、登录模块设计学生选课系统登录生成URL判定登录状态学生选课系统登录生成URL判定登录状态HttpDownloader返回XML验证数据解析XML数据返回验证数据UI线程新开线程登录成功并跳转01图3-3登录数据步骤第四章系统具体设计4.1登录功效和实现4.1.1登录界面本界面采取线性布局LinearLayout将标签,文本框,按钮,选项框组织排列。值得注意是这里用户名输入框使用了AutoCompleteTextView控件而不是一般EditText,这么做是为了使程序能够使用保留下用户名密码,而且在开始输入时能够提醒用户。这么做能够降低用户反复输入,有助提升软件可操作性。首先建立好Android工程,在工程下res/layout下建立一个名为Login空xml文件。然后根据设计将布局完成。结果以下图4-1所表示。图4-1登录界面然后在工程src目录下所对应Activity中创建控件,并用findViewById()方法得到所创建控件ID并转换成对应控件,实现代码以下: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为多选框,只有这个值为true时才会保留密码。当用户登录过以后,下次登录会在输入第一个字符时开始提醒用户。用户名密码保留使用SharedPreferences,Android自带微型数据存放类,SharedPreferences保留数据,其背后是用xml文件存放数据,文件存放在/data/data/<packagename>/shared_prefs目录下。其中数据数据适配器实现代码以下: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登录按钮监听器当用户名密码输入完成点击登录将会实施登录操作,所以,必需给登录按钮添加监听器,用来监听点击事件。具体步骤为,得到用户输入用户名和密码,并新开线程。并在用提醒框通知用户现在正在验证用户信息。具体实现代码以下: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("正在登陆服务器,请稍后..."); mDialog.show(); ThreadloginThread=newThread(newLoginThread()); loginThread.start();}});}4.1.3新开线程监听器绑定以后,在用户点击登录按钮时将会新开一个线程,全部验证中操作全部在新线程中实施。新开线程关键用于发送http请求并接收验证信息,以后通知页面显示登录结果实现代码以下所表示: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);}}}新开线程又包含几项对数据处理工作,和对返回处理结果,并对目前页面部分操作。4.1.4提交验证信息handler为接收返回验证信息并在界面显示登录结果,鉴于本学校服务器返回验证信息为一XML文件,解析后用泛型ArrayList存放,其中第一条为用户名密码验证信息,返回1为验证不经过,返回0为经过,并附加部分用户基础数据作为以后操作参数。其中http请求URL和数据处理实现代码以下: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;}因为在Android中,在输入完成后自动添加上一个空格,但http请求URL中,服务器接收时没有控制,所以在这里得对生成URL进行处理,path=path.replaceAll("\\s*","")为去掉字符串中全部空格。该方法返回一个ArrayList,这个ArrayList是可变长数组,为方便返回数据可操作性。4.1.5Activity响应判定将服务器返回数据解析后,我们就知道了这次登录操作中到底有没有经过服务器验证,不过在新线程中下载解析后数据我们无法直接在Activity中使用。所以目前Activity必需在新线程实施结束前处于等候状态,而且随时准备响应。新开线程和Activity不处于同一线程,不能直接对Activity进行操作。所以这里必需有一个Handler来接收新线程发送数据,并用此数据配合根本程更新Activity。前面新开线程中,我们判定了服务器返回值是否为0,并为一个状态量设置了值,这个值就是Handler所接收值。经过新线程值来控制UI更新,实现代码以下: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(),"账户或密码错误", Toast.LENGTH_SHORT).show(); break;} }};这是一个内部类,写在在Activity中。假如新线程返回msg.what=0则关闭Activity中对话框,并提醒登录成功,然后跳转到程序主页面,并将登录页面销毁。假如不为0则提醒用户账户或密码错误。4.2程序主页面实现4.2.1主界面头部菜单栏用户登录经过服务器验证后界面将跳转到Main_bootom_Tab页面,此页面知识一个框架,经过这个Activity能够同时加载多个页面,增加屏幕可显示信息量。在页面底部放置一个菜单栏,用户能够经过点击此菜单栏来实现页面之间切换。制作这个头部菜单栏是为了提升软件可操作性,用是TabHost+RadioGroup相结合方法来制作这个部分。菜单栏底部位置是经过TabHost这个布局来实现,然后是LinearLayout线性布局来部署内容。内部选项卡是经过TabWiget来实现在工程下res/layout下建立一个名为main空xml文件,然后在这个文件里根据思绪来添加布局代码。主界面菜单选项使用RadioGroup来建立,在这里布局中RadioGroup里容纳4个RadioButton,而RadioButton是单选按钮。在这种情况下就只有也只能有一个RadioButton能被选择,而且在开始时默认了第一个按钮被选中。其中RadioButton实现方法是在设置了内部文字,然后再按钮顶部上添加上图片,实现代码以下:<RadioButton android:text="@string/main_date" android:drawableTop="@drawable/tab_date" android:id="@+id/radio_button0" android:checked="true" style="@style/main_tab_bottom"/>从上述代码能够看到,在菜单每个选项卡样式全部是调用了style上main_tab_bottom来实现样式,而main_tab_bottom背景background值是@drawable/btn_bg,btn_bg不是一个简单背景图片,而是一个xml文件,经过这个文件能够实现菜单选项卡切换时背景切换效果,使得这个菜单栏愈加美观,代码是使用了安卓selector来实现,在这里是经过不停条件来判定使用哪一个item,里面包含了多个属性值,如是否取得焦点、是否响应事件、是否点击三个条件。实施代码以下:<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>制订完主页面布局后,在src/com.manage.activity下MainPage文件中OnCreate(OnCreate方法是用来初始化Activity实例对象)中调用布局,到现在为止顶部菜单栏布局已经基础完成,但现在里面所对应内容还是空。所以就需要在这里给tabHost中添加tab内容,以第一格tab为例,先是经过Intent方法新建个mDate,用来实现页面跳转方法,然后动态用tabHost来经过addTab方法添加对应TabSpec值和各个属性。最终在添加RadioGroup选择操作函数,这里是经过switch来完成对应按钮功效实现,在每个case项中经过tabHost.setCurrentTabByTag来给和特定值实现页面上跳转。最终效果图4-1:图4-2主页界面头部菜单4.2.2页面跳转在Main_bootom_Tab中添加两个页面,里面添加系统功效选项。第一个为MainActivity,第二个为ChoiseCourse。实现效果以下图所表示:图4-3系统主界面其中每一个选项是一个自定义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="(查询当学期所选课程具体信息)"/> <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>在主类当中经过results=(RelativeLayout)findViewById(R.id.results);方法直接得到一个对象,然后对象上绑定监听器。results.setOnClickListener(newgotoActivity());经过判定所点击对象ID将Intent中添加标志,最终用Intent对象开启新Activity,具体实现代码以下: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("第四个页面>waterlevenow——logn!!"); intent.putExtra("mark","4");} elseif(v.getId()==R.id.examinfi){ System.out.println("第五个页面>waterlevenow——logn!!"); intent.putExtra("mark","5"); }else{return;} MainActivity.this.startActivity(intent); }新开启Activity被开启后,去除Intent中传入键值对,经过标志信息判定,来选择所需要发送URL。由前期分析到,学校教务系统只能经过http请求发送接收数据,从系统整体结构分析,加个连接池类能够增加系统可扩展性和可管理性。整个连接池类只作为字符串返回和修饰,在这里不做介绍。4.2.3经过WebView显示信息在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。WebKit是MacOSXv10.3及以上版本所包含软件框架。同时,WebKit也是MacOSXSafari网页浏览器基础。WebKit是一个开源项目,关键由KDEKHTML修改而来而且包含了部分来自苹果企业部分组件。传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应是KDEKHTML和KJS。不过,伴随JavaScript引擎独立性越来越强,现在WebKit和WebCore已经基础上混用不分。在这里经过添加一个WebView来显示服务器返回页面,实现代码以下: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); //设置WebView属性,能够实施Javascript脚本 webview.getSettings().setJavaScriptEnabled(true); //加载需要显示网页 webview.loadUrl(url); //设置Web视图 webview.setWebViewClient(newHelloWebViewClient());} @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent){if((keyCode==KeyEvent.KEYCODE_BACK)&&webview.canGoBack()){webview.goBack();//goBack()表示返回WebView上一页面returntrue;}returnfalse;}privateclassHelloWebViewClientextendsWebViewClient{@OverridepublicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){view.loadUrl(url);returntrue;}}}经过重写WebViewonKeyDown方法能够处理点击返回键时直接退出页面。4.3选课功效实现选课功效因为数据量比较多,但对于通常学生用户而言选课只能选择所对应专业课程和通识课程,所以在这里其它专业课程将不做显示。4.3.1页面设计学生选课因为需要显示项比较多,但在手机界面显示项目太多会影响用户对其操作和体验。所以在这里,只显示了老师,学分,课程名称,和教室。整个信息关键使用ListView动态加载可选课程信息。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>该布局文件定义了四个TextView作为显示信息框架,经过代码动态加载数据,而且生成对象。页面加载时因为要从网络上下载数据,做部分耗时操作,所以在这里必需得加入一个新线程用来处理耗时操作,并提醒用户等候。以下代码写入onCreate方法中: bld=newBinderListData(); bld.setContext(this); mDialog=newProgressDialog(CourseList.this); mDialog.setMessage("正在下载数据,请稍候..."); mDialog.show(); ThreadDownLoader=newThread(newdownThread()); DownLoader.start(); 4.3.2开辟新线程新线程中关键用来做下载服务器返回数据,和解析返回数据等操作。最终将处理完数据装入一个HashMap中用作ListView填入数据。具体实现代码以下: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","学分:"+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对象为应用开始运行时自动创建一个对象,通常见于存放全局变量,在这里用来存放用户登录信息。新线程被运行后调用run()方法,先下载所需Html页面,然后解析得到一个ArrayList对象,里面存放字符串数组,每一个数组表示一条信息。然后将这些信息有选择装入一个HashMap对象,以后将对象传给Handle用来更新UI。4.3.3用handler更新UI经过前面操作,我们得到一个HashMap对象,里面存放着要显示到ListView中各个位置数据,但因为新开线程和UI根本程不在一个线程里,所以,在新开线程中无法对UI进行更新操作,这里就需要引入Handler。在新线程处理完数据后通知Handler,并将处理后数据传入。Handler接收状态信息后,取出传入数据,更新UI,将数据一一显示到用户界面。实现代码以下: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用户点击事件到这里,程序已经将ListView数据添加完成,得到页面以下图所表示:图4-4可选课程到这里还不够,我需要让用户点击某一条就能够显示出该条目标具体信息和添加课程到用户课表。所以,这里必选先给这些ListView添加事件监听。ListView控件在设计上符合这里需求,而且这里添加事件操作也比较简单,只要重写onListItemClick(ListViewl,Viewv,intposition,longid)方法即可。这个方法有四个参数,第一个为ListView本身,第二个为用户所点击View,第三个为用户所点击View位置,第四个为ViewId。经过这多个参数就能够确定用户操作,而且依据操作做出响应。在这里当用户点击某个项,取出这个项课程号和编码,经过Intent携带参数开启前面定义WebView,然后经过判定生成该页面URL然后显示在屏幕供用户操作。关键实现代码以下: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公共类4.4.1XML文件解析XML在多种开发中全部广泛应用,Android也不例外。作为承载数据一个关键角色,怎样读写XML成为Android开发中一项关键技能。在Android中,常见XML解析器分别为DOM解析器、SAX解析器和PULL解析器。在这里采取SAX解析器。SAX(SimpleAPIforXML)解析器是一个基于事件解析器,事件驱动流式解析方法是,从文件开始次序解析到文档结束,不可暂停或倒退。它关键是事件处理模式,关键是围绕着事件源和事件处理器来工作。当事件源产生事件后,调用事件处理器对应处理方法,一个事件就能够得四处理。在事件源调用事件处理器中特定方法时候,还要传输给事件处理器对应事件状态信息,这么事件处理器才能够依据提供事件信息来决定自己行为。SAX解析器优点是解析速度快,占用内存少。很适合在Android移动设备中使用。所以在这里使用SAX方法解析此XML文件。经过前面操作接下来就是解析服务器返回信息。通常返回信息格式以下:1、服务器验证成功返回格式:<UINF> <INF>0</INF> <INF>学生号</INF> <INF>姓名^专业班级^入课时间</INF> <INF>{dpid}{dpcode_grade}{userother}{FX}~学号^@权限$</INF></UINF>2、服务器验证失败返回:<UINF> <INF>1</INF></UINF>登录成功后返回数据是以后使用系统其它功效时参数,现在需要吧这些数据解析成单独部分而且保留下。保留之前先得将XML文件解析成本系统可用数据。在这里,我用SAX方法将标签中数据解析成一个ArrayList可变长数组形式。在登录判定时,直接判定ArrayList对象存放第0项数据是否为0,假如是则保留密码和登录状态,并跳转页面,不然提醒用户输入错误,并清空输入栏。在解析XML文件时我封装两个类Method.java和ExampleHandler.java。第一个负责接收返回数据并创建工厂模式准备解析,第二个是一个专门以SAX方法建立一个XML文件处理器,具体实现代码以下(关键代码):Method.javatry{SAXPars

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论