




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、毕业论文(设计)面向android系统的测试工具学 生 姓 名: 于冬敏 指导教师: 陈高泉 讲师 专业名称: 电子信息工程 所在学院: 信息工程学院 2012年06月目 录摘要iabstractii第1章 绪论11.1. 课题背景11.2. 课题说明1第2章 android开发系统综述32.1. android系统介绍32.2. 开发环境介绍52.3. 开发语言介绍7第3章 测试工具介绍93.1. 测试工具结构介绍93.2. 测试工具中service介绍12第4章 总体设计224.1. 概述224.2. 构成23第5章 设计思想24 5.1. 设计思想概述245.2. 设计原则25第6章 结
2、论.35致谢36参考文献37附录.38摘要 基于 android 的自动化测试的设计与实现以android 客户端的测试为研究内容,分析了 android 自动化测试框架及其层次关系,尝试在现有测试方法的 基 础 上 进 行 测 试 手 段 的 优 化 和 创 新 。 研 究 了 基 于 junit 和 instrumentaion 的 android 自 动 化 框 架 的 实 现 技 术 ,并 利 用 hudson 进行集成,实现 android 的自动化测试。产品的开发实践表明, 这种自动化测试方法效率高、用户体验好, 对于 android 的自动化测试研究具有一定参考价值。androi
3、d应用程序使用java做为开发语言,把编译后的java代码连同其它应用程序需要的数据和资源文件一起打包到一个android包文件中,这个文件使用.apk做为扩展名,它是分发应用程序并安装到移动设备的媒介,用户只需下载并安装此文件到他们的设备。单一.apk文件中的所有代码被认为是一个应用程序。关键词:关键词:测试自动化;android;设计 abstract this paper focuses on testing of android clients. the authors analyze the android automated testing framework and its hi
4、erarchy. the implementation is based on two automated testing framework of android platform: junit and instrumentation. the purpose of this article is to propose an optimized test method. making use of the continuous integration features of hudson, the real sense of automated testing can be achieved
5、. it shows that this automated testing method improves efficiency and enhances user experience in some extent. this research will have values for automated testing of android.android applications are written in the java programming language. the android sdk tools compile the codealong with any data
6、and resource filesinto an android package, an archive file with an .apk suffix. all the code in a single .apk file is considered to be one application and is the file that android-powered devices use to install the application.key words:automated testing;android;mobile phone;design第1章 绪论1.1. 课题背景作为2
7、0世纪最伟大的发明之一,计算机也进入了后pc时代。不知不觉中,形形色色的数字产品成为主要的信息处理工具、并且逐步形成一个充满商机的巨大产业。随着后pc时代的到来,人们开始接触全新的计算机软件,计算及操作系统。android系统的开源,为计算机产品的生产商们又一次创造了商机,越来越多的人开始知道android,认识android,开始使用android,这样也就使得android产品走进了一个美好的时代,而android产品程序的测试也被生产商们开始慢慢的拿到了日程上,这关系到他们生产过程中能否更多的节约时间金钱。此次设计通过对android系统测试工具的开发,可以掌握android系统软件开发
8、的基本技术、例如android的用户界面设计,android进程间的通信,以及我们采用的java语言等。既可以用于国内的软件开发、又可在将来的实际工作中的对日产品开发中有所助益。1.2. 课题说明1.2.1. 设计要求android模拟器,java语言,eclipse开发环境。能理解、掌握android软件开发的基本知识。1.2.2. 设计内容评价逻辑的手动设定,而后会自动执行,sevice部分解决,实现ap与测试工具的种种通信与联系,自动评价用adapter层。1.2.3. 实现方法在pc机上,利用eclipse的开发软件,编写程序代码,并进行编译代码以及对代码进行调试,编译调试成功后,再利
9、用android模拟器来初步的模拟运行。测试工具要实现的部分除了测试相关代码外,还有与ap进行调用的部分,主要是需要给ap提供相关的接口。(2)以下是测试工具的结构图,其中蓝色字体为需要改动或是添加的部分。testsoeasy smartpanel评价逻辑手动设定,自动执行dummy部分panelap部分自动化评价adapter层 service第2章 android系统开发综述2.1. android系统介绍android是一个智能手机及便携设备操作系统,中文名安卓、安致。由google在2007年推出,并迅速成为智能手机的主流操作系统。下图为android创始开发者合影: android是
10、一个冉冉升起的新系统,仅用2年时间就从零到市场巨擘。而nokia用了12年,apple用了5年.截止到2010年第四季度,在全球智能手机市场安卓已经完成对于nokia及apple的超越,同时增长速度也是远远超过其他对手。 以下两个表是android发展的相关数据调查:2.1.1. 系统开放性在优势方面,android平台首先就是其开放性,开放的平台允 android系统标志。许任何移动终端厂商加入到android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开发性对于android的发展而言,有利于积累人气,这里的人气包括消费者和厂商
11、,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机2.1.2. 挣脱运行商的束缚 在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从iphone上市,用户可以更加方便地连接网络,运营商的制约减少。随着edge、hsdpa这些2g至3g移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈。2.1.3丰富的硬件选择这一点还是与android平台的开放性相关,由于android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上
12、的差异和特色,却不会影响到数据同步、甚至软件的兼容。好比你从诺基亚symbian风格手机一下改用苹果iphone,同时还可将symbian中优秀的软件带到iphone上使用、联系人等资料更是可以方便地转移。2.1.4不受任何限制的开发商android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。为未来的软件行业做出非凡的成就。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给android难题之一。也是留给软件行业的,社会的难题。2.2. 开发环境介绍 eclipse是著名的跨平台的自由集成开发环境(ide
13、)。最初主要用来java语言开发。 eclipse的本身只是一个框架平台,但是众多插件的支持使得eclipse拥有其他功能相对固定的ide软件很难具有的灵活性。许多软件开发商以eclipse为框架开发自己的ide。 eclipse最初是由ibm公司开发的替代商业软件visual age for java的下一代ide开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟eclipse基金会(eclipse foundation)管理。 2003年,eclipse 3.0选择osgi服务平台规范为运行时架构。 2007年6月,稳定版3.3发布。2008年6月发布代号为ganyme
14、de的3.4版。eclipse的基础是富客户机平台(rich client platform, 即rcp)。rcp包括下列组件:核心平台(启动eclipse,运行插件)osgi(标准集束框架)swt(可移植构件工具包)jface(文件缓冲,文本处理,文本编辑器)eclipse工作台(即workbench ,包含视图(views)、编辑器(editors)、视角(perspectives)、和向导(wizards) eclipse采用的技术是ibm公司开发的(swt),这是一种基于java的窗口组件,类似java本身提供的awt和swing窗口组件;不过ibm声称swt比其他java窗口组件更有
15、效率。eclipse的用户界面还使用了gui中间层jface,从而简化了基于swt的应用程序的构建。 eclipse的插件机制是轻型软件组件化架构。在富客户机平台上,eclipse使用插件来提供所有的附加功能,例如支持java以外的其他语 言。 已有的分离的插件已经能够支持c/c+(cdt)、perl、ruby,python、telnet和数据库开发。插件架构能够支持将任意的扩展加入到 现有环境中,例如配置管理,而决不仅仅限于支持各种编程语言。eclipse的设计思想是:一切皆插件。eclipse核心很小,其它所有功能都以插件的形式附加于eclipse核心之上。eclipse基本内核包括:图形
16、api (swt/jface), java开发环境插件(jdt ),插件开发环境(pde)等。eclipse由各种不同的计划组成。以下列出了部分计划。eclipse计划:本身包括eclipse平台,eclipse富客户端平台(rcp)和java开发工具(jdt)。eclipse测试和性能工具平台(tptp):提供一个允许软件开发者构建诸如测试调试、概况分析、基准评测等测试和性能工具的平台。eclipse web工具平台计划 (wtp):用java企业版web应用程序开发工具来扩展eclipse平台。它由以下部分组成:html、javascript、css、jsp、sql、xml、dtd、xsd
17、和wsdl的 源代码编辑器;xsd和wsdl的图形界面编辑器;java企业版的“项目性质”(project nature)、建构器(builder)和模型(model),与一个java企业版的导航(navigator);一个web服务(web service)向导和浏览器,还有一个ws-i测试工具;最后是数据库访问查询的工具与模型。eclipse商业智能和报表工具计划(birt):提供web应用程序(特别是基于java企业版的)的报表开发工具。eclipse可视化界面编辑器计划(vep):一个eclipse下创建图形用户界面代码生成器的框架。eclipse建模框架(emf):依据使用xmi描述
18、的建模规格,生成结构化数据模型的工 具和其他应用程序的代码。图形化编辑器框架(gef):能让开发者采用一个现成的应用程序模型来轻松地创建。uml2:eclipse平台下的一个uml 2.0元模型的实现,用以支持建模工具的开发。aspectj:一种针对java的面向侧面语言扩展。eclipse通讯框架(ecf):专注于在eclipse平台上创建通讯应用程序的工作。eclipse数据工具平台计划(dtp)eclipse设备驱动软件开发计划(dsdp)c/c+开发工具计划(cdt):努力为eclipse平台提供一个全功能集成开发器。eclipse平台cobol集成开发环境子计划(cobol):将构建
19、一个eclipse平台上的全功能cobol集成开发环境。并行工具平台(ptp):将开发一个对并行计算机架构下的一组工具进行集成工具。 嵌入式富客户端平台(ercp):计划将eclipse富客户端平台扩展到嵌入式设备上。这个平台主要是一个富客户端平台(rcp)组件子集的集合。它能让桌面环境下的应用程序模型能够大致同样地能运用在嵌入式设备上2.3. 开发语言介绍 java最初被命名为oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,sun放弃了该项计划。就在oak几近失败之时,随着互联网的发展
20、,sun看到了oak在计算机网络上的广阔应用前景,于是改造了oak,以“java”的名称正式发布。 java 编程语言的风格十分接近c、c+语言。java是一个纯的面向对象的程序设计语言,它继承了 c+ 语言面向对象技术的核心,java舍弃了c +语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 java se 1.5 版本中,java 又引入了泛型编程(generic programming)、类型安全的枚举、不定长参
21、数和自动装/拆箱等语言特性。 java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了 java 程序的运行效率。但在 j2se 1.4.2 发布后,java 的执行速度有了大幅提升。 与传统程序不同,sun 公司在推出 java 之际就将其作为一种开放的技术。全球数以万计的 java 开发公司被要求所设计的 java 软件必须相互兼容。“java 语言靠群体的力量而非公司的力
22、量”是 sun 公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。 sun 公司对 java 编程语言的解释是:java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。 java 平台是基于 java 语言的平台。这样的平台目前非常流行,因此微软公司推出了与之竞争的.net平台以及模仿 java 的 c#语言。 第3章 测试工具介绍3.1. 测试工具结构介绍android自动化测试目前可借鉴的经验不多,现在采取的方式就是通过java代码对activity和view进行操作,目前已知的入口是i
23、nstrumentation类。 instrumentation与activity均位于android.app包下,这个包内还有诸如activitymanagernative这种不对app层开放的类,通过查看android源码发现activity类中诸如startactivity(intent intent)这样重要的方法都是通过instrumentation实现,instrumentation中也提供了一系列对activity生命周期控制的方法。以instrumentation为基础,android sdk在junit基础上进行了扩展,提供了androidtestcase类及系列子类,其中最
24、重要的一个类是activityinstrumentationtestcase2基于instrumentation的测试框架的工作原理sdk中的这张图说明的很清楚了:研究android源码发现框架层中有很多对测试有帮助的类、方法都被加上了注解或是声明为private的,无法从app层访问。自然而然我们想到了java的反射机制,java反射允许我们访问这样的类和方法。 在上面的基础上,国外有人开发出了robot/ target=_blank robotium工具,可以在有app源码或apk的情况下进行自动化黑盒测试。 但是robotium目前的缺点也很明显,无法对webview进行操作,这对大量使
25、用webview的淘宝android客户端来说无疑是很大的限制。 而且robotium提供的api是面向过程的,测试代码的可扩展性差。 我们需要一个面向对象的,可对webview进行操作的自动化测试框架,这就催生了tmts(taobao mobile test studio)框架。 tmts立项时还试图着重解决另一个问题,就是instrumentation框架下testapp和app运行在一个进程中 ,app crash会导致testapp一并crash。当时和士敦一起研究了instrumentation、activity的启动流程,甚至想去研究一下dalvik是如何解析manifest文件的
26、,最后也没有想到好的方法,收获就是了解了android更底层一些的细节,这个问题现在先搁置了起来。 从测试代码方面来看, robotium中采用的是actionmethod(view, arg)的方式,tmts中采用getview(id).actionmethod(arg)的方式,更加符合java的编程习惯。tmts测试代码的编写也就是分三步,找到view,调用view的相应的action方法,断言。 tmts框架主要思想就是通过反射机制调用android框架层api拿到当前activity的所有view,在此基础上返回需要获得的view对象,对获得的view通过instrumentation
27、封装一些此view常用的操作,最后返回,这就是tmtsview及其子类。 这种方式缺点也很明显,对每个从android.view继承来的子类,如果其中有特殊的操作,就需要封装出一个对应的tmtsview子类。 还有一个缺点就是目前是通过view在布局文件中声明的id去寻找,这样测试人员在编写代码时需要对app的源码非常熟悉,了解当前操作的view的id是多少,在传递id参数时还有可能写错。之后我们对这个方式进行了一些改进,使用sdk自带的hierarchyviewer工具获得view的id;对每个布局文件进行解析生成java类,这个类中会提供方法返回布局文件中的所有带id的view,经过讨论,
28、最后按view子类型来对一个布局中的view进行归类。 bug的定位离不开日志,因而日志系统也是一个测试框架重要的组成部分,android的log类中提供了一系列的静态方法可以在ide中打印日志。在tmts中,提供tmtslog类,除日志打印外可将日志内容实时保存至sd卡指定目录,在框架代码中的关键部位都加上了这样的日志用来保存异常时的调用栈信息,用户的测试代码中也可以加上对tmtslog的调用跟踪测试代码执行进度,tmtslog将为每个测试类保存一份这样的日志文件,同时包含用户的过程日志和框架异常日志,文件名以精确到毫秒的日期加以区分。 项目做到这里远远没有结束,套用屈原的一句话就是路漫漫其
29、修远兮。 后面计划解决的问题有: 1.跨进程测试,让testapp和app运行在两个不同的进程中,这是一个大坑。 2.稳定性问题,目前框架中有很多地方硬编码thread.sleep()去等待一个view加载完成,避免对空的view进行操作,或者是对一个view进行set操作后,也需要等待一段时间让操作生效。希望能找到一种回调机制优雅的解决。 而且robotium提供的api是面向过程的,测试代码的可扩展性差。 我们需要一个面向对象的,可对webview进行操作的自动化测试框架,这就催生了tmts(taobao mobile test studio)框架。 tmts立项时还试图着重解决另一个问题
30、,就是instrumentation框架下testapp和app运行在一个进程中 ,app crash会导致testapp一并crash。当时和士敦一起研究了instrumentation、activity的启动流程,甚至想去研究一下dalvik是如何解析manifest文件的,最后也没有想到好的方法,收获就是了解了android更底层一些的细节,这个问题现在先搁置了起来。 从测试代码方面来看, robotium中采用的是actionmethod(view, arg)的方式,tmts中采用getview(id).actionmethod(arg)的方式,更加符合java的编程习惯。tmts测试
31、代码的编写也就是分三步,找到view,调用view的相应的action方法,断言。 tmts框架主要思想就是通过反射机制调用android框架层api拿到当前activity的所有view,在此基础上返回需要获得的view对象,对获得的view通过instrumentation封装一些此view常用的操作,最后返回,这就是tmtsview及其子类。 这种方式缺点也很明显,对每个从android.view继承来的子类,如果其中有特殊的操作,就需要封装出一个对应的tmtsview子类。 项目做到这里远远没有结束,套用屈原的一句话就是路漫漫其修远兮。后面计划解决的问题有: 1. 跨进程测试让test
32、app和app运行在两个不同的进程中,这是一个大坑。 2. 稳定性问题目前框架中有很多地方硬编码thread.sleep()去等待一个view加载完成,避免对空的view进行操作,或者是对一个view进行set操作后,也需要等待一段时间让操作生效。希望能找到一种回调机制优雅的解决。 3.设法捕获toast消息 后面可能会研究的方向,是通过非java的方式来实现android自动化测试。android目前已经通过ase(android scripting environment)支持了多种脚本语言,如phyton,lua,perl等,限于目前的人力还没有时间来研究这一块,相信ase会给andro
33、id自动化开辟一片新天地。 最后谈一点点感悟,老子曾经曰过:“持而盈之,不如其已;揣而锐之,不可长保。金玉满堂,莫之能守;富贵而骄,自遗其咎。”和“重为轻根,静为躁君。”第一句话说有缺陷才是真正的完美,没有一个方案是真正完美的。第二句话说有时候看起来完美的方案,过段时间之后又不适用了,而且不适用的地方很可能就是当初觉得完美的地方,对于软件项目解决方案也是如此。 3.2. 测试工具中service介绍3.2.1. service概述 由于手机屏幕的限制,通常情况下在同一时刻仅有一个应用程序牌激活状态,并能够显示在手机屏幕上,因此,应用程序需要一种机制,在没有用户界面的情况下,合其能够长时间在后台
34、运行,实现应用程序的特定功能,并能够处理事件或更新数据,android系统提供了(service)服务组件,它不直接与用户进行交互,却能够长期在后台运行。有很多情况需要使用service,典型的例子就是:mp3播放器。service非常适用于无需用户干预,且需要长期运行的后台功能。service没有用户界面,有利于降低系统资源。而且service比activity具有更高的优先级,因此在系统资源紧张的时候,service不会轻易被android系统终止。即使service被系统终止了,在系统资源恢复后service也将自动恢复运行状态,因此可以认为service是在系统中永久运行的组件。ser
35、vice除了实现后台服务功能,还可以用于进程间通信,解决两个不同activity应用程序进程之间的调用和通信问题。service概览:类结构图:service生命周期:三个生命周期函数:oncreate()onstart()ondestory生命周期图:3.2.2. service启动启动service的两种方式:startservice 和bindservice一、startservice启动service示例:1、 先创建一个类继承于service然后重写onbind()且这个方法必须实现,oncreate()、onstart()、ondestory()方法2、 在androidmainf
36、est.xml中注册刚才写的这个serviceview plainprint?3、 通过在activty中启动servicestartservicedemo:myservice继承于service类view plainprint?package com.jiahui.servicedemo;import android.app.service;import android.content.intent;import android.os.ibinder;public class myservice extends service overridepublic ibinder onbind(in
37、tent arg0) / todo auto-generated method stubreturn null;overridepublic void oncreate() system.out.println(-oncreate-);super.oncreate();overridepublic void ondestroy() system.out.println(-ondestory-);super.ondestroy();overridepublic void onstart(intent intent, int startid) system.out.println(-onstart
38、-);super.onstart(intent, startid);mainactivty:view plainprint?package com.jiahui.servicedemo;import android.app.activity;import android.content.intent;import android.os.bundle;import android.view.view;import android.widget.button;public class mainactivity extends activity public void oncreate(bundle
39、 savedinstancestate) super.oncreate(savedinstancestate);setcontentview(r.layout.main);button btnstart = (button) findviewbyid(r.id.btnstart);button btnstop = (button) findviewbyid(r.id.btnstop);final intent service = new intent();service.setaction(com.jiahui.myservice);btnstart.setonclicklistener(ne
40、w view.onclicklistener() overridepublic void onclick(view v) / 启动servicemainactivity.this.startservice(service););btnstop.setonclicklistener(new view.onclicklistener() overridepublic void onclick(view v) / 停止servicemainactivity.this.stopservice(service);); service已创建则只会调用onstart()方法,stopservice将调用on
41、destory()方法除了通过startservice来启动service外我们还可以通过bindservice()方法启动service,也正好我们可以来好好比较这两种方式的区别。2、 bindservice方法启动service 先看bindserivce(intent service,serviceconnection conn,int flags)函数参数说明: service:通过该参数也就是intent我们可以启动指定的service conn:该参数是一个serviceconnection对象,这个对角用于监听访问者(也可以说成是客户端)与service之间的连接情况,当访问者与
42、service连接成功时将回调serviceconnection对象的onserviceconnected(componentname name,ibinder service)方法;如果断开将回调onservicedisconnected(compontname name)方法 flags:指定绑定时是否自动创建service。步骤: 1、 新建一个类继承于service类,重写onbind()、oncreate()、onunbind()、ondestory()方法。再在这个类里声明一个ibinder的子类对象用于提供于客户端,同时可以定义一些成员变量,客户端可以获取到这个成员变量属性 2、
43、 在androidmainfest.xml文件中注册这个service 3、 在activity里通过bindservice绑定service示例代码:package com.jiahui.servicedemo;import android.app.service;import android.content.intent;import android.os.binder;import android.os.ibinder;public class myservice extends service private int count;private boolean quit;private
44、 mybinder binder = new mybinder();/ 新建一个binder对象用于提供给客户端public class mybinder extends binder public int getcount() return count;overridepublic ibinder onbind(intent intent) system.out.println(-onbind-);/ 返回给客户端一个binder对象return binder;overridepublic void oncreate() system.out.println(-oncreate-);/ 启动
45、一条线程修改成员变量属性new thread() overridepublic void run() while (!quit) try thread.sleep(1000); catch (exception e) count+;.start();overridepublic void ondestroy() this.quit = true;system.out.println(-ondestory-);super.ondestroy();overridepublic boolean onunbind(intent intent) system.out.println(-onunbind-
46、);return super.onunbind(intent);mainactivtypackage com.jiahui.servicedemo;import android.app.activity;import android.content.componentname;import android.content.intent;import android.content.serviceconnection;import android.os.bundle;import android.os.ibinder;import android.view.view;import android
47、.widget.button;import android.widget.toast;public class mainactivity extends activity private button btnbind;private button btnunbind;private button btngetdata;myservice.mybinder binder;/ 定义一个serviceconnection对象private serviceconnection conn = new serviceconnection() / 当客户端与service断开连接时overridepubli
48、c void onservicedisconnected(componentname name) system.out.println(-onservicedisconnected-);/ 当客户端与service建立连接时overridepublic void onserviceconnected(componentname name, ibinder service) system.out.println(-onserviceconnected-);binder = (myservice.mybinder) service;public void oncreate(bundle saved
49、instancestate) super.oncreate(savedinstancestate);setcontentview(r.layout.main);btnbind = (button) findviewbyid(r.id.btnbind);btnunbind = (button) findviewbyid(r.id.btnunbind);btngetdata = (button) findviewbyid(r.id.btngetdata);final intent intent = new intent();intent.setaction(com.jiahui.myservice
50、);btnbind.setonclicklistener(new view.onclicklistener() overridepublic void onclick(view v) / 绑定servicebindservice(intent, conn, bind_auto_create););btnunbind.setonclicklistener(new view.onclicklistener() overridepublic void onclick(view v) / 解除绑定unbindservice(conn););/获取数据btngetdata.setonclickliste
51、ner(new view.onclicklistener() overridepublic void onclick(view v) / 获取数据toast.maketext(mainactivity.this,service的count值为 + binder.getcount(),toast.length_long).show(););点击” 获取service里的数据”按钮点击“unbindservice”按钮所以也可以通过上图知道bindservice的生命周期bindservice会经历oncreate()-onbind()-onunbind()-ondestory如何去理解这种通信方
52、式? 我的理解是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 对象进行操作,我们甚至可以建
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 转让小型设备合同协议
- 产品研发战略合作合同
- 产品售后服务与保障协议书
- 幼儿园房屋租赁合同十
- 工程招投标工作廉政协议
- 小微企业扶持政策合同
- 农业化肥销售及使用协议
- 正规卖狗协议书
- 车库做仓库合同协议
- 辩论赛协议合同协议
- 古茶树保护与传承
- GB/T 35428-2024医院负压隔离病房环境控制要求
- 《传感器及检测技术》说课-完美动画
- 新《建筑节能》考试复习题库(浓缩500题)
- 2023年新高考全国I卷数学真题
- 2024年高中生物学业水平合格考及答案
- 《DAO:元宇宙经济组织》记录
- 安徽省合肥市科大附中2025年第二次中考模拟初三数学试题试卷含解析
- 2024年重庆市大渡口区中考第二次适应性考试物理试题(原卷版)
- 2024年7月中央电大本科《法律文书》期末考试试题及答案
- 五年级上册小数除法竖式计算100道及答案
评论
0/150
提交评论