周一至周五 | 9:00—22:00

期刊论文网 > 工业技术论文 > 计算机自动化技术论文 > 手机软件开发论文 基于android平台的药房助手软件开发

手机软件开发论文 基于android平台的药房助手软件开发

2018-12-12 11:04:33来源:组稿人论文网作者:婷婷

  摘要

  现在随着Android手机的快速普及,Android手机应用软件越来越多越来越丰富,各行各业都在陆续推出自己的基于Android的软件系统,比如说在医药行业。当药店来了很多买药的客户那么就需要排队等候PC端收银,为了方便药房里面的医师快捷支付,查阅订单信息等。本文对目前应用的WindowsPhone、IOS和塞班等平台的现状进行了分析与比较。进而研究分析了Android平台的系统架构和组件模型,接着解析了Android中的重要API和应用构成,以及四大组件生命周期的机制。在此基础上,基于此分析开发了一个基于Android手机的药房助手软件。

  该软件使用Java语言编写,Android SDK开发包和Eclipse+ADT开发工具进行开发,主要实现了商品扫码,支付宝支付,微信支付,现金支付,收款记录,自提订单,优惠券发放,奖品兑换,会员卡发放,通知公告等功能。支付宝等支付方式是现下各个服务行业都比较流行的支付方式,只需要通过扫一扫方式就可以支付,方便医师也方便了客户。在自提订单就可以看到以往的交易订单详情等等。

  本系统界面友好、操作便捷,具有良好的可扩展性和可维护性,系统经过测试,可以稳定运行,能够满足手机用户的基本需求。

  关键词:android java药房支付分享

  目录

  南京工业大学本科生毕业设计(论文)

  第一章引言

  现如今随着硬件的快速提升,手机的功能越来越完善,处理速度以及画面效果越来越让人舒心使用,在这些因素的作用下各类手机系统也日渐火热起来。现如今在我国国内最常见的手机系统有iPhone,Windows Phone,Symbian以及占据手机市场半壁江山的Android。近日市场分析公司IDC根据当前智能手机的走势,预测截止到2016年,Android操作系统的市场占有率仍然保持第一,苹果iOS紧随其后,微软的Windows Phone正缓慢发展中。不过,IDC还认为2016年安卓手机市场占有率会有小幅下降,从今年的68.3%降至63.8%。在IDC看来谷歌安卓系统能取得这么大的成就最重要的一个原因就是搭载安卓系统的手机不仅有高端机型,也有由LG、三星、索尼等厂商推出的中低端机型,这在一定程度上丰富了安卓的产品线。苹果iOS再一次排在了第二的位置。2012年iOS的市场占有率为18.8%,IDC预测2016年其市场占有率不会有太大变动,预计为19.1%。另外IDC认为的市场占有率11.4%,总体趋势仍然是缓慢发展中。

  下面大体的介绍一下Android系统。Android是基于Linux内核的软件平台和操作系统,是Google在2007年11月5日公布的手机系统平台,早期由Google开发,后由(Open Handset Alliance)开发。它采用了软件堆层(Software stack,又名以软件叠层)的架构,主要分为三部分。低层以Linux核心工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程式的一部分。

  现如今随着业务的复杂,人员的分散,第三方支付平台越来越火热的情况下,药房的系统也需要去跟进,所以在我现有掌握android开发技术的基础上,通过杨老师的指导,开发出一款便捷的药房助手软件。

  1.1手机系统发展现状

  目前国外各软硬件厂商已经推出过多款手机操作系统。下面简单介绍一下现主流手机操作系统。

  Symbian系统是塞班公司为手机而设计的操作系统。2008年12月2日,塞班公司被诺基亚收购。塞班系统一直由于方便快捷,功能多样,加上诺基亚是其最大的支持者而曾经风靡全球,但是随着苹果等新晋竞争对手的加入愈发显出自己的老迈。在经过了几次对塞班平台的修修补补以后,在2011年6月22日,诺基亚将塞班承包给埃森哲。紧接着在2011年12月21日,诺基亚官方宣布放弃塞班(Symbian)品牌,全面转向了windowsphone阵营。以后虽然诺基亚没有表示放弃塞班的支持,但是依然将塞班作为低端手机中的配置。

  微软在耕耘了多年的windowsmobile市场一直仅有个位数的市场占有率,而相比较Android系统而言,支持的厂家大多貌合神离,虽然与诺基亚的联手让不少人看到了希望,但是两个正在没落的贵族还尚需推出更有利的产品以及时间来证明自己。当然,微软从不缺钱,也有的是耐心,如同当年推Xbox一样,蚂蚁啃大象的精神会让微软有了最后的成功,而且诺基亚并没有到了行将就木的关头,出色的工业设计以及丰富的渠道,加上这两年新的CEO上台,在产品研发速度上以及对市场的反应上都要快了很多,而且如同诺基亚8084100万像素的摄像头一般的革新技术证明了诺基亚有了创新的诚意,而不是再“科技以换壳为本”。

  苹果iOS是由苹果公司开发的手持设备操作系统。主要开发语言是object-c,iOS已经占据了全球智能手机系统市场份额的30%,在美国的市场占有率为43%。凭借出色的用户体验,众多丰富的软件支持,加上硬件上面的精益求精,在苹果出色的营销体系下,打败了众多的新老对手,短短几年间迅速建立了庞大的市场和用户群,获得了出色的口碑。

  Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”。作为苹果的竞争对手,Android平台也建立了庞大的用户基础,同样是利用更短的时间占领了市场。Android操作系统跟苹果的ios有许多相似之处,但是使用起来更加便捷,加上支持厂商众多,产品线更加丰富,而且产品更加多样化,尽管在触控体验上逊色于ios,但是并不妨碍其成为目前市场上的佼佼者,并被迅速的应用到各个产品类型上。

  ios以及Android的大行其道已经让其他众多的优秀的手机智能操作系统黯然失色,两者综合起来可以说已经占据了大多数的智能手机市场。各自大约都为三成以上的市场份额。

  1.1.1国内手机应用现状

  在移动互联网快速成长期,国内产业链各方不放弃任何可能商机,积极布局应用商店,争取在移动互联网中拥有一席之位,甚至掌控话语权。但由于用户付费习惯的缺失、盈利模式的局限、内容同质化等原因,国内应用商店生存环境恶化,至今仍没有一家公司对外公布其应用商店已经开始盈利。市场竞争激烈。

  国内的应用商店以基于Android操作系统居多,并可以划分为4个阵营,其竞争非常激烈。第一,由技术论坛发展而来的第三方应用商店,如安卓网、安智网、机锋网和APPCHINA应用汇;第二,互联网企业向移动互联网拓展而建设的应用商店,如腾讯应用商店、网易应用、360手机助手;第三,电信运营商牵头建设的跨平台应用商店,如中国移动mobile market、中国电信天翼空间、中国联通沃商店;第四,终端厂家为品牌手机开设的应用商店,联想、中兴、宇龙等大部分厂家都有自己的应用商店,与此同时,国外终端厂商通过代理方式将自己的商店转交给国内第三方运营,如索尼爱立信将“PlayNow”中国区的运营、技术支持工作外包给国内网游厂商第九城市。

  1.1.2国外手机应用现状

  目前国内外手机应用服务方向主要有基于地理位置的信息服务(Location Based Service LBS)它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标),在GIS(Geographic Information System,地理信息系统)平台的支持下,为用户提供相应服务的一种增值业务。例如手机定位,导航服务。

  近年来十分热门的网络社交服务(Social Networking Services)也已进入到手机客户端领域。例如国内有名的社交网站人人网已经针对Iphone,android,塞班等手机平台推出了手机客户端。国外最大的社交Fackbook也已经传出正在进行针对手机的产品的研发。Twiter,Myspace等国外知名社交类网站都已经推出手机版。国内淘宝网旗下口碑网在今年也已经推出针对多个手机平台的客户端程序。MSN,QQ等即时通信类的应用也已经在各个主流手机平台推出。

  手机办公类软件在手机上也正日趋完善,在手机上编辑查看各类文档已经实现,在android平台上的QuickOffice就是这样的软件。在Google Market(一个谷歌针对android系统用户所开发的应用商场)上已经有过万的企业应用办公套件。

  手机娱乐游戏类应用,该类应用作为传统类手机应用,在各个平台上发展已近相对完善,手机上对各种流媒体的播放也已完美的支持。各类传统PC游戏厂商进入手机领域。

  1.2未来发展趋势

  随着4G应用的不断开发推广,用户会越来越需要更加个性化、优质化的多媒体数据服务,用户希望能够随时、随地无缝利用4G网络进行办公、网上交易、游戏娱乐、欣赏影视节目、收听和下载音乐等。根据观察,在不久的将来,移动手机终端将会在以下若干方面具有新的发展。

  首先,提供智能提醒服务,手机能够与用户实现密切配合,并监控用户的个性化设置(保持在本地或者云端),当重要时间点或关键事物需要用户注意时,手机会向用户发出“提醒”服务,服务包括日程提醒、交通状况、最佳行车路线、最佳泊位、优惠活动、实时新闻、体育赛事、天气情况、股市行情、好友活动、亲友生日等。

  其次,提供虚拟现实体验,手机可以借助传感器、周边设备了解到您的身边环境,并根据收集到的信息,智能的为您提供有用的信息,如在网络世界养的宠物,可以借助音频设备表达叫声,借助马达和位置传感器等传递其跳、跃等行为信息;也可以在用户购物时,提供相关的同类产品价格参考,提醒用户附近的那个卖场更物美价廉;根据实际场景,为用户及时提供正在操控的产品的使用方法提醒。

  接着,发挥物联网的优势,借助无处不在的传感器,可以感知并分享到周围世界的海量信息,这些信息将在“云端”得到整合,帮助用户及时、准确的获得气息信息、交通路况。另外借助物联网,用户间可以方便、快速的分享资源,协助和交互。如进行端到端的多人游戏、照片分享、书籍分享、音乐分享等。

  然后,作为经济工具,在交通或者信息不发达的情况下,帮助用户找到最佳的市场,获得有价值的帮助信息,帮助用户从事的经济活动的收益率。

  最后,更加智能、安全的设备,随着智能手机的不断普及和更加智能,手机软件的更新、升级将会变得越发简单,并会为用户提供工具或信息,让用户有能力和权力决策那些内容可以浏览、下载或分享。在安全性上也将更加出色,能够十分有效的帮助用户进行获取到的内容的管理,保护用户的个人隐私和基于手机的金融活动如电子钱包、在线支付、在线贸易等。

  第二章Android系统开发技术简介

  2.1 Android开发平台的定义及特性

  2.1.1 Android开发平台的定义

  Android是一个包含操作系统、中介架构层及应用程序所产生出来的软件堆栈架构。由下而上,其核心为嵌入式Linux2.6作业系统,向上搭配Google为Android开发的类库及Android运行时,再配合应用程序架构,来开发各种不同的应用程序。

  2.1.2Android的功能特征

  (l)应用程序架构:在应用程序架构内已经具备多种不同的基础组件,在开发应用程序时,就可以直接调用这些组件来使用,可以节省开发应用程序的心力及时间。

  (2)Dalvik虚拟机器:在Android平台上所使用Java虚拟机,不是Sim公司的标准Java虚拟机,而是使用Google自主开发的代号为Dalvik的虚拟机,它在保证API方面的兼容的同时,针对移动手机进行了大幅优化,占用资源更小,运行效率更高。

  (3)集成的浏览器:集成的浏览器是Android内建的浏览器,是以WebKit的浏览引擎为基础所开发成的。WedKit是一个开源浏览器网页排版引擎,目前使用WebKit引擎的浏览器主要有:Safari,Midori,Epiphany等。配合Android手机的功能,可以在浏览网页时,达到更好的效果,例如:局部性的缩放网页上的资讯、触控式的操作等效果。

  (4)优化的绘图能力:在程序里可以用到的绘图功能分为2D与3D两个方面。在2D方面,Android提供了一套特有的类库(SGL;而在3D方面则是使用OpenGLES1.0(openGL for Embedded systems)规范的类库。它们是一种非常快的图形引擎,并且支持硬件加速。

  (5)SQLite数据库:SQLite提供结构化的数据存取。SQLite是一款轻型的数据库,它的设计目标是嵌入式的,目前已经在很多嵌入式产品中使用了它,它占用的资源非常低。它能够支持Windows/Linux/U nix等主流的操作系统,同时能够跟很多程序语言相结合,比如php,Java等,还有ODBC接口,同样比起Mysql,PostgreSQL来讲,它的处理速度比它们都快。它无需安装和管理配置,它是一个储存在单一磁盘文件中的完整数据库,体积小只有250KB但支持数据库大小至2TB。它虽然很小巧,但是支持的SQL语句毫不逊色于其它开源数据库。同时它还支持事务功能和并发处理等等。SQLite也是一套开放性的关联式资料库,其特点在于轻量性方面的设计结构,更适合在手机上使用。

  (6)多媒体的支持能力:主要用于播放媒体文件。这同时包括对音频(如播放MP3或其他音乐文件等)和视频(如播放从网上下载的视频)的支持,并支持“播放URI地址”(Note:URI即是统一资源识别地址)模式—在网络上直接播放的流媒体。另外支持各种通用的静态图像格式,例如:JPG、PNG、GIF等格式。

  (7)GSM技术:Global System for Mobile Communications,即全球移动通讯系统,俗称”全球通”,是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。GSM技术是属于手机硬件方面的展现,也是在开发Android应用程序时可以突出的特点之一。

  (8)蓝牙、EDGE、3G及Wi-Fi:蓝牙是一种新型、开放、低成本、短距离的无线连接技术,可取代短距离的电缆,实现话音和数据的无线传输。EDGE(Enhanced Data Rate for GSM,Evolution),即增强型数据速率GSM演进技术。EDGE是一种从GSM到3G的过渡技术,它主要是在GSM系统中采用了一种新的调制方法,即最先进的多时隙操作和SPSK调制技术。由于8PSK可将现有GSM网络采用的GMSK调制技术的信号空间从2扩展到8,从而使每个符号所包含的信息是原来的4倍。Wi-Fi(WirelessFidelity),即无线保真技术,与蓝牙技术一样,同属于在办公室和家庭中使用的短距离无线技术。该技术使用的是2.4GHz附近的频段,该频段目前尚属没用许可的无线频段。其目前可使用的标准有两个,分别是IEEE802.lla和IEEE802.11b。这些通讯能力也是属于手机硬件方面的展现,也是在开发Android应用程序时可以突出的特点之一。

  (9)GPS:Global Positioning System,即全球定位系统,它是一个由覆盖全球的24颗卫星组成的卫星系统。这个系统可以保证在任意时刻和任何地点都可以同时观测到4颗卫星,以保证卫星可以采集到该观测点的经纬度和高度,以便实现导航、定位、授时等功能。这项技术可以用来引导飞机、船舶、车辆以及个人。这个同样也是属于手机硬体方面的体现,也是在开发Android应用程序是可以突出的特点之一。

  2.2 Android开发平台的架构分析

  图2-1 Android架构

  2.2.1应用程序框架

  在Android SDK中,定义了让开发者使用与核心应用程序相同API的权限应用程序框架是为了要简化组件的重新利用而设计的,应用程序可以发布功能为其它应用程序所使用。但是,这要受限于应用程序架构的安全机制,使用者以用同样的机制来新增、置换组件。目前所有的应用程序是由服务及系统来组成,包含有:

  (l)一套强大和可扩展的视图系统:用来建构一个应用程序的基本组件,包了在开发系统画面时,常用的列表、网格、文本框、按钮等控制项,甚至是内嵌的Web浏览器。

  (2)内容提供者:使应用程序可以访问另一个应用程序的数据(如联系人数库),或者共享它们自己的数据。

  (3)资源管理器:提供各种非程序代码的资源让应用程序去使用。例如:本字符串、图形文件或排版相关的布局文件。

  (4)通知管理器:提供应用程序在状态栏中显示应用程序自定义的提示信息。

  (5)活动管理器:管理所有应用程序的生命周期及提供常用的导航回退功能。例如:启动应用程序要用到的资源准备及关闭应用程序时释放内存及相关资源等工作。

  (6)视窗管理器:用来管理所有启动程序的视窗。

  (7)位置管理器:用来管理地图服务的相关功能。

  (8)电话管理器:用来管理用户拨打与接听电话的相关功能。

  (9)包管理器:管理所有安装在Android系统内的包。

  2.2.2类库

  在Android中包含一些C/C++的类库,这些类库能被Android系统中不同的组件来使用。开发者可以通过应用程序框架使用这些功能。部分核心类库列表如下:

  (1)surface Manager:主要的功能是让开发者可以去存取/显示系统及管理的功能,在[显示]与[存取操作]间的对应、互动以及实现无接缝的2D/3D多应用程序之间的整合。例如:在2D、2D显示上的合成、叠合动作。

  (2)3Dlibraries:主要是依openGLES1.0规范所定义的3D绘图引擎。该库使用硬件加速(当硬件可用时),可以将硬件的3D功能做最佳化的处理显示。

  (3)SGL:主要是处理有关显示2D方面的绘图引擎。

  (4)Media Frame work:主要是以packetVideo公司的OpenCORE为基础所发展的多媒体类库,该库支持回放和录制大量流行的音视频格式和静态图片。例如:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等格式

  (5)Free Type:主要是用来显示点阵图和处理向量字形的。

  (6)SSL:(secureSocketsuyer),中文名为“安全套接层协议层”,它是网景公司提出的基于WEB应用的安全协议,当前版本为3.0。SSL协议指定了一种在应用程序协议(如HTTP、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议位于TCP胆协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Proto col):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Hand shake proto col):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议提供的服务主要有:①认证用户和服务器,确保数据发送到正确的客户机和服务器;②加密数据以防止数据中途被窃取;③维护数据的完整性,确保数据在传输过程中不被改变。

  (7)SQLite:SQLite是一套开放性的关联式资料库,能够被所有应用程序使用的轻量级的关系数据库引擎。

  (8)web Kit:是一个先进的网页浏览器引擎,被用来构建Android浏览器和内嵌的web视图,也可以让开发者利用这个引擎来做不同的应用。

  (9)lib c:就是一个BSD标准C类库。但是,针对Linux嵌入式装置进行过最佳化的调整。

  2.2.3 Android运行时组件

  虽然Android是用Java语言来开发、撰写应用程序,但却不使用Java运行时组件来执行Java程序,而是使用了由Google自行研发的Android运行时组件来执行程序。Android运行时组件包括两个重要的部分,一个是核心类库,另一个是Dalvik虚拟机。

  2.3 Android应用的构成和工作机制

  对于一个Android应用程序来说,是由Activity、IntentReceiver、Service、Content Provider四部分组成,但并不是每一个Android应用程序都必须由这四部分组成。在应用程序中使用时,需要在配置文件AndroidManifest.xml中进行配置。这个配置文件是每个Android应用程序所必需的,用于定义应用程序的组件、组件的功能以及必要条件等。Android应用的构成和工作流程如图2-2:

  图2-2 Android的构成和工作流程

  第三章Android应用程序结构剖析

  3.1 Android的API

  Android API主要包含了以下几个部分:

  (1)AndroidManifest.xml

  AndroidManifest.xml是系统的清单文件,它告诉系统如何处理所创建的所有应用组件(尤其是活动(Activity),服务(Service),广播接收者(Broadcast Receiver)和内容提供者(Content Provider))。举例来说,控制文件就是把活动和要接收的意图(Intents)连接在一起的“胶水”。

  活动

  Activity的中文意思是活动。在Android中,Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口。它是Android应用的重要组成单元之一,提供了和用户交互的可视化界面。活动就是一个有生命周期的对象。一个活动就是完成某些工作的代码块,这部分工作还可能包括对用户UI界面的显示。不过这不是必须的,有些活动从不显示UI界面。

  (3)视图

  视图可以将其自身绘制到屏幕上。Android的用户界面由一系列的视图树构成。接口都是由一组以树的形式出现的视图组成的。开发者可以通过创建一个新的视图的方法来使用自定义的图形处理技术(比如开发游戏,或者是使用了不常用的用户图形窗口界面)。

  (4)意图

  意图是一个简单的消息对象,它表示程序想做某事的“意图”。比如应用程序想要显示一个网页,那么它可以通过创建一个Intent实例并将其传递给系统来表示意图浏览这个URI。系统将定位到能处理这一Intent的代码(在当前情况下就是浏览器),并运行之。意图也可以用于广播系统范围内的有效事件(例如通知事件)。

  (5)服务

  服务是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序的进程里,这取决于自身的需要.。其它的组件可以绑定到一个服务上来,通过远程过程调用(RPC)来调用这个方法。例如媒体播放器的服务,当用户退出媒体选择的界面时,仍然希望音乐依然可以继续播放,这时就可用服务来保证当用户界面关闭时音乐还继续播放着。

  (6)通知

  使用Notification在状态栏上显示通知。

  Android也提供了用于处理通知的类,它们是Notification和NotificationManager。其中Notification代表的是具有全局效果的通知,而NotificationManager则是用于来发送Notification通知的系统服务。

  使用Notification和NotificationManager类发送和显示通知,大致可以分为以下4个步骤实现。

  ①调用getSystemService()方法获取系统的NotificationManager服务。

  ②创建一个Notification对象,并为其设置各种属性。

  ③为Notification对象设置事件信息。

  ④通过NotificationManager类的notify()方法发送Notification通知。

  (7)内容提供者

  内容提供者是用来提供对设备上数据进行访问。典型的例子就是使用内容提供者来访问联系人列表。应用程序也可以使用其它程序通过内容提供者提供的数据,同时也可以定义自己的内容提供者来向其它应用提供数据访问服务。

  3.2 Android应用程序结构解析

  通常由以下四个组件来构建一个完整的Android应用程序。

  ①Activity

  ②Broadcast Receiver

  ③Service

  ④Content Provider

  然而,并不是所有的Android应用程序都必须具备上面的四个组件,可以由上面的一个或几个来组建。当决定使用以上哪些组件来构建Android应用程序时,需要将它们注册在AndroidManifest.xml文件中,这是一个XML配置文件,在这个文件中可以声明应用程序组件以及它们的特性和要求。这个配置文件是每个Android应用程序所必需的。

  3.2.1 Activity

  活动是以上四个组件中最常用的一个。每个活动都是Activity的子类,并实现了一些独有的功能,如管理UI显示和UI的反馈事件。一个活动就相当于应用程序的一个用户界面,由事件响应以及视图等组成。大多数的应用程序通常包括多个界面。例如:一个文本聊天应用程序,至少应该包含一个联系人列表界面、一个聊天界面、一个设置界面、一个聊天记录查询界面等等。每个界面其实都可看作是一个活动。显示一个新界面就相当于生成一个对应的活动对象。在一些情况下,活动能够返回给它的上级界面一个返回值,例如一个提供给用户选择照片的活动可以返回给它的调用者用户选择了哪个照片文件。

  当一个新的活动出现时,前一个活动被中断并被放入到一个历史堆栈中。用户可以使用返回键使前一个活动重现。当一个活动不再需要时,可以将它们从历史堆栈中移除。默认情况下,Android会为每个应用程序保留从主界面开始的历史堆栈。

  Android通过一个被称作意图的特殊类,来实现界面与界面之间的跳转。一个意图描述了一个应用程序想要做什么。在意图的描述结构中,含有两个重要的数据结构:动作和动作对应的数据。典型的动作类型包括MAIN、VIEW、PICK、EDIT等等,而动作对应的数据则以URI的形式表示。例如:显示一个联系人信息的界面,可以创建一个意图,并将它的动作设置成VIEW,数据设置成表示这个人信息的URI。

  除此之外,还有一个被称作意图过滤器(IntentFiher)的相关类。当发生一个有效的目的请求时,意图过滤器用来描述一个活动能够处理什么意图。如上例中所描述,想要正常显示一个联系人信息的界面,必须声明一个意图过滤器,它说明当有联系人数据要被在界面上显示时,知道如何处理它们。通常意图过滤器要被注册在AndroidManifest.xml文件中。从一个界面跳转到另一个界面是由解析各种意图实现的。例如:一个活动使用startActivity(myIntent)来调用其他活动时,系统会查找所有已经安装的应用程序的意图过滤器,并从中挑选出能够匹配myIntent意图的活动。随后,这个新的活动接收到意图(myIntent)的通知并开始运行。当startActivity方法被调用,解析意图的处理过程随之发生,这个机制有以下两个突出的优点:

  活动可以通过一个以意图形式产生的请求来重用其他组件的功能。

  活动可以在任何时候被一个具有等价意图过滤器的新活动所替代。

  3.2.2 Service

  Service通常总是称之为“后台服务”,其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件:

  ①并不依赖于用户可视的UI界面(当然,这一条其实也不是绝对的,如前台Service就是与Notification界面结合使用的);

  ②具有较长时间的运行特性。

  3.2.3 Content Provider

  在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需。

  ①ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的形式来组织数据。②使用ContentProvider可以在不同的应用程序之间共享数据。③Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。总的来说使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

  3.2.4 Broadcast Receiver

  BroadcastReceiver(广播接收器)是Android中的四大组件之一。

  Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:①同一app内部的同一组件内的消息通信(单个或多个线程之间);

  ②同一app内部的不同组件之间的消息通信(单个进程);

  ③同一app具有多个进程的不同组件之间的消息通信;

  ④不同app之间的组件之间消息通信;

  ⑤Android系统在特定情况下与App之间的消息通信。

  从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。具体实现流程要点粗略概括如下:

  ①广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;

  ②广播发送者通过binder机制向AMS发送广播;

  ③AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;

  ④消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

  对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同。但总体流程大致如上。

  3.2.5 Sqlite简介

  Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都相当出色,功能也非常的强大。SQLite具备下列特点:

  ①轻量级

  使用SQLite只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。

  ②独立性

  SQLite数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。

  ③隔离性

  SQLite数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。

  ④跨平台

  SQLite目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。

  ⑤多语言接口

  SQLite数据库支持多语言编程接口。

  ⑥安全性

  SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。

  3.3 Intent的详细解析

  在一个Android应用中,主要是由四种组件组成的,这四种组件可参考上一节的内容。而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。在这些组件之间的通讯中,主要是由意图协助完成的。意图负责对应用中一次操作的动作、动作对应的数据、附加数据进行描述,Android则根据此意图的描述,负责找到相应的组件,将意图传递给它,并完成组件的调用。因此,意图在这里起着一个媒体中介的作用,专门提供组件之间互相调用的相关信息,实现调用者与被调用者之间的解耦。

  例如,在一个联系人维护的应用中,当在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够调出此联系人的详细信息,为了实现这个目的,listActivity需要构造一个Intent,这个Intent用于告诉系统,要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity(intent intent),将构造的Intent传入,系统会根据此intent中的描述,到AndroidManifest.xml中找到满足此Intent要求的Activity。系统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivitv则会根据此Intent中的描述,执行相应的操作。

  3.3.1 Intent的抽象描述

  在Android参考文档中,对意图的定义是执行某操作的一个抽象描述。该抽象描述的具体内容如下:

  首先,它是要执行的动作的一个简要描述,如查看、修改等,Android定义了一套标准动作。此外,还可以根据应用的需要,定义自己的动作,并可定义相应的活动来处理自定义的动作。

  其次,是执行动作要操作的数据,Android采用指向数据的一个URI方式来实现。

  另外,除了动作和数据这两个重要属性外,还有一些附加属性:

  类别:被执行动作的附加信息。例如LAUNCHER_CATEGORY表示意图的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVECATEGORY表示当前的意图是一系列的可选动作中的一个,这些动作可以在同一个数据上执行。

  数据类型:显式指定意图的数据类型。一般意图的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用指定的类型。

  组件:指定意图的目标组件的类名称。通常Android会根据意图中包含的其它属性的信息,比如动作、数据/数据类型、类别进行查找,最终找到一个与之匹配的目标组件。

  附加信息:是其它所有附加信息的集合。使用附加信息可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在附加信息里,传给电子邮件发送组件。总之,动作、数据/数据类型、类别和附加信息一起形成了一种语言。这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。随着应用不断的加入到系统中,它们可以添加新的动作、数据/数据类型和类别来扩展这种语言。应用也可以提供自己的活动来处理已经存在的这样的“短语”,从而改变这些“短语”的行为。

  3.3.2 Android如何解析Intent

  Activity、Service和BroadcastReceiver能定义多个Intent过滤器来通知系统它们可以处理哪些隐式Intent。每个过滤器描述组件的一种能力,以及该组件可以接收的一组Intent。实际上,过滤器接收需要类型的Intent,拒绝不需要类型的Intent,但是仅限于隐式Intent。显式Intent无论其内容总可以发送给它的目标,过滤器并不干预。但是,隐式Intent只有在通过组件的Intent过滤器之后才能发送给组件。在应用中,可以以两种形式来使用Intent:

  (l)直接意图:指定了组件属性的意图。通过指定具体的组件类,通知应用启动对应的组件。

  (2)间接意图:没有指定组件属性的意图。这些意图需要包含足够的信息,这样系统才能根据这些信息,在所有的可用组件中,确定满足此意图的组件。对于直接意图,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接意图,通过解析,将意图映射给可以处理此意图的活动、意图接收器或服务。

  意图解析机制主要是通过查找己注册在AndroidManifest.xml中的所有意图过滤器及其中定义的意图,最终找到匹配的意图。在这个解析过程中,Android是通过意图的动作、数据类型、类别这三个属性来进行判断的,判断方法如下:

  如果意图指明定了动作,则目标组件的意图过滤器的动作列表中就必须包含有这个动作,否则不能匹配。

  如果意图没有提供数据类型,系统将从数据中得到数据类型。和动作一样,目标组件的数据类型列表中必须包含意图的数据类型,否则不能匹配。

  如果意图中的数据不是content:类型的URI,而且意图也没有明确指定它的数据类型,将根据意图中数据的格式(比如http:或者mailto:)进行匹配。同上,意图的格式必须出现在目标组件的格式列表中。

  如果意图指定了一个或多个类别,这些类别必须全部出现在组建的类别列表中。比如意图中包含了两个类别:

  LAUNCHER_CATEGORY和ALTERNATIVEC_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

  3.4 Android活动的生命周期

  Android平台是个手机作业系统。撇掉其他功能不谈,手机的特性,就是应该能随时在未完成目前动作的时候,暂停正在使用的功能,切换到接电话、接收短信模式,而且在接完电话回到应用程序时,还希望能看到一样的内容。现在用户使用智能手机,大多已习惯使用多工的作业系统(如windowsMobile),可以在用手机听音乐的同时,执行其他多个程序。同时执行多个程序有它的明显好处,但也有它的缺点。每多执行一个应用程序,就会多耗费一些系统内存,而手机里的内存是相当有限的。当同时执行的程序过多,或是关闭的程序没有正确释放掉内存,系统运行时就会觉得越来越慢,甚至不稳定。为了解决这个问题,Android引入了一个新的机制—生命周期。

  Android应用程序的生命周期是由Android框架进行管理,而不是由应用程序直接控制。通常,每一个应用程序(入口一般会是一个活动的onCreate方法),都会占据一个进程。当系统内存即将不足的时候,会依照优先级自动进行进程的回收。不管是使用者或开发者,都无法确定应用程序何时会被回收。关于进程的生命周期将在下一节中介绍,本节主要介绍活动的生命周期。

  一个活动类别除了OnCreate方法之外,还预先定义了onPause(暂停)、OnResume(继续)等的基本方法,当从一个活动切换到另一个活动的时候,原来的活动将经过一连串的状态改变。开发者可以在程序中添加一些各状态相对应的流程,每次活动状态改变时,就会执行相对应的流程。要让用户有好的使用体验,活动需要在各个周期中负责保管状态、恢复状态、传送资料等工作。

  3.4.1活动的生命状态

  Android的虚拟机是使用堆栈管理。主要有四种状态:

  (l)活动状态

  活动状态是指用户启动应用程序或活动后,活动运行中的状态。在Android平台上,同一个时刻只会有一个活动处于活动或运行状态。其他的活动都处于未启动、停止或是暂停的状态。

  (2)暂停状态

  暂停状态是指当活动暂时暗下来,退到背景画面的状态。当警告对话框或电话来了时,都会让原来运行的活动退到背景画面。新出现的警告对话框等界面元件盖住了原来的活动画面。活动处在暂停状态时,用户无法与原活动互动。

  (3)停止状态

  停止状态是指有其他活动正在执行,而这个活动己经离开屏幕,不再动作的状态。通过按返回键,可以调出所有处于停止状态的应用程序列表。处于停止状态的活动,还可以通过通知来唤醒。

  (4)已回收或未启动状态

  已回收或未启动状态是指活动尚未被启动、已经被手动终止或己经被系统回收的状态。要手动终止活动,可以在程序中调用finish方法。如果是被系统回收,可能是因为内存不足了,所以系统根据内存不足时的回收规则,将处于停止状态的活动所占用的内存回收。

  图3-1Activity生命周期

  图3-1所示的七个状态又可以归纳成三组:

  (l)资源分配(创建/销毁)

  完整的活动生命周期由创建状态开始,由销毁状态结束。创建时分配资源,销毁时释放资源。

  (2)可见与不可见(启动/重新启动/停止)

  当活动运行到启动状态时,就可以在屏幕上看到这个活动。相反地,当活动运行到停止状态时,这个活动就会从屏幕上消失。当用户按下返回键回到上一个活动时,会先到重新启动状态,再到一般的启动状态。

  (3)用户取得屏幕的控制权(继续/暂停)

  当有个警告对话框、短信、电话等信息进入时,原来的活动会进入暂停状态,暂时放弃屏幕的控制权,被中断到背景去,将前景交给优先级高的事件。当这些优先级高的事件处理完后,活动就改进入继续状态,此时又取得屏幕的控制权。

  3.4.2活动的运作流程

  由实际运行来看,我们可以归纳出所有Android应用程序都遵循的运作流程:

  (l)一般启动

  启动一个活动的基本流程为onCreate一>onstart一>onResume。该流程首先分配资源给这个活动(创建状态),然后将活动的内容显示到屏幕上(启动状态);在一切就绪后,取得屏幕的控制权(恢复状态),用户可以开始使用这个程序。

  (2)调用另一个活动

  调用另一个活动的基本流程为onpause(l)一>onCreate(2)一>onstart(2)一>0nResume(2)一>onStop(l)。该流程首先冻结原来的活动,再交出屏幕控制权;直到活动2完成一般启动流程后,活动1才会被停止。

  (3)回到原来活动

  回到原来活动的基本流程为onPause(2)一>onRestart(1)一>onstart(l)一>onResume(1)一>onstop(2)一>onDestroy(2)。另外按返回键也可以回到原来的活动。

  (4)退出结束

  退出结束的基本流程为onPause一>onStop一>onDestroy。如果程序中有直接调用finish方法来关闭活动的话,系统会跳过先冻结的阶段,直接暂停,停止,然后销毁。

  (5)回收后再启动

  回收后再启动的基本流程为oncreate一>onstart一>onresume。如果被回收掉的活动一旦又重新被调用时,会像一般启动一样再次调用活动的onCreate方法。

  当在模拟器上已经执行过多个应用程序,只要按下返回键,就会开启最近一次开启过的活动。所以如果要让再次被创建的活动跟原来开启过的一样,那么在活动之间切换时,就要保存资料:即在每次活动运行到暂停或停止状态时先保存资料,然后在创建时将资料读出来。

  第四章Android药房助手软件的设计与实现

  4.1研究目标

  (1)了解Android应用程序的设计和开发过程;

  (2)使用多种组件进行Android平台药房助手软件的开发。此款手机应用是基于android开发平台,通过IDEA开发工具开发

  4.2需求分析

  现如今手机应用的高速发展,大量用户的存在,便捷的支付方式导致pc端应用大量的移植到手机端,药店也是需要一款app的行业,为什么呢,其一,当大家都在等候排队一个pso机收银或者pc端的药房管理系统收银都会导致流失一部分客户,如果有了手机端收银,这样只要医师用手机扫描药品录入,收银就会很大的缓解,节省等候排队时间,方便了客户,也方便了自己。其二,药房基本上就只有一台电脑上安装了药房的收银客户端,如果需要看看自提订单或者收银历史什么的就不是很方便,那么手机端就可以,当然除了这些还有会议、会员卡创建、发送优惠券、数据报表等等一切功能,从上面的描述中可以基本了解软件的大体功能需求:

  扫码支付或者现金收银;

  会议创建、通知;

  优惠券发放;

  订单历史;

  通讯录;

  数据报表。

  4.3 UI界面设计

  根据需求分析可以知道,应用程序应包含三个主要的用户界面,这里需要进一步分析每个用户界面中应该包括哪些显示内容。

  其中最主要的是首页,其次是通讯录,最后就是我的,首页是重要功能的一个集合。

  图4-1主要界面

  4.4程序模块设计

  从功能需求上分析可以看出,整个应用程序应划分为3个模块,分别是首页、通讯录、我的。

  首页又包含了帮助,数据报表,优惠券,支付宝等

  在完成用户界面设计、数据库设计和模块设计后,至此程序设计阶段基本完成。

  4.5软件功能图

  图4-2软件功能图

  4.6文件结构与用途

  首先因为与药房有关所以起了一个基本包叫:com.medicine.merchant,以后创建的页面或者工具类都在这个包下面延伸。一般根据个人爱好所有的xxxActivity.java全部放在activity包下面,cache全部放在cashe包下面以此类推,文件结构图4-1所示:

  图4-3药店助手项目文件结构

  表4-1药店助手项目包说明

  包名称说明com.medicine.merchant.activity所有activity页面所在com.medicine.merchant.cache缓存com.medicine.merchant.common全局变量com.medicine.merchant.dialog弹窗com.medicine.merchant.entity实体类com.medicine.merchant.persistencecache常驻缓存com.medicine.merchant.receiver接收者com.medicine.merchant.responsehandler响应基类com.medicine.merchant.util工具类

  4.7程序主要代码

  向网络发起请求代码:

  Request request=new Request(Global.ServerUrl+"api/user/login.shtml");request.setMethod(HttpMethod.Post);Hashtable params=new Hashtable();params.put("username",URLEncoder.encode(username));params.put("password",psw);params.put("registration",JPushInterface.getRegistrationID(LoginActivity.this));params.put("abbr",Global.getRuntimeCache().getValue(AbbrCache.class).toString());request.setParams(params);request.setResponseHandler(loginResponseHandler);

  connection.sendRequest(request);

  Request.setMethod()这个方法是设置发起的请求是post还是get,然后通过一个map吧请求参数加入到requset对象里,然后通过connection发送一个请求,这样一次请求就结束,那么响应代码是这么处理的:

  Com.medicine.merchant.responsehandler//这个类会统一处理请求,子类可以重写某些方法

  public abstract class BaseResponseHandler implements ResponseHandler{protected Response response=null;protected abstract void OnSuccess(JSONObject response)throws JSONException;protected void OnFailure(int errorCode,String errorMsg,JSONObject response)throws JSONException{if(errorMsg!=null){Toast.makeText(MedicineApplication.getInstance(),errorMsg,Toast.LENGTH_SHORT).show();}}protected void OnError(Response response){} Override public void handleResponse(Response response){this.response=response;if(response.getStatusCode()==500){Toast.makeText(MedicineApplication.getInstance(),"服务器异常",Toast.LENGTH_SHORT).show();OnError(response);}else if(response.getStatusCode()==404){Toast.makeText(MedicineApplication.getInstance(),"找不到服务器",Toast.LENGTH_SHORT).show();OnError(response);}else if(response.getStatusCode()==408){Toast.makeText(MedicineApplication.getInstance(),"网络拥堵中",Toast.LENGTH_SHORT).show();OnError(response);}else if(response.getStatusCode()==400){Toast.makeText(MedicineApplication.getInstance(),"网络拥堵中",Toast.LENGTH_SHORT).show();OnError(response);}else if(response.getStatusCode()==HttpURLConnection.HTTP_OK){try{JSONObject res=new JSONObject(response.getResult().toString());if(res.getInt("code")==-1){int errorCode=res.getInt("code");String errorMsg=res.getString("msg");L.e("code:",errorCode+"\t\t"+errorMsg);OnFailure(errorCode,errorMsg,res);}else if(res.getInt("code")==1){toLogin();}else{OnSuccess(res);}}catch(JSONException e){L.e("BaseResponseHandler",e.toString());OnError(response);}}else{Toast.makeText(MedicineApplication.getInstance(),"网络连接失败",Toast.LENGTH_SHORT).show();OnError(response);}}private void toLogin(){if(LoginActivity.getInstance()==null){Intent intent=new Intent(MedicineApplication.getInstance(),LoginActivity.class);//intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);MainActivity.getInstance().startActivity(intent);}}}

  在这里一起网络错误或者参数错误等等都会被拦截,接着子类里面子类要实现sucess()等方法在这个方法里面实现需要处理的业务逻辑:

  private BaseResponseHandler loginResponseHandler=new BaseResponseHandler(){ Override protected void OnSuccess(JSONObject response)throws JSONException{loadingDialog.dismiss();Global.getPersistenceCache().setCache(PersistenceCacheScope.User.name(),"login","username",usernameView.getText().toString().trim());Global.getPersistenceCache().setCache(PersistenceCacheScope.User.name(),"login","password",pswView.getText().toString().trim());JSONObject result=response.getJSONObject("data");Global.getRuntimeCache().setValue(JsBridgeCache.class,result.toString());Global.getRuntimeCache().setValue(TokenCache.class,result.getString("token"));Global.getRuntimeCache().setValue(AvatarCache.class,result.getString("portrait"));Global.getRuntimeCache().setValue(UsernameCache.class,result.getString("username"));Global.getRuntimeCache().setValue(UserIdCache.class,result.getString("userid"));Global.getRuntimeCache().setValue(StoreIdCache.class,result.getString("storeid"));Global.getRuntimeCache().setValue(OtoUrlCache.class,result.getString("o2ourl"));Global.getRuntimeCache().setValue(AbbrCache.class,result.getString("abbr"));Global.getRuntimeCache().setValue(HWCache.class,result.getString("hw"));Global.getRuntimeCache().setValue(FdbsCache.class,result.getString("fdbs"));Global.getRuntimeCache().setValue(DzyNameCache.class,result.getString("dzyname"));Global.getRuntimeCache().setValue(StoreNameCache.class,result.getString("storename"));//L.i("--------------------"+Global.getRuntimeCache().getValue(OtoUrlCache.class)+"-----------------------");Global.isLogin=true;if(!result.has("position")){Global.getRuntimeCache().setValue(PositionCache.class,"");}else{Global.getRuntimeCache().setValue(PositionCache.class,result.getString("position"));}if(!result.has("portrait")){Global.getRuntimeCache().setValue(AvatarCache.class,"");}else{Global.getRuntimeCache().setValue(AvatarCache.class,result.getString("portrait"));}if(result.has("permission")){JSONObject item=result.getJSONObject("permission");if(item.has("THQ")){Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","THQ",item.getString("THQ"));}else{Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","THQ","");}if(item.has("SPM")){Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","SPM",item.getString("SPM"));}else{Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","SPM","");}if(item.has("MDTXL")){Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","MDTXL",item.getString("MDTXL"));}else{Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","MDTXL","");}if(item.has("HYTXL")){Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","HYTXL",item.getString("HYTXL"));}else{Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","HYTXL","");}if(item.has("CJHY")){Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","CJHY",item.getString("CJHY"));}else{Global.getPersistenceCache().setCache(PersistenceCacheScope.Permission.name(),"permission","CJHY","");}}Global.getRuntimeCache().setValue(QrcodeCache.class,result.getString("qrcode"));//if(MainActivity.getInstance()==null){Intent intent=new Intent(LoginActivity.this,MainActivity.class);startActivity(intent);//}finish();} Override protected void OnFailure(int errorCode,String errorMsg,JSONObject response)throws JSONException{super.OnFailure(errorCode,errorMsg,response);loadingDialog.dismiss();} Override protected void OnError(Response response){loadingDialog.dismiss();}};

  因为登录是请求网络所以都是要异步请求的,否则会导致NRG(无响应),登陆之后根据业务需求需要缓存一下数据,这些是整个项目最最重要的地方,也是最需要沥青以及处理好的地方,否则就会导致数据不正确,app崩溃。

  其次就是列表里面的下拉刷新,上拉加载,这里我们引入的是第三方库:

  com.handmark.pulltorefresh.library

  listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener(){ Override public void onRefresh(PullToRefreshBase pullToRefreshBase){loadData();}});listView.setOnLastItemVisibleListener(new PullToRefreshBase.OnLastItemVisibleListener(){ Override public void onLastItemVisible(){if(totalPages>0&&page>=totalPages){return;}//Request moreRequest=new Request(Global.ServerUrl+"api/market/exchangehistory.shtml");Request moreRequest=new Request(Global.getRuntimeCache().getValue(OtoUrlCache.class)+"app/market/exchangehistory.shtml");Hashtable moreParams=new Hashtable();moreParams.put("abbr",Global.getRuntimeCache().getValue(AbbrCache.class));moreParams.put("token",Global.getRuntimeCache().getValue(TokenCache.class).toString());moreParams.put("type",getArguments().getString("type"));moreParams.put("page",page+1);moreParams.put("storeid",Global.getRuntimeCache().getValue(StoreIdCache.class));moreParams.put("pagecount",pageCount);moreRequest.setParams(moreParams);moreRequest.setResponseHandler(moreHandler);connection.sendRequest(moreRequest);}});

  通过类库提供的方法实现,实现原理基本上是通过padding来实现隐藏顶部或者底部。

  4.8系统界面

  图4-2系统界面

  结束语

  这款基于Android系统的药房助手手机应用软件在经过长时间的努力学习和不断的修改尝试以及在杨小来老师的帮助下,顺利的完成。

  在制作这个程序的过程中,我学会了很多知识,比如Android环境的搭建、Activity、Service、ContentProvider、SQLite等,但我学会的最重要的一点是,利用手头上现有的资源去解决问题,比如说在图书馆查看资料、在网络上寻找解决问题的方法。

  虽然,这个软件目前运行良好,也能执行所需要的操作,但是我认为代码的健壮性还很差,在整个工程的构思方面也不足,而且用户操作界面还不够灵活……这些问题还需要在今后的学习和实践中进行逐一解决。希望经过不断地尝试改进可以带给用户更好的体验与生活的便捷。

  实时查重收费:1积分=1000字(不足千字千字计算)

栏目分类