Android手机图像浏览软件毕业
(含外文翻译)
安徽工业大学工商学院 毕业设计(
)
书
摘 要
随着Android手机的快速普及,Android手机应用软件越来越丰富,各行各业都在 陆续推出自己的基于Android的软件系统,比如说在医疗行业。为了方便医生浏览和?
处理医疗图片,本人开发了一个基于Android手机的医疗图像浏览处理软件。 ?
? 该软件用Java语言,Android SDK开发包和Eclipse开发工具进行开发,主要? 实现了DICOM标准的医学文件的图像显示,并在图像显示的基础上实现医学文件图像?
的拖动、旋转和缩放。这四个功能模块中图像浏览模块主要通过ImageView控件实现?
? 多幅医疗图像文件的显示,图像拖动模块则通过触屏手机屏幕中单触点的移动来改变? ImageView控件的位置或者通过移动屏幕上的拖动条(Seekbar组件)来移动图像;?
图像旋转模块通过屏幕上双触点的移动来改变ImageView控件的旋转角度或者也通?
? 过移动屏幕上的拖动条来达到旋转的效果;缩放模块通过双触点的移动来改变? ImageView控件的大小从而实现图像的缩放。 ?
该软件根据软件工程设计方法和基于Android的DICOM文件医疗图像处理的实装
? 际需求进行了详细的功能分析,并编码实现了其功能,最后给出了软件的测试过程和? 结果。 ?
?
关键词:android;医疗图像 ;DICOM;图像显示 ?
订 ? ?
?
? ?
线
?
? ?
?
?
? ?
?
?
?
?
?
?
I
安徽工业大学工商学院 毕业设计(论文)说明书
Abstract
With the rapid spread of Android phones, Android mobile phones application ?
softwares have become increasingly diverse, and businesses launch software ?
? systems which are based on the Android, for example in the medical industry. ? So, I developed an Android phone-based medical image browsing software. ?
The software uses the Java language and the Android SDK development ?
? package, and uses the Eclipse development tools for development. The software
? realizes medical file image browsing based on DICOM standard, and on this basis ?
can drag,rotate and zoom. The image browsing module of the four function ?
? modules mainly uses the ImageView control to realize displaying the medical
? image file, dragging through a single module is the contact's move to change ?
the position of the ImageView control so as to realize the image on the screen 装
? or drag by dragging the drag (seekbar components) to move the image; Image
? rotation module uses the double the contact's move to change ImageView control ?
Angle so as to realize the rotation of the image or also moves such as image ?
? by dragging the screen to reach the rotating article drag effect; Image scaling
订 module uses the double the contact's move to change the position of the ?
ImageView control so as to realize the scale of the image. ?
? The software is based on software engineering method and the actual needs
? of medical images of the Android-based DICOM files ,and carrys out a detailed ? functional analysis, and codes to achieve its functions. Finally,I show out 线
? the software testing process and result. ? ? Key word:Android;Medical Image;DICOM; Image Browsing ?
?
?
?
?
?
?
?
?
?
II
安徽工业大学工商学院 毕业设计(论文)说明书
目 录
1 绪论 ................................................................ 1 1.1 课题背景 ......................................................... 1 ?
1.2 课题意义 ......................................................... 1 ?
? 1.3 论文组织结构 ..................................................... 1 ? 2 系统开发环境及相关技术 .............................................. 2 ?
2.1 ANDROID特征 ...................................................... 2 ?
? 2.2 手机操作系统的发展状况 ........................................... 3 ? 2.3 ANDROID SDK开发包介绍 ............................................. 4 ?
2.4 DICOM3.0标准 .................................................... 6 ?
? 2.5 开发工具安装与配置 .............................................. 10 ? 2.5.1 jdk1.6.0安装 ............................................... 10 ?
2.5.2 jdk1.6.0的环境变量配置 ..................................... 12 装
? 2.5.3 Eclipse安装 ................................................ 13 ? 2.5.4 Android SDK开发包安装 ...................................... 14 ?
3 系统需求分析 ....................................................... 15 ?
? 3.1 系统需求分析 .................................................... 15 订 3.2 系统功能分析 .................................................... 15 ? 4 系统总体设计 ....................................................... 17 ?
? 4.1 系统结构图 ..................................................... 17 ? 4.2 系统功能模块 .................................................... 17 ? 4.2.1 医疗图像的显示功能模块 ..................................... 17 线
4.2.2 医疗图像的拖动功能模块 ..................................... 17 ?
? 4.2.3 医疗图像的旋转功能模块 ..................................... 17 ? 4.2.4 医疗图像的缩放功能模块 ..................................... 18 ?
4.3 显示界面规划 .................................................... 18 ?
? 5 详细设计与实现 ..................................................... 20 ? 5.1 文件结构与用途 .................................................. 20 ?
5.2 系统实现 ........................................................ 21 ?
? 5.2.1 医学图像显示实现的过程 ..................................... 21 ? 5.2.2 医学图像拖动实现的过程 ..................................... 24 ?
5.2.3 医学图像旋转实现的过程 ..................................... 25 ?
5.2.4 医学图像缩放实现的过程 ..................................... 29
6 软件测试 ........................................................... 32
6.1 什么是软件测试 .................................................. 32
6.2 软件测试的规则 .................................................. 32
III
安徽工业大学工商学院 毕业设计(论文)说明书
6.3 软件测试的对象 .................................................. 32
6.4 各页面的测试 .................................................... 32
结束语 ................................................................ 36
致谢 .................................................................. 37
? 参考文献 .............................................................. 38
? 附录一 部分源代码 .................................................... 39 ?
附录二 英文原文及译文 ................................................ 45 ?
? ? ? ? ? ?
?
?
? 装 ? ?
?
?
?
订
?
?
?
?
?
线
?
?
?
?
?
?
?
?
?
?
?
?
?
IV
安徽工业大学工商学院 毕业设计(论文)说明书
1 绪论
1.1 课题背景 ?
?
随着电子和通信技术的高速发展,具有强大显示、通信、环境探测和适当计算?
? 能力的Android智能手机正成为人们随身携带的必要附件。Android智能手机不仅为? 用户带来随身的通信、娱乐、信息检索的功能,强大计算能力可以用来开发各样新? 颖功能,满足用户千奇百怪的需求。 ?
? Android 是一套真正意义上的开发性的移动设备综合平台,它包括操作系统、? 中间件和一些关键的平台应用。Android 是由Linux+Java构成的开源软件,允许所? 有厂商和个人在其基础上进行开发。Android平台的开放性等特点既能促进技术(包?
括平台本身)的创新,又有助于降低开发成本,还可以是运营商能非常方便地制定自?
? 己的特色化的产品。因此,它具有很大的市场发展潜力。 装 Android手机医学图像浏览软件是基于Android SDK开发包、Java语言,运用?
eclipse开发工具实现医疗图像信息的显示,并且对医疗图像进行一定的拖动、旋?
? 转、缩放操作,开发出针对使用Android手机平台的医疗图像软件。 ?
? 1.2 课题意义
订
Android手机医学图像软件的开发可以进一步扩大医疗图像信息的覆盖面,让?
? 广大医生通过互联网能够在第一时间方便且快捷地获取病人的病情状况,以便医生? 能尽早的得出病人疾病的解决
,把疾病带给病人的痛苦降到最低。同时也可以?
强化医疗公共服务的职能,完善公共服务体系、改善公共服务手段、增加公共服务?
线 产品、提高公共服务质量,更好地发挥了医疗事业对经济社会发展的现实性作用。 ?
1.3 论文组织结构 ?
?
本文首先分析了系统的研究背景、研究意义,介绍了当前手机操作系统、卓手?
? 机的现实状况和发展趋势,以及本文的主要内容。
? 第二章,介绍了Android的特征、手机操作系统的发展状况、Android SDK开发? 。此外还介绍了开发工具JDK、Eclipse的安装配置。 包以及DICOM 3.0标准?
? 第三章,介绍了系统的需求分析、设计特点,粗略介绍了医疗图像软件主要实? 现的功能:浏览、拖动、旋转和缩放。 ? 第四章,介绍了系统的总体设计,包括系统机构图和系统功能模块。 ?
第五章,介绍了系统的详细设计和功能的实现。 ?
共 58 页 第 1 页
安徽工业大学工商学院 毕业设计(论文)说明书
2 系统开发环境及相关技术
Android是一个移动设备的软件平台,是由Linux+Java构成的开源软件,它提?
供包括SDK、Key Apps、Middleware、Linux Kernel四个部分在内的全套手机软件方?
? 案。它开放了基于Linux内核以上的开发工具,从而保证了内容的可移植性和多样? 性。Android平台为我们开发应用程序提供了一套很好的框架,我们可以在这个平?
台的基础上开发不同的应用程序,也可以开发新的组件供应用程序调用。 ?
? 2.1 Android特征 ?
? 应用框架:用于开发可重用、可替代的组件。 ?
Dalvik虚拟机:Android采用的Java虚拟机是自主开发的代号为Dalvik的虚拟?
? 机技术,在保证API方面兼容的同时Dalvik针对移动手机进行了大幅优化,占用资? 源更小,运行效率更高。 装
内嵌浏览器:基于开源的浏览器网页排版引擎WebKit。 ?
? 优化的图形:强大的自定义二维图形库。基于OpenGL ES 1.0标准的3D图形功? 能,在移动3D开发中有着至关重要的地位。 ?
SQLite数据库:SQLite提供结构化的数据存储。它是一款轻型免费的且开源的?
订 数据库,它的设计目标是嵌入式的,它占用的资源非常低、需要的内存空间少、处? 理速度比较快和支持事务处理功能等。 ? 多媒体支持:支持各种通用的音频、视频和静态图像格式,如MP3、JPG、PNG?
? 等。Open Core是Android多媒体框架的核心,所有Android平台的音频和视频采? 集、播放的操作都是通过它来实现的。通过Open Core,程序员可以方便快速的开发线 出想要的多媒体应用程序。 ?
GSM技术:(依赖硬件)Global System for Mobile Communications,全球通?
? 讯系统,俗称“全球通”,是第二代移动通信技术,其开发目的是让全球各地可以? 共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。 ?
蓝牙,EDGE,Android and WiFi:(依赖硬件)蓝牙和Wi-Fi都是一种短距离的无?
? 线连接技术,在短距离内可以实现话音和数据的无线传输。EDGE(Enhanced Data
? Rate for GSM Evolution),是增强型数据速率GSM演进技术。 ?
Cameram,GPS,compass,andaccelerometer:(依赖硬件)GPS(Global Positioning ?
? System),即全球定位系统。它是由一个由覆盖全球的24颗卫星组成的卫星系统。? Compass是一个开放源码的Java搜索引擎框架。 ?
强大的开发环境:包括一个设备模拟器,调试工具,内存和性能检测,以及
Eclipse IDE的开发插件。Eclipse是个集成开放环境。
共 58 页 第 2 页
安徽工业大学工商学院 毕业设计(论文)说明书
2.2 手机操作系统的发展状况
Palm OS是一套专门为掌上电脑编写的操作系统,是一种轻量级、比较开放的操
作系统,占用的内存非常小,允许用户在其基础上编写和修改相关软件,是支持的
应用程序更加丰富多彩。Plam 在其它方面也还存在一些不足,如Plam操作系统本身? 不具备录音、MP3播放功能等,但是可以通过加入第三方软件或硬件设备来实现。?
? 其代表性的产品有Palm m505、Palm m500、Palm III等。 ? Symbian是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少? 等特点,非常适合手机等移动设备使用,经过不断完善,可以支持GPRS、蓝牙、?
SyncML以及3G技术。 ?
? Windows mobile系列操作系统是从微软计算机的Windows操作系统上变化而来? 的。Windows mobile系列操作系统功能强大,而且支持该操作系统的智能手机大多?
数都采用了英特尔嵌入式处理器,主频比较高,在其它硬件设置(如内存、储存卡容?
? 量等)上也采用其他操作系统的智能手机要高出许多,因此性能比较强劲,速度比较? 快。Windows mobile系列操作系统包括SmartPhone以及Pocket PC Phone两种平台。装
Pocket PC Phone主要用于掌上电脑型的智能手机,而SmartPhone则主要为手上智?
? 能手机提供操作系统。
? Linux系统是一个源代码开放的操作系统。由于其开源性,手机制造商可以根?
据实际情况开放自己的Linux手机操作系统,从而也能够吸引更多的软件制造商在?
订 其上开发更多的应用软件,丰富第三方的应用。但是Linux操作系统也还存在一些? 不足,集成开放环境和基于Linux的产品与PC的连接性比较差等。 ?
据Gartner最新数据显示,2010年第二、三季度全球智能手机销售继续大幅增?
? 长,其中第三季度安卓占全球智能手机市场的25.5%,仅次于塞班,成为第二大智? 能手机系统。2010第二、三季度与去年同期相比,增度分别是15.4%及22%,增势迅线
猛。而塞班系统较09年的市场份额,尽管终端销量有大幅度提升,但增势下滑?
? 10%,形势非常严峻。其他操作系统的表现则要平稳很多。 ?
?
?
?
?
?
?
?
?
?
?
图2-1 各种手机系统状况比较
共 58 页 第 3 页
安徽工业大学工商学院 毕业设计(论文)说明书
安卓是首款开源代码的操作系统,采用Linux内核,开放手机联盟(OHA)成员
可以任意使用和修改安卓的SDK软件包。系统的开源性使其具有良好的拓展性,一
方面,为众多移动应用开发者提供了良好的系统性平台,有利于移动应用的集合;
另一方面,终端厂商可以针对自身的特殊需要“定制化开发”。与此相比,尽管
? 2010年2月,塞班基本完成开源工作,但由于代码臃肿,用户界面设计缺失,塞班? 的开源并无实际意义,错失发展良机。 ?
据Informa预测,2012年,安卓手机销量将超过诺基亚塞班手机,届时安卓将?
? 成为全球最大的智能手机平台。谷歌表示目前安卓手机每日平均激活量为20万部,? 销售速度加速上涨。 ? 我们认为,安卓在全球市场的成长壮大,塞班市场份额不断下跌已成不争事?
? 实。安卓操作系统发展迅猛主要得益于免费、开源和良好产业运作策略,这三点为? 安卓在智能手机市场赢得更多的发展机遇。系统的免费让更多的厂商加入,推动了? 份额的上升;代码的开源让更多的开发者进入应用开发;应用的丰富吸引了更多用?
户选择,这也是谷歌值得众多厂商学习的地方。此外,谷歌通过OHA联合众多厂商?
装 进行系统研发,不断更新版本,将系统应用推广到更多的终端产品中,确保用户体? 验持续改善。 ?
? 2.3 Android SDK开发包介绍 ?
? 一、Android SDK
订 既Android Software Development Kit,它提供了在Windows/Linux/Mac平台上开发?
Android应用的开发组件,包含了在Android平台上开发移动应用程序的各种工具?
? 集。
? 二、Android SDK tools ?
a.Android模拟器(Android Emulator(emulator.exe)) 线
? 运行在计算机上的虚拟移动模拟器,可以使用模拟器来在一个实际的Android运行? 环境下设计,调试和测试应用程序。 ?
b.集成开发环境插件(Android Development Tools Piugin for the Eclipse IDE 即ADT) ?
? 可以直接从Eclipse访问其他Android开发工具。通过它可以进行包括截屏,管理? 端口转发(port-forwarding),设置断点,观察线程和进程信息。 ?
它提供了一个新的项目向导(New Project Wizard),用于快速生成和建立起新?
? Android应用程序所需的最基本的文件。
? 它使得构建Android应用程序的过程变得自动化以及简单化。 ? 它提供了一个android代码编辑器,用于为Android 的manifest和资源文件编写?
? 有效的XML。
c.调试监视服务(Dalvik Debug Monitor Service(ddms.bat)
它集成在Dalvik(Android平台虚拟机)中,用于管理运行在模拟器或设备上的进
程,并协助进行调试。可以用它来去除进程,选择一个特定程序来调试,生成跟踪
数据,查看堆和线程数据,对模拟器或设备进行屏幕快照等。
共 58 页 第 4 页
安徽工业大学工商学院 毕业设计(论文)说明书
d.Android调试桥(Android Debug Bridge(adb.exe))
它用于向模拟器或手机设备安装应用程序的apk文件和从命令行访问模拟器或手
机设备。也可以用于将标准的调试器连接到运行在android模拟器或手机设备上的应
用代码。
? e.Android资源打包工具(Andoird Asset Packing Tool(aapt.exe))
? 可以通过aapt工具来创建apk文件,这些文件包含了android应用程序的二进制文?
件和资源文件。 ?
? f.Android接口描述语言(Android Interface Description Language(aidl.exe))
? 它用来生成进程间接口代码,在服务中便可用到。 ? g.SQLite3数据库(sqlit3(sqlite3.exe)) ?
? Android应用程序可以创建和使用SQLite数据文件,开发者和使用者也可以方便? 的访问这些数据文件。 ? h.跟踪显示工具(Traceview(traceview.exe)) ?
它可以生成跟踪日志数据的图形分析视图,这些跟踪日志数据由android因公程?
装 序产生。 ? i.创建SD卡工具(mksdcard(mksdcard.exe)) ?
它帮助创建磁盘镜像,这个磁盘镜像可以在模拟器上模拟外部存储卡。 ?
? j.DX工具(dx(dx.exe))
? 它将class字节码重写为android字节码(存储雨dex文件中)。 订
k.生成Ant构建文件(activityCreator(activitycreator.bat)) ?
? 它是一个脚本.用来生成Ant构建文件,Ant构建文件用来编译android应用程序.? 若是在安装了ADT插件的Eclipse环境下开发则不需要这个脚本。 ?
l.Adnroid虚拟设备(Android Virtual Devices AVD) ?
线 每个android虚拟设备(AVD)模拟了单一的虚拟设备来运行android平台,这个平? 台至少要包括自己的内核,系统图像和数据分区。开发者可以创建并保存多种虚拟?
模拟器配置,每种配置环境有其自己的平台版本,硬件配置以及SD卡和用户数据,?
? 还可以有不同的显示外观等个性化设置,运行时只需要制定需要使用哪个。即可实? 现多平台下的模拟测试。 ?
3.Adnroid 核心包 ?
? android.util:包含一些底层的辅助类,例如,特定的容器类,XML辅助工具类? 等。 ? android.os:提供基本的操作服务,消息传递和进程间的通行IPC。 ?
? android.graphics:作为核心的渲染包,提供图形渲染功能。
? android.text、 android.text.method、 android.text.style、 android.text.util 提供一
套丰富的文本处理工具,支持富文本,输入模式等。
android.database:包含底层API处理数据库,方便操作数据库表和数据。
android.content:提供各种服务访问数据在手机设备上,程序安装到手机设备和
共 58 页 第 5 页
安徽工业大学工商学院 毕业设计(论文)说明书
其他的相关资源,以及内容提供展示动态数据。
android.view:核心用户界面框架。
android.widget:提供标准用户界面元素,lists,buttons,layout managers等,是
组成我们界面的基本元素。
? android.app:提供高层的应用程序模型,实现使用Activity。 ? android.provider:提供方便调用系统提供的content providers的接口。 ?
android.telephony:提供API交互和手机设备的通话接口。 ?
? android.webkit:包含一系列的工作在基于web内容的API。 ?
2.4 DICOM3.0标准 ?
? 一、 什么是DICOM, ?
? DICOM是Digital Imaging and Communication of Medicine的缩写,是美国放? 射学会(American College of Radiology,ACR)和美国电器制造商协会(National ? NEMA)组织制定的专门用于医学图像的存Electrical Manufacturers Association,?
储和传输的标准名称。经过十多年的发展,该标准已经被医疗设备生产商和医疗界装
? 广泛接受,在医疗仪器中得到普及和应用,带有DICOM接口的计算机断层扫描? (CT)、核磁共振(MR)、心血管造影和超声成像设备大量出现,在医疗信息系统数字?
网络化中起了重要的作用。 ?
? DICOM是随着图像化、计算机化的医疗设备的普及和医院管理信息系统,特别订 是图像存档和通信系统(Picture Archiving and Communication System, PACS)和远?
程医疗系统的发展应运而生的。当CT和MR等设备生成高质量的、形象直观的图像在?
? 医疗诊断中广泛使用时,由于不同的生产商不同型号的设备产生的图像各自采用了? 不同的格式,使得不同的设备之间的信息资源难以互相使用,医院PACS系统的实施?
具有很大的困难。医疗信息系统随之带来许多新的问题: 如何存储数据量极大的图线
? 像并能有效地管理,不同生产商的设备能否直接连接,如何能够在不同的生产商设? 备之间能够共享信息资源,等等。很明显这些问题的解决方法就是采用统一的标?
准。为此,美国放射学会和美国电器制造商协会在1983年成立了专门委员会,制定?
? 用于医学图像存储和通信的标准,提供与制造商无关的数字图像及其相关的通信和? 存储功能的统一格式,以促进PACS的发展,并提供广泛的分布式的诊断和查询功?
能。ACR-NEMA1.0版本于1985年推出,随后增加了新的数据元素并对部分内容进行?
? 修改,形成2.0版本。由于认识到标准对网络支持的不足和标准本身存在的结构性? 问题,ACR-NEMA结合当时的技术条件和方法对标准作了彻底的重新制定,在1993年? 正式公布了新的版本,命名为DICOM3.0。与原版本相比,3.0版本采用了面向对象?
? 的分析方法,定义了医学图像在存储和通信过程中的各种实体和关系,提供了对
ISO-OSI(Inter-national Standard Organization-Open System Interconnection)
和TCP/IP (Transmission Control Protocol / Internet Protocol)的支持,使得
在医学图像应用层上可以与其它通信协议栈直接通信而不需要重新编写程序。考虑
到技术的发展,标准采用了多部分的文档结构,对可能变化或扩充的部分以附录的
共 58 页 第 6 页
安徽工业大学工商学院 毕业设计(论文)说明书
形式提供,这样标准在更新时涉及面可以尽量小。
二、 标准中涉及的基本概念和定义
DICOM标准涉及到医学图像、数据通信、管理信息系统等领域,在标准中又采
用了面向对象的描述方法和E-R (Entity-Relation)模型,从而引入了大量的各专业
? 方面的术语,给标准的阅读和理解带来困难。下面简要地将标准中涉及的常用的技? 术词汇和缩略语给予解释。 ?
1. 实体(Entity):表示一个或一类有相同特性个体的应用对象。在计算机系统?
? 分析中,凡是可以区别并被人们识别的事、物、概念等,都可以被抽象为实体。实? 体一般具有若干特征,称为属性。如:患者是一个实体,具有姓名、性别、年龄等属? 性。图像也是一个实体,它有图像尺寸、图像数据等属性。 ?
? 2. 联系(Relation):表示实体之间的相互关系。如患者实体与分析实体之间存? 在着引用联系,打印机实体和胶片实体之间存在着打印的联系。 ? 3. E-R模型:描述现实世界的一种信息模型。通过定义实体以及实体间的联系,?
表现系统的需求和功能。通常以E-R图的方式表示。在DICOM中,用方框表示实体,?
装 菱形表示联系,用带箭头或不带箭头的线段将实体(方框)与联系(菱形)连接表示它? 们之间存在联系。这是面向对象的分析方法所采用的主要表示方法,是对客观世界?
的一种抽象。 ?
? 4. 对象(Object):外部世界事物在计算机内部的表示,是事物属性值和处理方? 法的集合。对象具有封装和继承的特征。封装是指对象将属性和方法集合在一起,订
一般情况下只提供给自己和派生对象使用。继承是指当一个对象是由另一个对象(父?
? 对象)派生出时,它就自动具有父对象所具有的属性和方法。面向对象的方法就是以? 对象技术为中心,分析系统中各种信息之间的关系,抽象出系统各层次的对象模?
型,给出准确的系统描述,并在计算机系统中给予实现。应用面向对象的方法,可?
线 以提高开发效率,实现软件复用。
? 5. 信息对象定义(Information Ob-ject Definition,IOD):信息实体的抽象,?
是DICOM命令的作用受体。 ?
? 6. 服务(Service): 某对象为其它对象或程序提供的功能。当要求使用此功能? 时称申请服务,申请服务的对象称服务用户,而能完成该功能的对象是服务的提供?
者。 ?
? 7. 服务对象对(Service Object Pair,SOP): DICOM信息传递的基本功能单位。? 包括一个信息对象和一组DICOM消息服务元素。 ? 8. 协议:计算机网络中为保证能正确地传输数据而必须共同遵守的通信规则和?
? 格式。
? 9. ISO-OSI:国际标准化组织(ISO)所定义的开放系统互联(OSI)的七层网络参考
模型。作为一个严格的网络模型,对于计算机网络的研究和发展起了重要的作用,
但是由于种种原因在实际中并未得到广泛的普及使用。DICOM标准在制定时,OSI正
是发展的高潮,因此也作为DICOM中主要的网络参考模型。
共 58 页 第 7 页
安徽工业大学工商学院 毕业设计(论文)说明书
10. TCP/IP: 是传输控制协议/互联网协议,它首先在UNIX系统中使用,随后
成为计算机网络中不同种类计算机之间通信的主要通信协议,是互联网的基础。
三、 标准的组成
DICOM标准是经历了一个从无到有、从简单到复杂的发展过程。在标准的制定过
? 程中不断听取工业界、学术界、医疗界等各方面的意见和建议,注意标准的可扩充? 性和可扩展性,经历了ACR-NEMA 1.0和2.0的版本到目前的DICOM 3.0版本,标准?
的组成也在不断地加以补充,目前标准共有以下14个基本部分和扩充部分组成: ?
? 第1部分:给出了标准的设计原则,定义了标准中使用的一些术语,对标准的其? 它部分给了一个简要的概述。 ? 第2部分:给出了DICOM的兼容性定义和方法。兼容性是指遵守DICOM标准的设?
? 备能够互相连接互相操作的能力。由于DICOM标准内容庞大,功能复杂,包含面? 广,目前为止,还没有什么设备能够涵盖所有的DICOM功能,只是实现本设备必需? 的功能。因此标准要求设备制造商必须给出本设备所支持的DICOM功能的说明,即?
兼容性声明。(原来第二部分是干这个用的呀,终于明白了)本部分标准内容定义了声?
装 明的结构和必须表现的信息,包含三个主要部分: ? a. 本实现中可以识别的信息对象集合; ?
b. 本实现支持的服务类集合; ?
? c. 本实现支持的通信协议集合。
? 标准没有规定兼容性实现的测试和验证的过程。用户在采购DICOM功能的设备时,订
必须注意各设备的兼容性水平是否一致,否则各设备互连时会出现一些问题。 ?
? 第3部分: 描述如何定义信息对象,对医学数字图像存储和通信方面的信息对? 象提供了抽象的定义。每个信息对象定义是由其用途和属性组成的。为方便标准的?
扩充和保持与老版本的兼容,在DICOM中定义了复合型和普通型两大类的信息对象?
线 类。普通型信息对象类仅包含现实世界实体中固有的那些属性。复合型信息对象类? 可以附加上并不是现实世界实体中固有的属性。如CT图像信息对象类既包含了图像?
固有的图像日期、图像数据等图像实体的属性,又包含了如病人姓名等并不属于图?
? 像本身的属性。复合对象类提供了表达图像通信所需求的结构性框架,使网络环境? 下的应用更加方便。 ?
第4部分:服务类的说明。服务类是将信息对象与作用在该对象上的命令联系在?
? 一起,并说明了命令元素的要求以及作用在信息对象上的结果。典型的DICOM服务? 类有查询 /检索服务类、存储服务类、打印管理服务类等。服务类可以简单理解为? DICOM提供的命令或提供给应用程序使用的内部调用函数。这部分实际上说明的是 ?
? DICOM消息中的命令流。
? 第5部分: 数据结构和语义,说明了DICOM应用实体如何构造从信息对象与服
务类的用途中导出的数据集信息,给出了构成消息中传递的数据流编码规则。数据
流是由数据集的数据元素产生的,几个数据集可以被一个复合数据集引用或包容。
一个复合数据集可以在一个“数据包”中传递信息对象的内容。这部分着重说明的
共 58 页 第 8 页
安徽工业大学工商学院 毕业设计(论文)说明书
是有关 DICOM消息中数据流方面的内容。此外也定义了许多信息对象共同的基本函
数的语义,即要求的条件、完成的结果、实现的功能等等。
第6部分:数据字典,是DICOM中所有表示信息的数据元素定义的集合。在
DICOM标准中为每一个数据元素指定了唯一的标记、名字、数字特征和语义,这样
? 在DICOM设备之间进行消息交换时,消息中的内容具有明确的无歧义的编号和意? 义,可以相互理解和解释。 ?
第7部分:消息交换。消息是由用于交换的一个或多个命令以及完成命令所必需?
? 的数据组成,是DICOM应用实体之间进行通信的基本单元。这部分说明了在医学图? 像环境中的应用实体用于交换消息的服务和协议。 ? 第8部分:消息交换的网络支持。说明了DICOM实体之间在网络环境中通信服务?
? 和必要的上层协议的支持。这些服务和协议保证了应用实体之间有效地和正确地通? 过网络进行通信。DICOM中的网络环境包括OSI和TCP/IP两种参考模型,DICOM只是? 使用而不是实现这两类协议,因而具有通用性。 ?
第9部分:消息交换的点对点通信支持。说明了与ACR-NEMA2.0相兼容的点对点?
装 通信环境下的服务和协议。它包括物理接口、信号联络过程以及使用该物理接口的? 与OSI类似的会话/传输/网络协议及其服务。 ?
第10部分:用于介质交换的介质存储和文件格式。这一部分说明了一个在可移?
? 动存储介质上医学图像信息存储的通用模型。提供了在各种物理存储介质上不同类? 型的医学图像和相关信息进行交换的框架,以及支持封装任何信息对象定义的文件订
格式。 ?
? 第11部分:介质存储应用卷宗,用于医学图像及相关设备信息交换的兼容性声? 明。给出了心血管造影、超声、CT、核磁共振等图像的应用说明和CD-R格式文件交?
换的说明。 ?
线 第12部分:用于介质交换的物理介质和介质格式。它提供了在医学环境中数字? 图像计算机系统之间信息交换的功能。这种交换功能将增强诊断图像和其它潜在的?
临床应用。这部分说明了在描述介质存储模型之间关系的结构以及特定的物理介质?
? 特性及其相应的介质格式。具体说明了各种规格的磁光盘,PC机上使用的文件系统? 和1.44M 软盘,以及CD-R可刻写光盘。 ?
第13部分:点对点通信支持的打印管理。定义了在打印用户和打印提供方之间?
? 点对点连接时,支持DICOM打印管理应用实体通信的必要的服务和协议。点对点通? 信卷宗提供了与第8部分相同的上层服务,因此打印管理应用实体能够应用在点对? 点连接和网络连接。点对点打印管理通信也使用了低层的协议,与已有的并行图像?
? 通道和串行控制通道硬件硬拷贝通信相兼容。
? 第14部分:说明了灰度图像的标准显示功能。这部分仅提供了用于测量特定显
示系统显示特性的方法。这些方法可用于改变显示系统以与标准的灰度显示功能相
匹配或用于测量显示系统与标准灰度显示功能的兼容程度。
共 58 页 第 9 页
安徽工业大学工商学院 毕业设计(论文)说明书
四 、应用
毫无疑问,DICOM是医学图像信息系统领域中的核心,它主要涉及到信息系统
中最主要也是最困难的医学图像的存储和通信,可直接应用在放射学信息系统(RIS)
和图像存档与通信系统(PACS)中。DICOM也是研究和开发具有网络连接功能,实现
? 信息资源共享的新型医疗仪器的技术基础。医疗仪器在朝着自动化、智能化发展的? 同时,也在向着具有通信能力的遥控遥测和信息远程获取的网络功能发展,医疗仪?
器既是医疗信息系统中的信息源,又是系统中的信息使用者,是信息系统中的一个?
? 主要环节,网络化的医疗仪器对医学信息系统的重要性是不言而喻的。 ? DICOM标准的另一个特点是它定义在网络通信协议的最上层,不涉及到具体的? 硬件实现而直接应用网络协议,因此与网络技术的发展保持相对独立,可以随着网?
? 络性能的提高而使DICOM系统的性能立即得到改善。DICOM尽管提供了OSI的网络模? 型,但现在实际上网络绝大部分都是在TCP/IP协议下构成的,网络硬件采用的形式? 可以多种多样,如100M的双绞线100Base-T,光纤 FDDI,综合业务数字网ISDN,T1?
线路等,还有速度较低的10兆网10Base-T和电话线路。只要设备具有支持TCP/IP?
装 协议的网络接口,在软件的支持下,就可以做到像PC机一样实现“即插即用”,非? 常方便地加入到医学信息系统的网络中。在这样的意义下,用DICOM实现的医疗信?
息系统,无论是 RIS还是PACS,都具有类似的结构。 ?
? 在采用DICOM标准的信息网络系统中,所有DICOM设备之间都可以按照DICOM 的? 网络上层协议进行互相连接和操作。临床医生可以在办公室查看B超设备的图像和订
结果,可以在CT机上调用核磁共振图像进行图像的叠加融合,也可以通过网络调用?
? 存储在其他医院的图像结果。无论是本院、本地还是相距很远的外地,DICOM设备? 都可以通过网络相互联系,交换信息。 ?
由于提供了统一的存储格式和通信方式,普及DICOM标准,可以简化医疗信息?
线 系统设计,避免许多重复性的工作,加快信息系统的开发速度。对于实现无纸化、? 无胶片化的医院和远程医疗系统的实施将会起极其重要的作用。 ?
? 2.5 开发工具安装与配置 ?
? 开发工具:eclipse-reporting-helios-SR2-win32,jdk1.6.0, Android SDK
?
2.5.1 jdk1.6.0安装 ?
? 双击下载的jdk-6u23-windows-i586.exe,出现安装向导画面,单击“下一?
步”,到如图2-2所示界面。 ?
?
?
?
共 58 页 第 10 页
安徽工业大学工商学院 毕业设计(论文)说明书
? ? ? ? ? ? ? ? ? ? ?
图2-2 jdk安装向导 ? ? 选择“开发工具”,如果想要更改安装路径,可以单击更改,如果不想更改,
装 可以直接单击“下一步”,1.6.0版本开始安装开发工具,当安装将结束时,出现? “Java安装”提示对话框,单击“确定”后,出现安装完成,如图2-3所示。 ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ?
图2-3 安装完成 ? ? 单击“完成”,出现“注册您的JDK”网页,如图2-4所示。如果想注册,则单
? 击“注册我的JDK”,如果不想,则关闭网页。 ? ? ? ?
共 58 页 第 11 页
安徽工业大学工商学院 毕业设计(论文)说明书
? ? ? ? ? ? ? ? ?
图2-4 JDK注册网页 ? ? 2.5.2 jdk1.6.0的环境变量配置 ? ? 在“我的电脑”图标上右击,选中“属性”,单击后,出现“系统属性”对话装 框,选择“高级”,如2-5图所示。 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ?
? 图2-5 系统属性 ? ? 单击“环境变量”,配置系统环境变量。
? 配置“新建”JAVA_HOME=” C:\Program Files\Java\jdk1.6.0_23”如图2-6所示。 ?
共 58 页 第 12 页
安徽工业大学工商学院 毕业设计(论文)说明书
?
? ? 图2-6 JAVA_HOME环境变量配置
? 单击“确定”,单击“新建”,配置CLASSPATH=?
“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”,如图2-7所示。 ?
?
?
?
?
?
?
? 装 图2-7 CLASSPATH环境变量配置 ?
单击“确定”,选定双击Path,在后面加上?
? “%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”,如图2-8所示。
?
?
订
?
?
?
?
?
图2-8 Path环境变量配置 线
? 单击“确定”后,完成配置。
?
2.5.3 Eclipse安装 ?
? 成功安装JDK并配置好环境变量后,就可以运行Eclipse.exe。 ?
Eclipse工作界面如图2-9所示。 ?
?
?
?
?
?
?
?
共 58 页 第 13 页
安徽工业大学工商学院 毕业设计(论文)说明书
? ? ? ? ? ? ? ? ? ? ? ?
-9 Eclipse工作界面 图2? 装
2.5.4 Android SDK开发包安装 ? ?
Android SDK采用了Java语言,所以需要先安装1.5.0及以上版本。直接下载? ? JDK安装文件安装,方便。
? Android SDK不用安装,下载后直接解压即可。 订 将下载后的SDK的压缩包解压到适当的位置,SDK就安装好了。 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ?
共 58 页 第 14 页
安徽工业大学工商学院 毕业设计(论文)说明书
3 系统需求分析
3.1 系统需求分析 ?
? 医学图像处理与分析技术可以给医生提供更清晰、更准确的信息,以利于疾病的?
诊断和鉴别诊断。医学图像分割、医学图像配准以及三维可视化等算法是医学图像?
? 处理与分析发展的源动力,而基于这些算法研发的软件平台是医学图像处理与分析前? 进的加速器。现有的医学图像处理与分析软件平台极大地便利了医学影像领域的研?
究者与应用者,大大加快了医学影像发展的步伐。 ?
? DICOM格式的图像包含了大影像概念的所有医学图像 ,如CT、MRI、DSA、CR、? 超声、核医学以及病理 ,内窥镜等。医务工作者需要将这些图像作为科研和教学的?
内容使用。由于图像格式的不同 (与常用的JPEG、TIF、BMP等图像格式不兼容 ) ,?
? 常用图像处理软件不能对其进行显示、处理、和转换。一般需要由PACS将 16位的装 DICOM图像转换成 8位的常用图像格式 ,但转换后的图像会产生信息丢失、图像质?
量下降等问题。 ?
? 本系统主要用于医护人员,医生可以通过Android智能手机终端随时随地的了? 解到病人的病情状况,而且不存在上述所说的问题,并通过对医疗图像进行拖动、旋?
转、放大缩小操作对病人的疾病状况有更准确明白的了解,及时快速准确的提出病订
? 人的病情解决方案,使病人尽早得到及时有效的治疗,减少病人的痛苦并希望在一? 定程度上减低疾病带来的死亡率。 ? 从上面的描述中可以基本了解软件的功能需求: ?
? (1)显示界面:通过文字和图片显示当前的医学图像;
线 (2)对医学图像进行拖动的功能; ? (3)对医学图像进行旋转的功能; ?
(4)对医学图像进行缩放的功能。 ?
? 本系统研究目标: ? (1)了解Android应用程序的设计和开发过程; ?
(2)使用多种组件进行Android手机平台医学图像软件的开发。 ?
? 本软件是基于Java语言、Android SDK开发包,运用Eclipse开发工具开发出? 了针对Android手机平台医学图像拖动、旋转、缩放的系统。 ?
本系统响应速度快、准确率高、信息处理速度快。 ?
? 3.2 系统功能分析 ?
根据方法论,任何矛盾的解决必须经过三个步骤:发现问题,分析问题和解决
问题。该系统的建设也不例外,其第一步是发现系统本身的问题域,也就是发现医
疗图像处理软件需要解决什么问题,能做些什么,这就是挖掘需求。对需求的挖
共 58 页 第 15 页
安徽工业大学工商学院 毕业设计(论文)说明书
掘,最重要的工作,就是对系统的功能进行解剖。把一个复杂的系统分解成为一个
个简单的功能点。该软件主要提供以下功能:
l)为用户提供医疗图像的显示:
当用户启动程序后,能把文件夹raw下文件中存储的各种信息用图像的形式显示
? 出来。 ? 2)为用户提供医疗图像的拖动: ?
该功能通过接受用户所做的操作指示,根据辨识结果,依据拖动算法,使图像达?
? 到相应的拖动效果。
? 3)为用户提供医疗图像的旋转: ? 该功能通过接受用户所做的操作指示,根据辨识结果,依据旋转算法,使图像达?
? 到相应的旋转效果。
? 4)为用户提供医疗图像的缩放: ? 该功能通过接受用户所做的操作指示,根据辨识结果,依据缩放算法,使图像达?
到相应比例大小的缩小放大效果。 ?
装 ? ?
? ?
?
订 ?
?
? ?
?
线 ?
?
?
?
?
?
?
?
?
?
?
?
?
共 58 页 第 16 页
安徽工业大学工商学院 毕业设计(论文)说明书
4 系统总体设计
? 4.1 系统结构图 ?
? 该系统主要有四个功能模块组成,系统结构图如图4-1所示。 ?
?
?
?
?
?
?
?
?
?
装
?
?
?
?
?
订
?
?
?
?
?
线 ? 图4-1 系统结构图 ?
? 4.2 系统功能模块
?
? 4.2.1 医疗图像的显示功能模块 ?
? 这部分模块实现的功能主要是DICOM3.0标准的医疗文件的图像的显示。当用户? 启动程序后,能把文件夹raw下文件中存储的各种信息用图像的形式显示出来。 ?
? 4.2.2 医疗图像的拖动功能模块 ?
? 这部分模块实现的功能主要是:在显示功能模块的基础上,对图像进行拖动操作,
? 实现对DICOM3.0标准的医疗文件的图像的拖动。该功能通过接受用户所做的操作指
示,根据辨识结果,依据拖动算法,使图像达到相应的拖动效果。
4.2.3 医疗图像的旋转功能模块
这部分模块实现的功能主要是:在显示功能模块的基础上,对图像进行旋转操
共 58 页 第 17 页
安徽工业大学工商学院 毕业设计(论文)说明书
作,实现对DICOM3.0标准的医疗文件的图像的旋转。该功能通过接受用户所做的操
作指示,根据辨识结果,依据旋转算法,使图像达到相应的旋转效果。
4.2.4 医疗图像的缩放功能模块
这部分模块实现的功能主要是:在显示功能模块的基础上,对图像进行缩小放大? ? 操作,实现对DICOM3.0标准的医疗文件的图像的缩放。该功能通过接受用户所做的
? 操作指示,根据辨识结果,依据缩放算法,使图像达到相应比例大小的缩小放大效果。 ? 综上所述,该软件系统主要由四个功能模块实现,分别是图像的显示、图像的拖?
动、图像的旋转、图像的缩放。图像的拖动、 旋转、缩放功能都是在图像的显示功? ? 能基础上实现的。 ? ? 4.3 显示界面规划
?
软件显示界面规划如图4-2所示。 ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? 图4-2 软件显示界面规划 ? ? 单个医疗图像显示界面规划如图4-3所示。 ? ? ? ?
共 58 页 第 18 页
安徽工业大学工商学院 毕业设计(论文)说明书
? ? ? ? ? ? ? ? ? ? ? 图4-3 单个医疗图像显示界面规划图 ? ? 软件启动后,进入图4-2所示的界面,实现DICOM标准的医疗文件图像的显示。装
通过单触点点击,可由图4-2跳转到图4-3所示的界面。基于图4-3所示的界面,通? ? 过单触点的移动可实现医疗图像的拖动功能。并且基于图4-3所示的界面,通过双触
? 点的移动缩放还可实现医疗图像的旋转和缩放功能。 ? ?
订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ?
共 58 页 第 19 页
安徽工业大学工商学院 毕业设计(论文)说明书
5 详细设计与实现
? 5.1 文件结构与用途
?
在程序开发阶段,首先确定“Android手机平台医疗图像处理软件”的工程名?
? 为DICOMImageOperation,据程序模块设计的内容,建立DICOMImageOperation工? 程。DICOMImageOperation工程源代码的结构如图5-1所示。 ?
?
?
?
?
?
?
?
装
?
?
?
?
?
订
?
?
?
?
? 线
图5-1 DICOMImageOperation工程的源代码文件 ?
? 为了使源代码文件的结构更加清晰,DICOMImageOperation工程设置了多个命?
? 名空间,分别用来实现对图像的各种操作、图像信息的存储,源代码文件的名称以及? 说如表5-1所示。 ? 表5-1 DICOMImageOperation工程的文件用途说明 ? 包 名 称 文 件 名 说 明 ?
Xujialei.display Action.java 图像旋转缩放的Activity ?
? Xujialei.display TestDicomDisplay.java 图像显示的Activity ?
Xujialei.display DicomData.java Dicom文件信息获取的Activity ?
? Xujialei.display DicomDic.java Dicom图像信息读取的Activity
Xujialei.display DicomFile.java Dicom图像信息存储的Activity
Xujialei.display ImageData.java Dicom单个元素解读的Activity
共 58 页 第 20 页
安徽工业大学工商学院 毕业设计(论文)说明书
Android的资源文件保存在/res的子
中。其中,/res/raw目录中保存的是
dicom图像文件, /res/values目录中保存的是用来自定义字符串的文件,
/res/layout目录中保存的是界面显示的XML格式的数据文件。所有在程序开发阶段
可以被调用的资源都保存在这些目录中。
? 5.2 系统实现 ?
? 显示界面设置,获得屏幕分辨率。显示界面设计屏幕的高度和宽度,还需要扣除?
控件的高度 ?
? 实现功能代码如下:
? /* 取得屏幕分辨率大小 */ ? DisplayMetrics dm=new DisplayMetrics(); ?
? getWindowManager().getDefaultDisplay().getMetrics(dm);
? displayWidth=dm.widthPixels; ? 屏幕高度须扣除下方Button高度 */ /* ?
displayHeight=dm.heightPixels; 装
? a[0]=a[2]=R.raw.a241; ? a[1]=R.raw.mrabdo; ?
a[3]=R.raw.mrangio; ?
? layout1 = (AbsoluteLayout)findViewById(R.id.layout1);
订
5.2.1 医学图像显示实现的过程 ?
?
DCM是比较常用的DICOM文件名后缀,直接就是一连串的数字或字符串命名的。?
? DCM文件从本质上说是一个关于信息体实例的数据集,主要包括患者、检查、序列和? 图像等信息。文件的结构主要由文件头和文件结构像素数据两大部分组成,文件头又线
分为文件引言和数据集两部分,其中文件引言是由128个全部置为00的字节序列和一?
? 个长度为4个字节的字符串组成。数据集是整个文件中信息量最大的部分,囊括了所? 有信息实体(患者、图像、检查等)的信息,结构也最为复杂,文件最后的图像数据表? 示像素,数据结构单一,因此解读文件实际上就是解读数据集。 ?
? 功能实现代码如下:
? if(!jpeg_flag){ ? tmpValue = new ?
byte[dicomData.getValue("(7fe0,0010)").length]; ?
? ? System.arraycopy(dicomData.getValue("(7fe0,0010)"), 0, tmpValue, ?
0, tmpValue.length);
}else{
TmpValue = new
byte[dicomData.getValue("(fffe,e000)").length];
共 58 页 第 21 页
安徽工业大学工商学院 毕业设计(论文)说明书
System.arraycopy(dicomData.getValue("(fffe,e000)"), 0,
tmpValue, 0, tmpValue.length);
try{
? bitmap=BitmapFactory.decodeByteArray(tmpValue, 0, ? tmpValue.length); ?
?
? }
? catch(Exception e){ ? System.out.println("ImageData.Exception: " + ?
? e.getMessage() );
? } ? } ?
if(jpeg_flag){ ?
装 int k = 0; ? if(dicomData.isContain("(0028,0004)") && ?
dicomData.getAnalyzedValue("(0028,0004)").trim().equals("RGB")) { ?
? rgbMode = true;
? for(int i=0;i
0) {
for(int i=0; i>
bit_gap);
}
共 58 页 第 23 页
安徽工业大学工商学院 毕业设计(论文)说明书
}
图像显示如5-2所示:
?
?
?
?
?
?
?
?
?
?
?
?
?
装
?
?
?
?
? 订 图5-2 软件显示界面 ?
?
? 5.2.2 医学图像拖动实现的过程 ?
? 算法:拖动操作时,只是改变图像的起始坐标,图像的高度和宽度保持不表,图线 像的其他三个坐标可简单的根据加减得到。 ?
功能实现代码如下: ?
? if(mode == DRAG)
? { ?
layout1.removeView((ImageView)findViewById(id)); ?
? mImageView.setId(id); ? mImageView.setLayoutParams ?
( new AbsoluteLayout.LayoutParams (getwidth, ?
? getheight,x_x,y_y));
? layout1.addView(mImageView); ?
layout1.removeView((ImageView)findViewById(id));
mImageView.setId(id);
mImageView.setLayoutParams
( new AbsoluteLayout.LayoutParams (getwidth,
共 58 页 第 24 页
安徽工业大学工商学院 毕业设计(论文)说明书
getheight,x_x=x_x+(int)event.getX()-mx,y_y=y_y+(int)e
vent.getY()-my));
layout1.addView(mImageView);
? } ? 图像显示如5-3所示。 ?
?
?
?
?
?
?
?
?
?
?
装
?
?
?
?
?
订
?
?
?
?
?
线
? ? 图5-3 软件图像移动界面 ?
? 5.2.3 医学图像旋转实现的过程
?
? 图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过
? 程。当然这个点通常就是图像的中心。既然是按照中心旋转,自然会有这样一个属?
性:旋转前和旋转后的点离中心的位置不变. ?
? 根据这个属性,我们可以得到旋转后的点的坐标与原坐标的对应关系。由于原?
图像的坐标是以左上角为原点的,所以我们先把坐标转换为以图像中心为原点。假?
? 设原图像的宽为w,高为h,(x,y)为原坐标内的一点,转换坐标后的点为(x,001
y)。那么不难得到: 1
x = x - w/2; y = -y + h/2; 1010
共 58 页 第 25 页
安徽工业大学工商学院 毕业设计(论文)说明书
在新的坐标系下,假设点(x,y)距离原点的距离为r,点与原点之间的连线00
与x轴的夹角为b,旋转的角度为a,旋转后的点为(x,y), 如图5-4所示。 11
?
? ?
?
?
? ? ?
?
? 图5-4 ? ?
那么有以下结论: ?
装 x=rcosb;y=rsinb 00? xrcos(b-a) = rcosbcosa+rsinbsina=xcosa+ysina; 1 = 00?
y=rsin(b-a)=rsinbcosa-rcosbsina=-xsina+ycosa; ? 100
? 得到了转换后的坐标,我们只需要把这些坐标再转换为原坐标系即可。这里还? 有一点要注意,旋转后的图像的长和宽会发生变化,因此要计算新图像的长和宽。 订
功能实现代码如下: ?
? private void rotate()
? { ?
int bmpWidth=bmp.getWidth(); ?
线 int bmpHeight=bmp.getHeight(); ? if(aftertangent0&&Math.abs(gapLenght)<0.5&&Math.abs(Math.
atan(Math.abs(aftertangent))-Math.atan(Math.abs(beforetangent)))>
0)
{
? rotate();
? num++; ?
break; ?
? }
? else if(Math.abs(gapLenght)>0f) ? { ?
? if(gapLenght>0)
? { ? layout1.removeView((ImageView)findViewById(id)); ?
mImageView.setId(id); ?
装 mImageView.setLayoutParams ? ( new ?
AbsoluteLayout.LayoutParams ?
? (getwidth=getwidth+(int)(bmp.getWidth()*0.08),
? getheight=getheight+(int)(bmp.getHeight()*0.08),x_x,订
y_y)); ?
? layout1.addView(mImageView); ? layout1.removeView((ImageView)findViewById(id)); ?
mImageView.setId(id); ?
线 mImageView.setLayoutParams
? ( new ?
AbsoluteLayout.LayoutParams (getwidth, ?
? getheight,x_x=x_x-(int)(bmp.getWidth()*0.04),y_y=y_y-(? int)(bmp.getWidth()*0.04))); ?
layout1.addView(mImageView); ?
? }
? else { ? layout1.removeView((ImageView)findViewById(id)); ?
? mImageView.setId(id);
? mImageView.setLayoutParams
( new AbsoluteLayout.LayoutParams
(getwidth=getwidth-(int)(bmp.getWidth()*0.08),
getheight=getheight-(int)(bmp.getHeight()*0.08),x_x,
共 58 页 第 30 页
安徽工业大学工商学院 毕业设计(论文)说明书
y_y));
layout1.addView(mImageView);
layout1.removeView((ImageView)findViewById(id));
mImageView.setId(id);
? mImageView.setLayoutParams
? ( new AbsoluteLayout.LayoutParams (getwidth, ?
getheight,x_x=x_x+(int)(bmp.getWidth()*0.04),y_y=y_y?
? +(int)(bmp.getWidth()*0.04)));
? layout1.addView(mImageView); ? } ?
? beforeLenght = afterLenght;
? beforetangent= aftertangent; ? } ?
} ?
装 ?
?
?
?
?
订
?
?
?
?
?
线
?
?
?
?
?
?
?
?
?
?
?
?
?
共 58 页 第 31 页
安徽工业大学工商学院 毕业设计(论文)说明书
6 软件测试
在开发软件的过程中,人们使用了许多保证软件质量的方法分析、设计和实现?
? 软件,但难免还会在工作中犯错误。这样,在软件产品中就会隐藏许多错误和缺? 陷,尤其是对规模大、复杂性高的软件更是如此。所以,必须进行认真、计划、彻?
底的软件测试。 ?
? 6.1 什么是软件测试 ?
? 软件测试就是在软件投入运行前,对软件需求分析、设计规格说明书和编码的? 最终复审,是软件质量保证的关键步骤。确切的说,软件测试就是为了发现错误而?
? 执行的过程。一般分为两个阶段:(1)单元测试:在编完某一模块后进行测试(2)? 综合测试:在开发完软件后进行系统测试。即使经过最严格的测试之后,仍然可能? 还有没被发现的错误隐藏在程序中。测试只能查找程序中的错误,不能证明程序中装
没有错误。 ?
?
6.2 软件测试的规则 ?
? 软件测试的目的是想以最少的时间和人力找出软件中潜在的错误和缺陷。一个?
成功的软件应该不怕挑剔的用户进行测试。如果成功的实施了测试,就能够发现软订
? 件存在的错误。根据这样的测试目的,软件测试的规则应该是: ? 1.应该把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。 ?
2.测试用例应由测试输入数据和与之对应的预期输出结果两部分组成。 ?
? 3.程序员应避免检查自己的程序。
线 4.在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。 ?
5.充分注意测试中的群集现象。 ?
? 6.严格执行测试计划,排除测试的随意性。
? 7.应当对每一个测试结果做全面检查。 ?
8.妥善保存测试计划,测试用例,出错统计和最终分析报告。 ?
? 6.3 软件测试的对象 ?
? 软件测试不等于程序测试。软件测试应贯穿于软件定义与开发的整个周期。所?
以,需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档都应该是?
? 软件测试的对象。
?
6.4 各页面的测试
项目代码编写工作的完成,接下来就是对工程进行测试,步骤结果如下:
(1)启动Android虚拟机
在工程名DICOMImageOperation上点右键,然后选择“Run As”,然后选择
共 58 页 第 32 页
安徽工业大学工商学院 毕业设计(论文)说明书
“Android Application”。 Android虚拟机启动较慢,如图6-1所示。
? ? ?
?
? ? ? ?
? ? ? ?
图6-1 Android虚拟机启动 ?
装 (2)启动应用程序 ? 在程序中选择“DISCOM浏览器”,如图6-2所示。 ?
?
?
?
订
?
?
?
?
?
线
?
?
?
?
?
?
?
?
?
?
? ? 图6-2 软件登陆界面 ?
(3)显示界面:点击上述图标后进入显示界面进行相应操作,如图6-3所示。
共 58 页 第 33 页
安徽工业大学工商学院 毕业设计(论文)说明书
? ? ? ? ? ? ? ? ? ? ? ? ? 装 ? ? ? ?
? 图6-3 软件的显示界面 订 ? (4)在图像可以显示的基础上,对图像进行旋转操作。如图6-4所示,软件成
? 功实现图像的旋转。 ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ?
图6-4 图像的旋转实现
(5)在图像可以显示的基础上,对图像进行移动操作。如图6-5所示,软件成
共 58 页 第 34 页
安徽工业大学工商学院 毕业设计(论文)说明书
功实现图像的移动。
? ? ? ? ? ? ? ? ? ? ? ? ? 装
? 图6-5 图像的缩放实现 ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ?
共 58 页 第 35 页
安徽工业大学工商学院 毕业设计(论文)说明书
结束语
这个基于Android系统的Dicom医疗图片的操作软件在我长时间的努力学习和不?
断的修改尝试和李老师的帮助下,最终还是做完了。 ?
? 在制作这个程序的过程中,我学会了很多知识,比如Android环境的搭建、
? Activity、Service、ContentProvider、SQLite等,但我学会的最重要的一点是,利用?
手头上现有的资源去解决问题,比如说在图书馆查看资料、在网络上寻找解决问题?
? 的方法。
? 虽然,这个软件目前运行良好,也能执行所需要的操作,但是我认为代码的健壮?
性还很差,在整个工程的构思方面也不足,而且用户操作界面还不够灵活„„这些?
? 问题还需要在今后的学习和实践中进行逐一解决。其实,这个软件还是可以进一步扩
? 展的,能够将其功能发展地更加强大,带给用户更好的体验与生活的便捷。 ? 装
? ? ?
? ?
订
? ?
?
? ?
线
? ?
? ? ?
? ? ?
? ?
?
? ?
共 58 页 第 36 页
安徽工业大学工商学院 毕业设计(论文)说明书
致谢
本研究及学位论文是在我的导师李伟老师的亲切关怀和悉心指导下完成的。他 严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着?
我。从课题的选择到项目的最终完成,李老师都始终给予我细心的指导和不懈的支? ? 持。四个多月来,李老师不仅在学业上给我以精心指导,同时还在思想、生活上给
? 我以无微不至的关怀,在此谨向李老师致以诚挚的谢意和崇高的敬意。 ?
在此,我还要感谢在一起愉快的度过大学生活的4栋526各位同门,正是由于你? ? 们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。特别
? 感谢我的同学范礼刚同学,他对本课题做了不少工作,给予我不少的帮助。 ?
在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完? ? 成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢
? 意!最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们! ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ?
共 58 页 第 37 页
安徽工业大学工商学院 毕业设计(论文)说明书
参考文献
[1] 王向辉.Android应用程序开发. 清华大学出版社,2010年3月 ?
? [2] Mark L. Murphy .Beginning Android. Apress,2010年3月 ? [3] 高彩丽、许黎民、袁海等.Android应用开发范例精解.清华大学出版社,2012?
年1月 ?
? [4] 李宁.Android开发完全讲义 ( 第2版).中国水利水电出版社,2012年4月 ? [5] (美)李伟梦著 何晨光、李洪刚译.Android 编程入门经典.清华大学出版社,2012?
年4月 ?
? [6] 李兴华.Android开发实战经典.清华大学出版社,2012年4月 ? [7] 吴亚峰、杜化美、苏亚光.Android编程典型实例与项目开发.电子工业出版社,? 2011年10月 ?
装 [8] (美) Lauren Darcey、 (美) Shane Conder著 袁国忠译.Android应用开发入门? 经典.人民邮电出版社,2012年3月 ? [9] 李宁.Android应用开发实战.机械工业出版社,2012年1月 ?
[10] 刘冰.软件工程实践教程. 机械工业出版社,2012年5月 ?
? [11] Mike Hendrickson,Brian Sawyer.Best Android Apps.O’Reilly,2012年5订 月 ? ? ?
?
?
线 ? ? ?
?
?
? ? ? ?
?
?
?
?
共 58 页 第 38 页
安徽工业大学工商学院 毕业设计(论文)说明书
附录一 部分源代码
package xujialei.display;
import android.app.Activity; import android.content.Context; ? import android.os.Bundle; ? import android.view.View.OnTouchListener; ? import java.io.*; ? import xujialei.display.R; ? import android.graphics.Bitmap;
import android.graphics.Canvas; ?
import android.graphics.Matrix; ?
import android.graphics.Paint; ? import android.graphics.drawable.BitmapDrawable; ? import android.util.DisplayMetrics; ? import android.util.FloatMath; ? import android.view.View; ? import android.widget.GridView; ? import android.widget.ImageView;
import android.widget.LinearLayout; 装
import android.widget.SeekBar; ? import android.widget.TextView; ? import android.view.MotionEvent; ? import android.widget.AbsoluteLayout; ? import android.widget.SeekBar.OnSeekBarChangeListener; ? import android.graphics.Matrix; 订 public class Action extends Activity implements OnSeekBarChangeListener{//
? static final int NONE = 0;
static int num=0; ?
static final int DRAG = 1; //拖动中 ?
static final int ZOOM = 2; //缩放中 ?
static final int BIGGER = 3; //放大ing ?
static final int SMALLER = 4; //缩小ing 线
private int mode = NONE; //当前的事件 ?
public static int getwidth,getheight; ? private static float beforeLenght; //两触点距离 ? private static float afterLenght; //两触点距离 ? private float beforetangent,aftertangent; ? private int ScaleAngle=0; ? private float scale = 0.04f; //缩放的比例 X Y方向都是这个值 越大缩放的越快 ? private ImageView mImageView; ? private Bitmap bmp=null;//bmp object ? /* 相关变量声明 */
? private AbsoluteLayout layout1; ? private static int id=0;
private int displayWidth,angle; ?
private int displayHeight,a; ? private static int mx, my,x_x,y_y;
private float scaleWidth=1;
private float scaleHeight=1;
private Bitmap mBitmap;
private Canvas mCanvas;
private Paint mBitmapPaint;
共 58 页 第 39 页
安徽工业大学工商学院 毕业设计(论文)说明书
Matrix matrix = new Matrix(); //private String fileName=".\\imgLib\\QT\\241.dcm"; static DicomDic dDic;
static DicomFile dFile;
static DicomData dData;
static ImageData iData=null;
private int minWidth = 80; ? //private ImageView imageView; ? private TextView textView1, textView2; ? //private Matrix matrix = new Matrix(); ? ? @Override
? public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) ?
{ if (seekBar.getId() == R.id.seekBar1)// ?
{ ? DisplayMetrics dm=new DisplayMetrics();// ? getWindowManager().getDefaultDisplay().getMetrics(dm); ? displayWidth=dm.widthPixels; ? /* 屏幕高度须扣除下方Button高度 */ ? displayHeight=dm.heightPixels; 装 x_x=displayWidth/8;
? y_y=displayHeight/4;
layout1.removeView((ImageView)findViewById(id)); ?
mImageView.setId(id); ? mImageView.setLayoutParams ? ( new AbsoluteLayout.LayoutParams (mImageView.getWidth(), ? mImageView.getHeight(),x_x+progress-50,y_y+progress-50)); 订 layout1.addView(mImageView); ? textView1.setText("图像位置X:" + mImageView.getLeft() + " 图像Y:" + ? mImageView.getTop());
? }
else if (seekBar.getId() == R.id.seekBar2)// ?
{ ?
Bitmap bitmap = bmp; 线 matrix.setRotate(progress); ? bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), ? bitmap.getHeight(), matrix, true); ? mImageView.setImageBitmap(bitmap); ? textView2.setText(progress + "度");
? }
? }
@Override ?
public void onStartTrackingTouch(SeekBar seekBar) ? { ? ? } ? ? @Override
? public void onStopTrackingTouch(SeekBar seekBar)
{
}
/** Called when the activity is first created. */
@Override
共 58 页 第 40 页
安徽工业大学工商学院 毕业设计(论文)说明书
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.action);
AbsoluteLayout laylout=(AbsoluteLayout) findViewById(R.id.layout1);
/* 取得屏幕分辨率大小 */
Bundle bundle=this.getIntent().getExtras(); ?
a=Integer.parseInt(bundle.getString("key")); ? DisplayMetrics dm=new DisplayMetrics(); ? getWindowManager().getDefaultDisplay().getMetrics(dm); ? displayWidth=dm.widthPixels; ? /* 屏幕高度须扣除下方Button高度 */ ? displayHeight=dm.heightPixels; ? x_x=displayWidth/16;
? y_y=displayHeight/16;
layout1 = (AbsoluteLayout)findViewById(R.id.layout1); ?
?
mImageView=(ImageView)findViewById(R.id.mImageView); ? SeekBar seekBar1 = (SeekBar) findViewById(R.id.seekBar1); ? SeekBar seekBar2 = (SeekBar) findViewById(R.id.seekBar2); ? textView1 = (TextView)findViewById(R.id.textview1); 装 textView2 = (TextView)findViewById(R.id.textview2); ? seekBar1.setOnSeekBarChangeListener(this); ? seekBar2.setOnSeekBarChangeListener(this);
DisplayMetrics dm1 = new DisplayMetrics(); ?
getWindowManager().getDefaultDisplay().getMetrics(dm1); ? //seekBar1.setMax(dm1.widthPixels - minWidth); ? try{ 订 InputStream is = getResources().openRawResource(R.raw.dicom); ? dDic=new DicomDic(is); ? InputStream isDcm=getResources().openRawResource(a);
? dFile=new DicomFile(dDic);
? dData=dFile.load(isDcm);
iData=new ImageData(); ?
iData.setData(dData); 线 bmp=iData.getBitmap();//bmp ? ? /*for(int i=0;i0) ? { 订 mode = ZOOM;
? mx=(int)((event.getX(0)+event.getX(1))/2); ? my=(int)((event.getY(0)+event.getY(1))/2);
?
beforetangent=(event.getX(0)-event.getX(1))/(event.getY(0)-event.getY(1)); ? beforeLenght = spacing(event); ? } 线 break; ? case MotionEvent.ACTION_POINTER_UP: ? mode = NONE;
? break;
case MotionEvent.ACTION_MOVE: ?
if(mode == DRAG) //moving ? { ? layout1.removeView((ImageView)findViewById(id)); ? mImageView.setId(id); ? mImageView.setLayoutParams ? ( new AbsoluteLayout.LayoutParams (getwidth, ? getheight,x_x,y_y)); ? layout1.addView(mImageView);
layout1.removeView((ImageView)findViewById(id)); ?
mImageView.setId(id); ? mImageView.setLayoutParams
( new AbsoluteLayout.LayoutParams (getwidth,
getheight,x_x=x_x+(int)event.getX()-mx,y_y=y_y+(int)event.getY()-my));
layout1.addView(mImageView);
}
共 58 页 第 42 页
安徽工业大学工商学院 毕业设计(论文)说明书
else//rotating { afterLenght = spacing(event);
aftertangent=(event.getX(0)-event.getX(1))/(event.getY(0)-event.getY(1));
float gapLenght = afterLenght - beforeLenght;
? if(Math.abs(gapLenght)>0&&Math.abs(gapLenght)<0.5&&Math.abs(Math.atan(Math.abs(aftertangent)? )-Math.atan(Math.abs(beforetangent)))>0) ? { ? rotate(); ? num++;
? break;
} ?
else if(Math.abs(gapLenght)>0f) ?
{ ? if(gapLenght>0) //zoom large ? { ? layout1.removeView((ImageView)findViewById(id)); ? mImageView.setId(id); ? mImageView.setLayoutParams
装 ( new AbsoluteLayout.LayoutParams
(getwidth=getwidth+(int)(bmp.getWidth()*0.08), ?
? getheight=getheight+(int)(bmp.getHeight()*0.08),x_x,y_y)); ? layout1.addView(mImageView); ? layout1.removeView((ImageView)findViewById(id)); ? mImageView.setId(id); 订 mImageView.setLayoutParams
? ( new AbsoluteLayout.LayoutParams (getwidth, ?
getheight,x_x=x_x-(int)(bmp.getWidth()*0.04),y_y=y_y-(int)(bmp.getWidth()*0.04))); ?
layout1.addView(mImageView); ? } ? 线 else //zoom small ? { ? layout1.removeView((ImageView)findViewById(id)); ? mImageView.setId(id);
mImageView.setLayoutParams ?
( new AbsoluteLayout.LayoutParams ? (getwidth=getwidth-(int)(bmp.getWidth()*0.08), ? ? getheight=getheight-(int)(bmp.getHeight()*0.08),x_x,y_y)); ? layout1.addView(mImageView); ? layout1.removeView((ImageView)findViewById(id)); ? mImageView.setId(id);
? mImageView.setLayoutParams
( new AbsoluteLayout.LayoutParams (getwidth, ?
? getheight,x_x=x_x+(int)(bmp.getWidth()*0.04),y_y=y_y+(int)(bmp.getWidth()*0.04)));
layout1.addView(mImageView);
}
beforeLenght = afterLenght;
beforetangent= aftertangent;
共 58 页 第 43 页
安徽工业大学工商学院 毕业设计(论文)说明书
} } break;
}
return true;
}catch(Exception e) { e.printStackTrace(); }
return true; ? }}); ? } ? private void rotate() ? { ? int bmpWidth=bmp.getWidth(); ? int bmpHeight=bmp.getHeight();
if(aftertangent element names the Activity subclass that ? implements the activity. The icon and label attributes point to resource files containing an ?
icon and label that can be displayed to users to represent the activity. ?
装 The other components are declared in a similar way — elements for ? services, elements for broadcast receivers, and elements for content ?
providers. Activities, services, and content providers that are not declared in the manifest ?
? are not visible to the system and are consequently never run. However, broadcast receivers
? can either be declared in the manifest, or they can be created dynamically in code (as 订
BroadcastReceiver objects)and registered with the system by calling ?
? Context.registerReceiver(). ? For more on how to structure a manifest file for your application, see The Android ?
Manifest.xml File. ?
线 Intent filters
? An Intent object can explicitly name a target component. If it does, Android finds that ?
component (based on the declarations in the manifest file) and activates it. But if a target is ?
? not explicitly named, Android must locate the best component to respond to the intent. It
? does so by comparing the Intent object to the intent filters of potential targets. A ?
component's intent filters inform Android of the kinds of intents the component is able to ?
? handle. Like other essential information about the component, they're declared in the
? manifest file. Here's an extension of the previous example that adds two intent filters to the ? activity: ?
?
?
共 58 页 第 50 页
安徽工业大学工商学院 毕业设计(论文)说明书
?
? ?
?
?
? ? ?
?
? ? ?
?
装 ? ?
?
?
? 订
?
?
? ?
?
线
? ?
?
? ? The first filter in the example — the combination of the action ?
"android.intent.action.MAIN" and the category ?
? "android.intent.category.LAUNCHER" — is a common one. It marks the activity as
? one that should be represented in the application launcher, the screen listing applications ? users can launch on the device. In other words, the activity is the entry point for the ?
? application, the initial one users would see when they choose the application in the
? launcher.
The second filter declares an action that the activity can perform on a particular type
of data.
A component can have any number of intent filters, each one declaring a different set
共 58 页 第 51 页
安徽工业大学工商学院 毕业设计(论文)说明书
of capabilities. If it doesn't have any filters, it can be activated only by intents that
explicitly name the component as the target.
For a broadcast receiver that's created and registered in code, the intent filter is
instantiated directly as an IntentFilter object. All other filters are set up in the manifest.
? For more on intent filters, see a separate document, Intents and Intent Filters.
? ? ? ? ? ? ? ? ? ? ? ? 装 ? ? ? ? ? 订 ? ? ? ? ? 线 ? ? ? ? ? ? ? ? ? ? ? ? ?
共 58 页 第 52 页
安徽工业大学工商学院 毕业设计(论文)说明书
应用程序基础Android Developers
Android应用程序使用Java编程语言开发。aapt工具把编译后的Java代码连同应
用程序所需的其他数据和资源文件一起打包到一个Android包文件中,这个文件使? 用.apk作为扩展名。此文件是分发并安装应用程序到移动设备的载体;是用户下载?
到他们的设备的文件。单一.apk文件中的所有代码被认为是一个应用程序。 ?
? 从多个角度来看,每个Android应用程序都存在于它自己的世界之中: ? 1 默认情况下,每个应用程序均运行于它自己的Linux进程中。当应用程序中?
的任何代码需要被执行时,Android启动此进程,而当不再需要此进程并且其它应用?
? 程序又请求系统资源时,则关闭这个进程。
? 2 每个进程都有其独有的虚拟机(VM),所以应用程序代码与所有其它应用程?
序代码是隔离运行的。 ?
? 3 默认情况下,每个应用程序均被赋予一个唯一的Linux用户ID,并加以权限? 设置,使得应用程序的文件仅对此用户及此应用程序可见——尽管也有其它的方法装 使得这些文件同样能为其他应用程序所访问。 ?
? 1 应用程序组件
? Android的一个核心特性就是一个应用程序可以使用其它应用程序的元素(如果? 那个应用程序允许的话)。例如,如果你的应用程序需要显示一个图片卷动列表,而?
另一个应用程序已经开发了一个合用的而又允许别的应用程序使用的话,你可以直订
? 接调用那个卷动列表来完成工作,而不用自己再开发一个。你的应用程序并没有吸? 纳或链接其它应用程序的代码。它只是在有需求的时候启动了其它应用程序的那个?
功能部分。 ?
? 为达到这个目的,系统必须能够在一个应用程序的任何一部分被需要时启动一线 个此应用程序的进程,并将那个部分的Java对象实例化。因此,不像其它大多数系?
统上的应用程序,Android应用程序并没有为应用程序提供一个单独的入口点(比如?
? 说,没有main()函数),而是为系统提供了可以实例化和运行所需的必备组件。一共? 有四种组件类型: ?
1 Activity ?
? activity是为用户操作而展示的可视化用户界面。例如,一个activity可以展示一? 个菜单项列表供用户选择,戒者显示一些包含说明文字的照片。一个短消息应用程?
序可以包括一个用于显示要发送消息到的联系人列表的activity,一个给选定的联系?
? 人写短信的activity以及翻阅以前的短信或改变设置的其他activity。尽管它们一起组? 成了一个内聚的用户界面,但其中每个activity都不其它的保持独立。每一个都实现? 为以Activity类为基类的子类。
一个应用程序可以只有一个activity,戒者,如刚才提到的短信应用程序那样,
包含很多个。每个activity的作用,以及有多少个activity,当然是取决于应用程序及
其设计的。一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第
共 58 页 第 53 页
安徽工业大学工商学院 毕业设计(论文)说明书
一个看到的。从一个activity转向另一个靠的是用当前的activity启动下一个。
每个activity都被给予一个默认的窗口以进行绘制。一般情况下,这个窗口是满
屏的,但它也可以是一个小的位于其它窗口之上的浮动窗口。一个activity也可以使
用附加窗口——例如,一个在activity运行过程中弹出的供用户响应的对话框,戒是
? 一个当用户选择了屏幕上特定项目后显示的必要信息的窗口。 ? 窗口显示的可视内容是由一系列层次化view构成的,这些view均继承自 View ?
基类。每个view均控制着窗口中一块特定的矩形区域。父级view包含并组织其子?
? view的布局。叶节点view(位于层次结构最底端)在它们控制的矩形区域中进行绘? 制,并对用户直达其区域的操作做出响应。因此,view是activity与用户进行交互的? 界面。例如,view可以显示一个小图片,并在用户指点它的时候产生动作。Android?
? 有一些预置的view供开发者使用——包括按钮、文本域、滚动条、菜单项、复选框? 等等。 ? view层次结构是由Activity.setContentView() 方法放入activity的窗口之中的。?
content view是位于层次结构根位置的View对象。(参见独立的用户界面文档以获取?
装 关于view及层次结构的更多信息。) ? 2 Service ?
service没有可视化的用户界面,而是在一段时间内在后台运行。例如,一个?
? service可以在用户做其它事情的时候在后台播放背景音乐、从网络上获取数据或者? 计算一些东西并提供给需要这个运算结果的activity使用。每个service都继承自订
Service基类。 ?
? 一个媒体播放器播放播放列表中的曲目是一个不错的例子。播放器应用程序可? 能有一个或多个activity来给用户选择歌曲并进行播放。然而,音乐播放这个任务本?
身不应该由任何activity来处理,因为用户期望即使在他们离开播放器应用程序而开?
线 始做别的事情时,音乐仍在继续播放。为达到这个目的,媒体播放器activity可以启? 动一个运行于后台的service。系统将在这个activity不再显示于屏幕乀后,仍维持音?
乐播放service的运行。 ?
? 连接至(绑定到)一个正在运行的service(如果service没有运行,则启动之)? 是可能的。连接之后,你可以通过那个service暴露出来的接口不service进行通讯。?
对于音乐service来说,这个接口可以允许用户暂停、回退、停止以及重新开始播?
? 放。
? 如同activity和其它组件一样,service运行于应用程序进程的主线程内。所以它? 不会对其它组件或用户界面有任何妨碍,它们一般会派生一个新线程来执行一些时?
? 间消耗型任务(比如音乐回放)。参见稍后的进程和线程。
? 3 Broadcast receiver
broadcast receiver是一个与注于接收广播通知信息,并做出相应处理的组件。许
多广播是由系统代码产生的——例如,通知时区改变、电池电量低、拍摄了一张照
片或者用户改变了语言选项。应用程序也可以发起广播——例如,通知其它应用程
共 58 页 第 54 页
安徽工业大学工商学院 毕业设计(论文)说明书
序一些数据已经下载到设备上并处于可用状态。
一个应用程序可以拥有任意数量的broadcast receiver,以对所有它认为重要的通
知信息予以响应。所有的receiver均继承自BroadcastReceiver基类。
broadcast receiver没有用户界面。然而,它们可以启动一个activity来响应它们
? 收到的信息,或者也可以使用NotificationManager来通知用户。通知可以用多种方? 式来吸引用户的注意力??闪动背光灯、震动设备、播放声音等等。通知一般是在?
状态栏上放一个持丽的图标,用户可以打开它并获取消息。 ?
? 4 Content provider
? content provider将一些特定的应用程序数据供给其它应用程序使用。数据可以? 存储于文件系统、SQLite数据库或其它有意丿的方式。content provider继承于?
? ContentProvider 基类,实现了一套使得其他应用程序能够检索和存储它所管理的类? 型数据的标准方法。然而,应用程序并不直接调用返些方法,而是使用一个 ? ContentResolver 对象,调用它的方法作为替代。ContentResolver可以与任何content ?
provider进行会话;与其合作对任何相关的进程间通讯进行管理。 ?
装 参阅独立的Content Providers文档以获得更多关于使用content provider的信息。 ? 每当出现一个需要被特定组件处理的请求时,Android会确保那个组件的应用程?
序进程处于运行状态,必要时会启动它,并确保那个组件的一个合适的实例可用,?
? 必要时会创建那个实例。
? 1.1激活组件:intent 订
当接收到ContentResolver发出的请求后,content provider被激活。而其它三种?
? 组件——activity、service和broadcast receiver,被一种叫做intent的异步消息所激? 活。intent是一个保存着消息内容的Intent对象。对于activity和service来说,它指?
明了所请求的操作名称,并指定了用来操作的数据的URI和其它一些信息。例如,?
线 它可以承载一个对一个activity的请求,让它为用户显示一张图片,或者让用户编辑? 一些文本。而对于broadcast receiver来说,Intent对象指明了所通报的操作。例如,?
它可以对所有感兴趣的对象通报照相按钮被按下。 ?
? 对于每种组件来说,激活的方法是不同的:
? 1 通过传递一IntentContext.startActivity()Activity.startActivityForResult(以?
启动(或指定新工作给)一个activity。相应的activity可以通过调用自身的 getIntent() ?
? 方法来查看最刜激活它的intent。Android通过调用activity的onNewIntent()方法来传? 递给它随后的任何intent。 ? 一个activity经常启动另一个activity。如果它期望它所启动的那个activity迒?
? 回一个结果,它会调用startActivityForResult()而不是startActivity()。例如,如果它启? 动了另外一个activity以使用户挑选一张照片,它也许想知道哪张照片被选中了。其
结果将会被封装在一个Intent对象中,并传递给发出调用的activity的
onActivityResult() 方法。
2 通过传递一个Intent对象至Context.startService()以启动一个service(或向正在
共 58 页 第 55 页
安徽工业大学工商学院 毕业设计(论文)说明书
运行的service给出一个新的指令)。Android调用此service的 onStart()方法并将
Intent对象传递给它。
与此类似,一个intent可以被传递给 Context.bindService()以建立一个处于调用
组件和目标service乀间的活动连接。此service会通过onBind() 方法的调用来获取此
? Intent对象(如果此service尚未运行,bindService()会先启动它)。例如,一个activity? 可以建立一个不前述的音乐回放service的连接,这样它就可以提供给用户一些途径?
(用户界面)来控制回放。这个activity可以调用 bindService()来建立此连接,然后?
? 调用service中定之的方法来控制回放。
? 稍后的远程方法调用一节有关于如何绑定至一个service的更多细节。 ? 3 应用程序可以通过传递一个Intent对象至 Context.sendBroadcast() ,?
? Context. sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它类似方法? 来发起一个广播。Android会调用所有对此广播有兴趣的broadcast receiver的 ? onReceive()方法,将此intent传递给它们。 ?
1.2 关闭组件 ?
装 content provider仅在响应来自ContentResolver的请求时处于活动状态。而? broadcast receiver仅在响应一条广播信息的时候处于活动状态。所以没有必要去显式?
地关闭返些组件。 ?
? 而activity则不同,它提供了用户界面。只要会话依然持续,无论会话过程有无? 空闲,activity同用户进行长时间会话且可能一直处于活动状态。与此相似,service订
也会在很长一段时间内保持运行。所以Android为关闭activity和service提供了一系?
? 列有序的方法。
? activity可以通过调用自身的finish()方法来关闭。一个activity可以通过调用?
finishActivity()方法来关闭另外一个activity(它用startActivityForResult() 启动的)。 ?
线 service可以通过调用自身的stopSelf()方法,或调用 Context.stopService()来? 停止。 ?
系统也会在组件不再被使用的时候戒者当Android必须为更多的活动组件回收内?
? 存时关闭它。稍后的组件的生命周期一节,将对返种可能性及结果进行更详细的认? 论。 ?
1.3 manifest文件 ?
? 当Android启动一个应用程序组件之前,它必须知道那个组件是存在的。因此,? 应用程序会在一个被打包到Android包中的manifest文件中声明它的组件,.apk文件? 还将涵括应用程序的代码、文件以及其它资源。 ?
? manifest文件是一个结构化的XML文件,而且对于所有应用程序,文件名总是? AndroidManifest.xml。除了声明此应用程序各个组件,它会做很多其他工作,比如
指明应用程序所需链接到的库的名称(除了默认的Android库乀外)以及标出应用程
序期望获得的各种权限。
但manifest文件最重要的任务是向Android报告此应用程序的各个组件。丼例说
共 58 页 第 56 页
安徽工业大学工商学院 毕业设计(论文)说明书
明,一个activity可能声明如下:
?
?
?
?
?
?
?
?
?
?
?
? ? 元素的name属性指定了实现此activity的 Activity子类。icon和label装 属性指向包含展示给用户的此activity的图标和标签的资源文件。 ?
其它组件也以类似的方法声明—— 元素用于声明service, ?
? 元素用于声明broadcast receiver,而 元素用于声明content provider。未? 在manifest文件中进行声明的activity、service以及content provider将不为系统所见,?
从而也就永不会被运行。然而,broadcast receiver既可以在manifest文件中声明,也订
? 可以在代码中动态创建(为BroadcastReceiver对象),并以调用? Context.registerReceiver()的方式注册至系统。 ?
1.4 Intent过滤器 ?
? 一个Intent对象可以显式地指定一个目标组件。如果进行了返种指定,Android线 会找到这个组件(基于manifest文件中的声明)并激活它。但如果intent没有显式地?
指定一个目标,Android就必须找到最合适的组件来响应此intent。这个过程是通过?
? 比较Intent对象和所有潜在目标的intent过滤器完成的。组件的intent过滤器会通知? Android它所能处理的intent类型。如同组件的其它必要信息一样,这些intent过滤? 器是在manifest文件中进行声明的。返里有一个对先前例子的扩展,其中加入了针?
? 对activity的两个intent过滤器:
?
?
?
?
?
?
共 58 页 第 57 页
安徽工业大学工商学院 毕业设计(论文)说明书
?
?
?
?
?
?
?
?
?
?
?
?
?
装
?
?
?
?
?
订 ? 示例中的第一个过滤器——action“android.intent.action.MAIN”和? category“android.intent.category.LAUNCHER”的组合——是常见的一个。它标明了此?
activity应该在应用程序启动器中显示,就是用户在屏幕上看到的此设备上可供启动?
? 的应用程序的列表。换句话说,这个activity是应用程序的入口点,是用户在启动器线 中选择运行这个应用程序后所见到的第一个activity。 ?
第二个过滤器声明了此activity在一种特定类型的数据上可以执行的操作。 ?
? 一个组件可以拥有任意数量的intent过滤器,每个都声明了一套不同的功能。如? 果组件没有包含任何过滤器,它只能被显式地指明作为目标组件的intent激活。 ?
对于在代码中创建并注册的broadcast receiver来说,intent过滤器将被直接实例?
? 化IntentFilter为对象。其它所有的过滤器都在manifest文件中设置。 ?
? ?
?
?
?
共 58 页 第 58 页