毕业设计-面向android系统的测试工具_第1页
毕业设计-面向android系统的测试工具_第2页
毕业设计-面向android系统的测试工具_第3页
毕业设计-面向android系统的测试工具_第4页
毕业设计-面向android系统的测试工具_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

毕业论文(设计)面向ANDROID系统的测试工具学生姓名于冬敏指导教师陈高泉讲师专业名称电子信息工程所在学院信息工程学院2012年06月目录摘要IABSTRACTII第1章绪论111课题背景112课题说明1第2章ANDROID开发系统综述321ANDROID系统介绍322开发环境介绍523开发语言介绍7第3章测试工具介绍931测试工具结构介绍932测试工具中SERVICE介绍12第4章总体设计2241概述2242构成23第5章设计思想2451设计思想概述2452设计原则25第6章结论35致谢36参考文献37附录38摘要基于ANDROID的自动化测试的设计与实现以ANDROID客户端的测试为研究内容,分析了ANDROID自动化测试框架及其层次关系,尝试在现有测试方法的基础上进行测试手段的优化和创新。研究了基于JUNIT和INSTRUMENTAION的ANDROID自动化框架的实现技术,并利用HUDSON进行集成,实现ANDROID的自动化测试。产品的开发实践表明,这种自动化测试方法效率高、用户体验好,对于ANDROID的自动化测试研究具有一定参考价值。ANDROID应用程序使用JAVA做为开发语言,把编译后的JAVA代码连同其它应用程序需要的数据和资源文件一起打包到一个ANDROID包文件中,这个文件使用APK做为扩展名,它是分发应用程序并安装到移动设备的媒介,用户只需下载并安装此文件到他们的设备。单一APK文件中的所有代码被认为是一个应用程序。关键词关键词测试自动化;ANDROID;设计ABSTRACTTHISPAPERFOCUSESONTESTINGOFANDROIDCLIENTSTHEAUTHORSANALYZETHEANDROIDAUTOMATEDTESTINGFRAMEWORKANDITSHIERARCHYTHEIMPLEMENTATIONISBASEDONTWOAUTOMATEDTESTINGFRAMEWORKOFANDROIDPLATFORMJUNITANDINSTRUMENTATIONTHEPURPOSEOFTHISARTICLEISTOPROPOSEANOPTIMIZEDTESTMETHODMAKINGUSEOFTHECONTINUOUSINTEGRATIONFEATURESOFHUDSON,THEREALSENSEOFAUTOMATEDTESTINGCANBEACHIEVEDITSHOWSTHATTHISAUTOMATEDTESTINGMETHODIMPROVESEFFICIENCYANDENHANCESUSEREXPERIENCEINSOMEEXTENTTHISRESEARCHWILLHAVEVALUESFORAUTOMATEDTESTINGOFANDROIDANDROIDAPPLICATIONSAREWRITTENINTHEJAVAPROGRAMMINGLANGUAGETHEANDROIDSDKTOOLSCOMPILETHECODEALONGWITHANYDATAANDRESOURCEFILESINTOANANDROIDPACKAGE,ANARCHIVEFILEWITHANAPKSUFFIXALLTHECODEINASINGLEAPKFILEISCONSIDEREDTOBEONEAPPLICATIONANDISTHEFILETHATANDROIDPOWEREDDEVICESUSETOINSTALLTHEAPPLICATIONKEYWORDSAUTOMATEDTESTINGANDROIDMOBILEPHONEDESIGN第1章绪论11课题背景作为20世纪最伟大的发明之一,计算机也进入了后PC时代。不知不觉中,形形色色的数字产品成为主要的信息处理工具、并且逐步形成一个充满商机的巨大产业。随着后PC时代的到来,人们开始接触全新的计算机软件,计算及操作系统。ANDROID系统的开源,为计算机产品的生产商们又一次创造了商机,越来越多的人开始知道ANDROID,认识ANDROID,开始使用ANDROID,这样也就使得ANDROID产品走进了一个美好的时代,而ANDROID产品程序的测试也被生产商们开始慢慢的拿到了日程上,这关系到他们生产过程中能否更多的节约时间金钱。此次设计通过对ANDROID系统测试工具的开发,可以掌握ANDROID系统软件开发的基本技术、例如ANDROID的用户界面设计,ANDROID进程间的通信,以及我们采用的JAVA语言等。既可以用于国内的软件开发、又可在将来的实际工作中的对日产品开发中有所助益。12课题说明121设计要求ANDROID模拟器,JAVA语言,ECLIPSE开发环境。能理解、掌握ANDROID软件开发的基本知识。122设计内容评价逻辑的手动设定,而后会自动执行,SEVICE部分解决,实现AP与测试工具的种种通信与联系,自动评价用ADAPTER层。123实现方法在PC机上,利用ECLIPSE的开发软件,编写程序代码,并进行编译代码以及对代码进行调试,编译调试成功后,再利用ANDROID模拟器来初步的模拟运行。测试工具要实现的部分除了测试相关代码外,还有与AP进行调用的部分,主要是需要给AP提供相关的接口。2以下是测试工具的结构图,其中蓝色字体为需要改动或是添加的部分。TESTSOEASYSMARTPANEL评价逻辑手动设定,自动执行DUMMY部分SERVICEPANELAP部分自动化评价ADAPTER层第2章ANDROID系统开发综述21ANDROID系统介绍ANDROID是一个智能手机及便携设备操作系统,中文名安卓、安致。由GOOGLE在2007年推出,并迅速成为智能手机的主流操作系统。下图为ANDROID创始开发者合影ANDROID是一个冉冉升起的新系统,仅用2年时间就从零到市场巨擘。而NOKIA用了12年,APPLE用了5年截止到2010年第四季度,在全球智能手机市场安卓已经完成对于NOKIA及APPLE的超越,同时增长速度也是远远超过其他对手。以下两个表是ANDROID发展的相关数据调查211系统开放性在优势方面,ANDROID平台首先就是其开放性,开放的平台允ANDROID系统标志。许任何移动终端厂商加入到ANDROID联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开发性对于ANDROID的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机212挣脱运行商的束缚在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从IPHONE上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈。213丰富的硬件选择这一点还是与ANDROID平台的开放性相关,由于ANDROID的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容。好比你从诺基亚SYMBIAN风格手机一下改用苹果IPHONE,同时还可将SYMBIAN中优秀的软件带到IPHONE上使用、联系人等资料更是可以方便地转移。214不受任何限制的开发商ANDROID平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。为未来的软件行业做出非凡的成就。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给ANDROID难题之一。也是留给软件行业的,社会的难题。22开发环境介绍ECLIPSE是著名的跨平台的自由集成开发环境(IDE)。最初主要用来JAVA语言开发。ECLIPSE的本身只是一个框架平台,但是众多插件的支持使得ECLIPSE拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以ECLIPSE为框架开发自己的IDE。ECLIPSE最初是由IBM公司开发的替代商业软件VISUALAGEFORJAVA的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟ECLIPSE基金会(ECLIPSEFOUNDATION)管理。2003年,ECLIPSE30选择OSGI服务平台规范为运行时架构。2007年6月,稳定版33发布。2008年6月发布代号为GANYMEDE的34版。ECLIPSE的基础是富客户机平台(RICHCLIENTPLATFORM,即RCP)。RCP包括下列组件核心平台启动ECLIPSE,运行插件)OSGI(标准集束框架)SWT(可移植构件工具包)JFACE(文件缓冲,文本处理,文本编辑器)ECLIPSE工作台(即WORKBENCH,包含视图(VIEWS)、编辑器(EDITORS)、视角(PERSPECTIVES)、和向导(WIZARDS)ECLIPSE采用的技术是IBM公司开发的(SWT),这是一种基于JAVA的窗口组件,类似JAVA本身提供的AWT和SWING窗口组件;不过IBM声称SWT比其他JAVA窗口组件更有效率。ECLIPSE的用户界面还使用了GUI中间层JFACE,从而简化了基于SWT的应用程序的构建。ECLIPSE的插件机制是轻型软件组件化架构。在富客户机平台上,ECLIPSE使用插件来提供所有的附加功能,例如支持JAVA以外的其他语言。已有的分离的插件已经能够支持C/C(CDT)、PERL、RUBY,PYTHON、TELNET和数据库开发。插件架构能够支持将任意的扩展加入到现有环境中,例如配置管理,而决不仅仅限于支持各种编程语言。ECLIPSE的设计思想是一切皆插件。ECLIPSE核心很小,其它所有功能都以插件的形式附加于ECLIPSE核心之上。ECLIPSE基本内核包括图形APISWT/JFACE,JAVA开发环境插件JDT,插件开发环境PDE等。ECLIPSE由各种不同的计划组成。以下列出了部分计划。ECLIPSE计划本身包括ECLIPSE平台,ECLIPSE富客户端平台(RCP)和JAVA开发工具(JDT)。ECLIPSE测试和性能工具平台(TPTP)提供一个允许软件开发者构建诸如测试调试、概况分析、基准评测等测试和性能工具的平台。ECLIPSEWEB工具平台计划(WTP)用JAVA企业版WEB应用程序开发工具来扩展ECLIPSE平台。它由以下部分组成HTML、JAVASCRIPT、CSS、JSP、SQL、XML、DTD、XSD和WSDL的源代码编辑器;XSD和WSDL的图形界面编辑器;JAVA企业版的“项目性质”(PROJECTNATURE)、建构器(BUILDER)和模型(MODEL),与一个JAVA企业版的导航(NAVIGATOR);一个WEB服务(WEBSERVICE)向导和浏览器,还有一个WSI测试工具;最后是数据库访问查询的工具与模型。ECLIPSE商业智能和报表工具计划(BIRT)提供WEB应用程序(特别是基于JAVA企业版的)的报表开发工具。ECLIPSE可视化界面编辑器计划(VEP)一个ECLIPSE下创建图形用户界面代码生成器的框架。ECLIPSE建模框架(EMF)依据使用XMI描述的建模规格,生成结构化数据模型的工具和其他应用程序的代码。图形化编辑器框架(GEF)能让开发者采用一个现成的应用程序模型来轻松地创建。UML2ECLIPSE平台下的一个UML20元模型的实现,用以支持建模工具的开发。ASPECTJ一种针对JAVA的面向侧面语言扩展。ECLIPSE通讯框架(ECF)专注于在ECLIPSE平台上创建通讯应用程序的工作。ECLIPSE数据工具平台计划(DTP)ECLIPSE设备驱动软件开发计划(DSDP)C/C开发工具计划(CDT)努力为ECLIPSE平台提供一个全功能集成开发器。ECLIPSE平台COBOL集成开发环境子计划(COBOL)将构建一个ECLIPSE平台上的全功能COBOL集成开发环境。并行工具平台(PTP)将开发一个对并行计算机架构下的一组工具进行集成工具。嵌入式富客户端平台(ERCP)计划将ECLIPSE富客户端平台扩展到嵌入式设备上。这个平台主要是一个富客户端平台(RCP)组件子集的集合。它能让桌面环境下的应用程序模型能够大致同样地能运用在嵌入式设备上23开发语言介绍JAVA最初被命名为OAK,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,SUN放弃了该项计划。就在OAK几近失败之时,随着互联网的发展,SUN看到了OAK在计算机网络上的广阔应用前景,于是改造了OAK,以“JAVA”的名称正式发布。JAVA编程语言的风格十分接近C、C语言。JAVA是一个纯的面向对象的程序设计语言,它继承了C语言面向对象技术的核心,JAVA舍弃了C语言中容易引起错误的指针(以引用取代)、运算符重载(OPERATOROVERLOADING)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在JAVASE15版本中,JAVA又引入了泛型编程(GENERICPROGRAMMING)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。JAVA不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码BYTECODE,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了JAVA程序的运行效率。但在J2SE142发布后,JAVA的执行速度有了大幅提升。与传统程序不同,SUN公司在推出JAVA之际就将其作为一种开放的技术。全球数以万计的JAVA开发公司被要求所设计的JAVA软件必须相互兼容。“JAVA语言靠群体的力量而非公司的力量”是SUN公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。SUN公司对JAVA编程语言的解释是JAVA编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。JAVA平台是基于JAVA语言的平台。这样的平台目前非常流行,因此微软公司推出了与之竞争的NET平台以及模仿JAVA的C语言。第3章测试工具介绍31测试工具结构介绍ANDROID自动化测试目前可借鉴的经验不多,现在采取的方式就是通过JAVA代码对ACTIVITY和VIEW进行操作,目前已知的入口是INSTRUMENTATION类。INSTRUMENTATION与ACTIVITY均位于ANDROIDAPP包下,这个包内还有诸如ACTIVITYMANAGERNATIVE这种不对APP层开放的类,通过查看ANDROID源码发现ACTIVITY类中诸如STARTACTIVITYINTENTINTENT这样重要的方法都是通过INSTRUMENTATION实现,INSTRUMENTATION中也提供了一系列对ACTIVITY生命周期控制的方法。以INSTRUMENTATION为基础,ANDROIDSDK在JUNIT基础上进行了扩展,提供了ANDROIDTESTCASE类及系列子类,其中最重要的一个类是ACTIVITYINSTRUMENTATIONTESTCASE2基于INSTRUMENTATION的测试框架的工作原理SDK中的这张图说明的很清楚了研究ANDROID源码发现框架层中有很多对测试有帮助的类、方法都被加上了注解或是声明为PRIVATE的,无法从APP层访问。自然而然我们想到了JAVA的反射机制,JAVA反射允许我们访问这样的类和方法。在上面的基础上,国外有人开发出了ROBOT/“TARGET“_BLANK“ROBOTIUM工具,可以在有APP源码或APK的情况下进行自动化黑盒测试。但是ROBOTIUM目前的缺点也很明显,无法对WEBVIEW进行操作,这对大量使用WEBVIEW的淘宝ANDROID客户端来说无疑是很大的限制。而且ROBOTIUM提供的API是面向过程的,测试代码的可扩展性差。我们需要一个面向对象的,可对WEBVIEW进行操作的自动化测试框架,这就催生了TMTSTAOBAOMOBILETESTSTUDIO框架。TMTS立项时还试图着重解决另一个问题,就是INSTRUMENTATION框架下TESTAPP和APP运行在一个进程中,APPCRASH会导致TESTAPP一并CRASH。当时和士敦一起研究了INSTRUMENTATION、ACTIVITY的启动流程,甚至想去研究一下DALVIK是如何解析MANIFEST文件的,最后也没有想到好的方法,收获就是了解了ANDROID更底层一些的细节,这个问题现在先搁置了起来。从测试代码方面来看,ROBOTIUM中采用的是ACTIONMETHODVIEW,ARG的方式,TMTS中采用GETVIEWIDACTIONMETHODARG的方式,更加符合JAVA的编程习惯。TMTS测试代码的编写也就是分三步,找到VIEW,调用VIEW的相应的ACTION方法,断言。TMTS框架主要思想就是通过反射机制调用ANDROID框架层API拿到当前ACTIVITY的所有VIEW,在此基础上返回需要获得的VIEW对象,对获得的VIEW通过INSTRUMENTATION封装一些此VIEW常用的操作,最后返回,这就是TMTSVIEW及其子类。这种方式缺点也很明显,对每个从ANDROIDVIEW继承来的子类,如果其中有特殊的操作,就需要封装出一个对应的TMTSVIEW子类。还有一个缺点就是目前是通过VIEW在布局文件中声明的ID去寻找,这样测试人员在编写代码时需要对APP的源码非常熟悉,了解当前操作的VIEW的ID是多少,在传递ID参数时还有可能写错。之后我们对这个方式进行了一些改进,使用SDK自带的HIERARCHYVIEWER工具获得VIEW的ID对每个布局文件进行解析生成JAVA类,这个类中会提供方法返回布局文件中的所有带ID的VIEW,经过讨论,最后按VIEW子类型来对一个布局中的VIEW进行归类。BUG的定位离不开日志,因而日志系统也是一个测试框架重要的组成部分,ANDROID的LOG类中提供了一系列的静态方法可以在IDE中打印日志。在TMTS中,提供TMTSLOG类,除日志打印外可将日志内容实时保存至SD卡指定目录,在框架代码中的关键部位都加上了这样的日志用来保存异常时的调用栈信息,用户的测试代码中也可以加上对TMTSLOG的调用跟踪测试代码执行进度,TMTSLOG将为每个测试类保存一份这样的日志文件,同时包含用户的过程日志和框架异常日志,文件名以精确到毫秒的日期加以区分。项目做到这里远远没有结束,套用屈原的一句话就是路漫漫其修远兮。后面计划解决的问题有1跨进程测试,让TESTAPP和APP运行在两个不同的进程中,这是一个大坑。2稳定性问题,目前框架中有很多地方硬编码THREADSLEEP去等待一个VIEW加载完成,避免对空的VIEW进行操作,或者是对一个VIEW进行SET操作后,也需要等待一段时间让操作生效。希望能找到一种回调机制优雅的解决。而且ROBOTIUM提供的API是面向过程的,测试代码的可扩展性差。我们需要一个面向对象的,可对WEBVIEW进行操作的自动化测试框架,这就催生了TMTSTAOBAOMOBILETESTSTUDIO框架。TMTS立项时还试图着重解决另一个问题,就是INSTRUMENTATION框架下TESTAPP和APP运行在一个进程中,APPCRASH会导致TESTAPP一并CRASH。当时和士敦一起研究了INSTRUMENTATION、ACTIVITY的启动流程,甚至想去研究一下DALVIK是如何解析MANIFEST文件的,最后也没有想到好的方法,收获就是了解了ANDROID更底层一些的细节,这个问题现在先搁置了起来。从测试代码方面来看,ROBOTIUM中采用的是ACTIONMETHODVIEW,ARG的方式,TMTS中采用GETVIEWIDACTIONMETHODARG的方式,更加符合JAVA的编程习惯。TMTS测试代码的编写也就是分三步,找到VIEW,调用VIEW的相应的ACTION方法,断言。TMTS框架主要思想就是通过反射机制调用ANDROID框架层API拿到当前ACTIVITY的所有VIEW,在此基础上返回需要获得的VIEW对象,对获得的VIEW通过INSTRUMENTATION封装一些此VIEW常用的操作,最后返回,这就是TMTSVIEW及其子类。这种方式缺点也很明显,对每个从ANDROIDVIEW继承来的子类,如果其中有特殊的操作,就需要封装出一个对应的TMTSVIEW子类。项目做到这里远远没有结束,套用屈原的一句话就是路漫漫其修远兮。后面计划解决的问题有1跨进程测试让TESTAPP和APP运行在两个不同的进程中,这是一个大坑。2稳定性问题目前框架中有很多地方硬编码THREADSLEEP去等待一个VIEW加载完成,避免对空的VIEW进行操作,或者是对一个VIEW进行SET操作后,也需要等待一段时间让操作生效。希望能找到一种回调机制优雅的解决。3设法捕获TOAST消息后面可能会研究的方向,是通过非JAVA的方式来实现ANDROID自动化测试。ANDROID目前已经通过ASEANDROIDSCRIPTINGENVIRONMENT支持了多种脚本语言,如PHYTON,LUA,PERL等,限于目前的人力还没有时间来研究这一块,相信ASE会给ANDROID自动化开辟一片新天地。最后谈一点点感悟,老子曾经曰过“持而盈之,不如其已揣而锐之,不可长保。金玉满堂,莫之能守富贵而骄,自遗其咎。”和“重为轻根,静为躁君。”第一句话说有缺陷才是真正的完美,没有一个方案是真正完美的。第二句话说有时候看起来完美的方案,过段时间之后又不适用了,而且不适用的地方很可能就是当初觉得完美的地方,对于软件项目解决方案也是如此。32测试工具中SERVICE介绍321SERVICE概述由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序牌激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,合其能够长时间在后台运行,实现应用程序的特定功能,并能够处理事件或更新数据,ANDROID系统提供了(SERVICE)服务组件,它不直接与用户进行交互,却能够长期在后台运行。有很多情况需要使用SERVICE,典型的例子就是MP3播放器。SERVICE非常适用于无需用户干预,且需要长期运行的后台功能。SERVICE没有用户界面,有利于降低系统资源。而且SERVICE比ACTIVITY具有更高的优先级,因此在系统资源紧张的时候,SERVICE不会轻易被ANDROID系统终止。即使SERVICE被系统终止了,在系统资源恢复后SERVICE也将自动恢复运行状态,因此可以认为SERVICE是在系统中永久运行的组件。SERVICE除了实现后台服务功能,还可以用于进程间通信,解决两个不同ACTIVITY应用程序进程之间的调用和通信问题。SERVICE概览类结构图SERVICE生命周期三个生命周期函数ONCREATEONSTARTONDESTORY生命周期图322SERVICE启动启动SERVICE的两种方式STARTSERVICE和BINDSERVICE一、STARTSERVICE启动SERVICE示例1、先创建一个类继承于SERVICE然后重写ONBIND且这个方法必须实现,ONCREATE、ONSTART、ONDESTORY方法2、在ANDROIDMAINFESTXML中注册刚才写的这个SERVICEVIEWPLAINPRINT3、通过在ACTIVTY中启动SERVICESTARTSERVICEDEMOMYSERVICE继承于SERVICE类VIEWPLAINPRINTPACKAGECOMJIAHUISERVICEDEMOIMPORTANDROIDAPPSERVICEIMPORTANDROIDCONTENTINTENTIMPORTANDROIDOSIBINDERPUBLICCLASSMYSERVICEEXTENDSSERVICEOVERRIDEPUBLICIBINDERONBINDINTENTARG0/TODOAUTOGENERATEDMETHODSTUBRETURNNULLOVERRIDEPUBLICVOIDONCREATESYSTEMOUTPRINTLN“ONCREATE“SUPERONCREATEOVERRIDEPUBLICVOIDONDESTROYSYSTEMOUTPRINTLN“ONDESTORY“SUPERONDESTROYOVERRIDEPUBLICVOIDONSTARTINTENTINTENT,INTSTARTIDSYSTEMOUTPRINTLN“ONSTART“SUPERONSTARTINTENT,STARTIDMAINACTIVTYVIEWPLAINPRINTPACKAGECOMJIAHUISERVICEDEMOIMPORTANDROIDAPPACTIVITYIMPORTANDROIDCONTENTINTENTIMPORTANDROIDOSBUNDLEIMPORTANDROIDVIEWVIEWIMPORTANDROIDWIDGETBUTTONPUBLICCLASSMAINACTIVITYEXTENDSACTIVITYPUBLICVOIDONCREATEBUNDLESAVEDINSTANCESTATESUPERONCREATESAVEDINSTANCESTATESETCONTENTVIEWRLAYOUTMAINBUTTONBTNSTARTBUTTONFINDVIEWBYIDRIDBTNSTARTBUTTONBTNSTOPBUTTONFINDVIEWBYIDRIDBTNSTOPFINALINTENTSERVICENEWINTENTSERVICESETACTION“COMJIAHUIMYSERVICE“BTNSTARTSETONCLICKLISTENERNEWVIEWONCLICKLISTENEROVERRIDEPUBLICVOIDONCLICKVIEWV/启动SERVICEMAINACTIVITYTHISSTARTSERVICESERVICEBTNSTOPSETONCLICKLISTENERNEWVIEWONCLICKLISTENEROVERRIDEPUBLICVOIDONCLICKVIEWV/停止SERVICEMAINACTIVITYTHISSTOPSERVICESERVICESERVICE已创建则只会调用ONSTART方法,STOPSERVICE将调用ONDESTORY方法除了通过STARTSERVICE来启动SERVICE外我们还可以通过BINDSERVICE方法启动SERVICE,也正好我们可以来好好比较这两种方式的区别。2、BINDSERVICE方法启动SERVICE先看BINDSERIVCEINTENTSERVICE,SERVICECONNECTIONCONN,INTFLAGS函数参数说明SERVICE通过该参数也就是INTENT我们可以启动指定的SERVICECONN该参数是一个SERVICECONNECTION对象,这个对角用于监听访问者(也可以说成是客户端)与SERVICE之间的连接情况,当访问者与SERVICE连接成功时将回调SERVICECONNECTION对象的ONSERVICECONNECTEDCOMPONENTNAMENAME,IBINDERSERVICE方法;如果断开将回调ONSERVICEDISCONNECTEDCOMPONTNAMENAME方法FLAGS指定绑定时是否自动创建SERVICE。步骤1、新建一个类继承于SERVICE类,重写ONBIND、ONCREATE、ONUNBIND、ONDESTORY方法。再在这个类里声明一个IBINDER的子类对象用于提供于客户端,同时可以定义一些成员变量,客户端可以获取到这个成员变量属性2、在ANDROIDMAINFESTXML文件中注册这个SERVICE3、在ACTIVITY里通过BINDSERVICE绑定SERVICE示例代码PACKAGECOMJIAHUISERVICEDEMOIMPORTANDROIDAPPSERVICEIMPORTANDROIDCONTENTINTENTIMPORTANDROIDOSBINDERIMPORTANDROIDOSIBINDERPUBLICCLASSMYSERVICEEXTENDSSERVICEPRIVATEINTCOUNTPRIVATEBOOLEANQUITPRIVATEMYBINDERBINDERNEWMYBINDER/新建一个BINDER对象用于提供给客户端PUBLICCLASSMYBINDEREXTENDSBINDERPUBLICINTGETCOUNTRETURNCOUNTOVERRIDEPUBLICIBINDERONBINDINTENTINTENTSYSTEMOUTPRINTLN“ONBIND“/返回给客户端一个BINDER对象RETURNBINDEROVERRIDEPUBLICVOIDONCREATESYSTEMOUTPRINTLN“ONCREATE“/启动一条线程修改成员变量属性NEWTHREADOVERRIDEPUBLICVOIDRUNWHILEQUITTRYTHREADSLEEP1000CATCHEXCEPTIONECOUNTSTARTOVERRIDEPUBLICVOIDONDESTROYTHISQUITTRUESYSTEMOUTPRINTLN“ONDESTORY“SUPERONDESTROYOVERRIDEPUBLICBOOLEANONUNBINDINTENTINTENTSYSTEMOUTPRINTLN“ONUNBIND“RETURNSUPERONUNBINDINTENTMAINACTIVTYPACKAGECOMJIAHUISERVICEDEMOIMPORTANDROIDAPPACTIVITYIMPORTANDROIDCONTENTCOMPONENTNAMEIMPORTANDROIDCONTENTINTENTIMPORTANDROIDCONTENTSERVICECONNECTIONIMPORTANDROIDOSBUNDLEIMPORTANDROIDOSIBINDERIMPORTANDROIDVIEWVIEWIMPORTANDROIDWIDGETBUTTONIMPORTANDROIDWIDGETTOASTPUBLICCLASSMAINACTIVITYEXTENDSACTIVITYPRIVATEBUTTONBTNBINDPRIVATEBUTTONBTNUNBINDPRIVATEBUTTONBTNGETDATAMYSERVICEMYBINDERBINDER/定义一个SERVICECONNECTION对象PRIVATESERVICECONNECTIONCONNNEWSERVICECONNECTION/当客户端与SERVICE断开连接时OVERRIDEPUBLICVOIDONSERVICEDISCONNECTEDCOMPONENTNAMENAMESYSTEMOUTPRINTLN“ONSERVICEDISCONNECTED“/当客户端与SERVICE建立连接时OVERRIDEPUBLICVOIDONSERVICECONNECTEDCOMPONENTNAMENAME,IBINDERSERVICESYSTEMOUTPRINTLN“ONSERVICECONNECTED“BINDERMYSERVICEMYBINDERSERVICEPUBLICVOIDONCREATEBUNDLESAVEDINSTANCESTATESUPERONCREATESAVEDINSTANCESTATESETCONTENTVIEWRLAYOUTMAINBTNBINDBUTTONFINDVIEWBYIDRIDBTNBINDBTNUNBINDBUTTONFINDVIEWBYIDRIDBTNUNBINDBTNGETDATABUTTONFINDVIEWBYIDRIDBTNGETDATAFINALINTENTINTENTNEWINTENTINTENTSETACTION“COMJIAHUIMYSERVICE“BTNBINDSETONCLICKLISTENERNEWVIEWONCLICKLISTENEROVERRIDEPUBLICVOIDONCLICKVIEWV/绑定SERVICEBINDSERVICEINTENT,CONN,BIND_AUTO_CREATEBTNUNBINDSETONCLICKLISTENERNEWVIEWONCLICKLISTENEROVERRIDEPUBLICVOIDONCLICKVIEWV/解除绑定UNBINDSERVICECONN/获取数据BTNGETDATASETONCLICKLISTENERNEWVIEWONCLICKLISTENEROVERRIDEPUBLICVOIDONCLICKVIEWV/获取数据TOASTMAKETEXTMAINACTIVITYTHIS,“SERVICE的COUNT值为“BINDERGETCOUNT,TOASTLENGTH_LONGSHOW点击”获取SERVICE里的数据”按钮点击“UNBINDSERVICE”按钮所以也可以通过上图知道BINDSERVICE的生命周期BINDSERVICE会经历ONCREATEONBINDONUNBINDONDESTORY如何去理解这种通信方式我的理解是BINDSERVICE这一方我们可以看作是客户端,然后客户端调用BINDSERVICE方法去绑定一个SERVICE,SERVICE给我们返回一个BINDER对象用于客户端与SERIVCE通信,而这个BINDER对象我们可以在客户端的SERVICECONNECTION对象里的一个ONSERVICECONNECTED方法取到这个BINDER对象,这样我们就也能取到SERVICE里的数据了所以总结BINDSERVICE与STARTSERVICE的区别1生命周期STARTSERVICE方式启动,SERVICE是通过接受INTENT并且会经历ONCREATE和ONSTART当用户在发出意图使之销毁时会经历ONDESTROY,而BINDSERVICE方式启动,与ACTIVITY绑定的时候,会经历ONCREATE和ONBIND,而当ACTIVITY被销毁的时候,SERVICE会先调用ONUNBIND然后是ONDESTROY。2控制方式前者的控制方式需要使用固定的方法,对SERVICE进行单一的操作。而后者由于与ACTIVITY绑定,不用考虑其生命周期问题,并且从发送INTENT的被动操作,变为可以主动对SERVICE对象进行操作,我们甚至可以建立一个HANDLER类,对SERVICE进行相关的操作。大大加强了SERVICE的灵活性、可操作性。总结对于简单的应用STARTSERVICE启动方式能带来更少的代码,简单的操作。对于复杂的应用BINDSERVICE方式,虽然带来的更多的编码,但同时也带来了更好的可操作性,使其使用起来更方便。第4章总体设计41概述411程序说明本项目主要通过ANDROID自动化测试工具对AP进行手动设定,自动执行的测试工作。PC机上运用ECLIPSE编辑程序代码以及对程序代码进行调试,利用ANDROID模拟器进行程序的测试。编译成功后即可在ANDROID模拟器上运行程序,进行TESTCASE的压入,手动设定,进而执行程序,输出结果。412操作流程运行程序,在TEST程序中按下SELECTFILE键,程序获取AP信息,获取之后自动化测试开始执行,测试结束,测试结果在测试画面显示。整体处理流程示意图图41操作流程流程示意图压下这SELECTFILE测试的结果在TESTSOEASY画面显示STARTTEST键按下,AP是COPY项自动测试开始执行42构成项目中模块为TESTSOEASY及SMARTPANEL两部分,其中主要的类为COMMONACTIVITY,APPLICATIONSERVICEPROXY,AUTOTESTTOOLACTIVITY类与APPLICATIONSERVICE类421类一览类名功能COMMONACTIVITY需要测试的APAPPLICATIONSERVICEPROXY发送消息数据AUTOTESTTOOLACTIVITY自动化测试部分APPLICATIONSERVICE连携AP与测试部分,启动测试表41类一览第5章设计思想51设计思想概述一个声明解释一些对ANDROID开发者有用的技术思想和观点。学习如何在一个新的API上创建应用的过程都是类似的,即便平台本身存在很大差异性。通常,要明白如何使用API来做你想做的事情然后,注意平台的细微差别。正确构建应用通常需要花费更长的时间,并且通常意味着犯错误并从错误中学习。那不是一个高效率的过程。成功地应用会提供出色的终端用户体验。尽管ANDROID团队已经构造了一个强健的内核系统,但用户更多的体验是来自于与你应用的交互。出色的用户体验有三个特征速度快响应及时以及无缝。当然从早期计算机到现在的计算机,每个平台都曾不只一次地引用过这三个特征。然而,每个平台实现它们的方法不同下面的信息解释了你的应用如何能够在ANDROID上实现这些特征。速度快ANDROID应用应该是快速的。更准确的说他应该是高效的。现在,在计算界中有一个趋势,该趋势假设摩尔定律可以最终解决所有问题。然而对于嵌入式应用而言,MOOR定律会变得有些复杂。摩尔定律没有如同应用于桌面和服务器应用一样真正地应用于移动设备。摩尔定律实际上是关于晶体管密度的定律,它是说每隔一段时间后,你可以在给定的芯片上部署更多电路。对于转面和服务器应用而言,由于性能的提高,这意味着你可以在一块差不多大小的芯片中得到更高的速度。对于类似手机这样的嵌入式应用而言,摩尔定律通常被用于造出更小的芯片。在嵌入式界的趋势是利用这种晶体管密度的增加来造出更小、更节能的芯片,从而使手机更小,电池待机时间更长。象手机这样的嵌入式设备在不断增加,速度远远要慢于桌面系统。对于嵌入式设备而言,摩尔定律意味着更多特性和更好的电池寿命而速度则是次要因素。这就是为什么需要写高效的代码你不能假设手机与桌面系统和服务器一样提速。一般来讲,写快速的代码意味着要是内存分配最小化,代码紧凑,并且避免可能影响性能的语言和编程习惯。在面向对象的术语中,很多类似情况都是发生在方法级,关于实际的代码顺序,循环等。关于如何写高效的ANDROID代码的文章将会给你提供写快速、高效ANDROID代码的所有信息。编写高效的ANDROID代码,虽然如此说,但似乎并没有什么好的办法ANDROID设备是嵌入式设备。现代的手持设备,与其说是电话,更像一台拿在手中的电脑。但是,即使是“最快”的手持设备,其性能也赶不上一台普通的台式电脑。这就是为什么我们在书写ANDROID应用程序的时候要格外关注效率。这些设备并没有那么快,并且受电池电量的制约。这意味着,设备没有更多的能力,我们必须把程序写的尽量有效。对于占用资源的系统,有两条基本原则不要做不必要的事不要分配不必要的内存。52设计原则所有设计的内容都遵照这两个原则。有些人可能马上会跳出来,把本节的大部分内容归于“草率的优化”XING参见THEROOTOFALLEVIL,不可否认微优化MICROOPTIMIZATION。XING代码优化,相对于结构优化的确会带来很多问题,诸如无法使用更有效的数据结构和算法。但是在手持设备上,你别无选择。假如你认为ANDROID虚拟机的性能与台式机相当,你的程序很有可能一开始就占用了系统的全部内存XING内存很小,这会让你的程序慢得像蜗牛一样,更遑论做其他的操作了。ANDROID的成功依赖于你的程序提供的用户体验。而这种用户体验,部分依赖于你的程序是响应快速而灵活的,还是响应缓慢而僵化的。因为所有的程序都运行在同一个设备之上,都在一起,这就如果在同一条路上行驶的汽车。而这篇文档就相当于你在取得驾照之前必须要学习的交通规则。如果大家都按照这些规则去做,驾驶就会很顺畅,但是如果你不这样做,你可能会车毁人亡。这就是为什么这些原则十分重要。当我们开门见山、直击主题之前,还必须要提醒大家一点不管VM是否支持实时JIT编译器XING它允许实时地将JAVA解释型程序自动编译成本机机器语言,以使程序执行的速度更快。有些JVM包含JIT编译器。,下面提到的这些原则都是成立的。假如我们有目标完全相同的两个方法,在解释执行时FOO比BAR快,那么编译之后,FOO依然会比BAR快。所以不要寄希望于编译器可以拯救你的程序。521原则一世界上没有免费的对象。虽然GC为每个线程都建立了临时对象池,可以使创建对象的代价变得小一些,但是分配内存永远都比不分配内存的代价大。如果你在用户界面循环中分配对象内存,就会引发周期性的垃圾回收,用户就会觉得界面像打嗝一样一顿一顿的。所以,除非必要,应尽量避免尽力对象的实例。下面的例子将帮助你理解这条原则当你从用户输入的数据中截取一段字符串时,尽量使用SUBSTRING函数取得原始数据的一个子串,而不是为子串另外建立一份拷贝。这样你就有一个新的STRING对象,它与原始数据共享一个CHAR数组。如果你有一个函数返回一个STRING对象,而你确切的知道这个字符串会被附加到一个STRINGBUFFER,那么,请改变这个函数的参数和实现方式,直接把结果附加到STRINGBUFFER中,而不要再建立一个短命的临时对象。一个更极端的例子是,把多维数组分成多个一维数组。INT数组比INTEGER数组好,这也概括了一个基本事实,两个平行的INT数组比INT,INT对象数组性能要好很多。同理,这试用于所有基本类型的组合。如果你想用一种容器存储FOO,BAR元组,尝试使用两个单独的FOO数组和BAR数组,一定比FOO,BAR数组效率更高。也有例外的情况,就是当你建立一个API,让别人调用它的时候。这时候你要注重对API借口的设计而牺牲一点儿速度。当然在API的内部,你仍要尽可能的提高代码的效率总体来说,就是避免创建短命的临时对象。减少对象的创建就能减少垃圾收集,进而减少对用户体验的影响。当你在处理字串的时候,不要吝惜使用STRINGINDEXOF,STRINGLASTINDEXOF等特殊实现的方法SPECIALTYMETHODS。这些方法都是使用C/C实现的,比起JAVA循环快10到100倍。假设你有一个HASHMAP对象,你可以将它声明为HASHMAP或者MAPMAPMYMAP1NEWHASHMAPHASHMAPMYMAP2NEWHASHMAP哪个更好

温馨提示

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

评论

0/150

提交评论