版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
...wd......wd......wd...摘要在科技日益兴旺的今天,社会竞争越来越剧烈,这要求人们不断的获取信息来充实自己。这就要求人们能随时随地的了解并获取所需的信息。与此同时,手机的功能越来越强大,将脱离传统的打、发短信等根本的功能,在这种情况下,新闻阅读器可以满足人们对外界信息了解的需求。本系统是在Android平台下设计的,在GoogleAndroid平台的SDK2.1环境下,运用Eclipse进展开发。论文概括的介绍了Android开发的流程,并重点的介绍了基于Android平台的RSS阅读器的开发过程。论文首先介绍了课题的研究背景、研究现状和主要研究内容;然后对系统中用到的理论知识和相关技术进展了详细的阐述,包括Android平台的相关理论知识、Android环境的搭建、数据源的选取、数据的解析方法以及系统的详细实现过程。系统选用了新浪RSS源以及pull解析方法。系统完成以后,可以实现RSS阅读器的根本功能,论文阐述了具体实现方法以及相应的关键代码段。本课题完成设计实现的系统已经试运行正常。用户使用该系统可以方便、及时的阅读到自己感兴趣的新闻关键词:RSS阅读器,Android操作系统,Pull解析算法AbstractIt'smoreadvancedintechnologytoday,andthesocialcompetitionismoreandmorefierce,whichrequiresconstantaccesstoinformationtopeopletoenrichthemselves.Atthesametime,mobilephonesbecomemoreandmorepowerful,willbreakawayfromtraditionalphonecalls,sendingmessagesandotherbasicfunctions.Inthiscase,thenewsreaderistomeetthepeople'sunderstandingoftheneedsofoutsideinformation.ThissystemisdesignedintheAndroidplatform,comeswiththeGoogleAndroidPlatformSDK2.1environment,theuseofEclipsefordevelopment.ThispaperdescribesthegeneralprocessofAndroiddevelopment,andfocusontheintroductionoftheAndroidplatform-basedRSSreaderdevelopmentprocess.Thispaperintroducestheresearchbackground,currentsituationandmaincontent;andthendescribesthetheoreticalknowledgeandrelatedtechnologiesusedinthesystemindetail,includingthetheoryofAndroidplatform,buildingAndroidenvironment,theselectionofdatasources,dataanalyticalmethodsandthedetailedimplementationprocess.ThesystemselectsSinaRSSsourceandPullparsingmethod.Aftercompletingthesystem,youcanachievethebasicfunctionsofRSSReader,thepaperdescribesthespecificimplementationmethodandthecorrespondingkeycode.Thedesignandimplementationofthesystemhasbeentestrunnormally.Userscaneasilyusethesystem,readtimelynewsofpersonalinterest.Keywords:RSSreader,AndroidOperatingSystem,Pullparsingmethod目录TOC\o"1-2"\h\z\u摘要IAbstractII1绪论11.1课题背景11.2课题研究的目的和意义21.3研究现状32Android相关理论知识62.1Android平台介绍62.2Android开发环境的搭建143相关技术理论193.1RSS技术简介193.2Pull解析算法研究204Android平台下RSS阅读器的详细分析设计与实现224.1问题的提出224.2解决方案234.3主要功能详细设计与实现245总结与展望395.1本文工作总结395.2下一步工作展望39致谢40参考文献41绪论课题背景现在手机已经成为了人们生活中不可或缺的通讯设备,没有手机有时会让人觉得寸步难行。手机将脱离传统的打、发短信等根本的功能,而基于智能手机强大的处理能力和可扩展能力以及3G网络高速数据传输,越来越多的功能和业务将被开发出来并大规模的应用。正因为如此,当全世界的目光聚焦的时候,Google于2007年11月5日宣布推出基于Linux平台的开源手机操作系统,号称首个为移动终端打造的真正开发和完整的移动软件——Android。Android是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟〔OpenHandsetAlliance〕开发。它采用了软件层(softwarestack,又名以软件叠层)的构架,主要分为三局部。底层以Linux内核作为根基,由C语言开发,只提供根基功能。中间层包括函数库Library和虚拟机VirtualMachine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,由Java编写。Android不仅仅只是一个操作系统,它包括了:1、经过Google剪裁和调优的LinuxKernel,对于掌上设备的硬件提供了很好的支持。Google在Linux方面的应用能力不容置疑,Google公司几乎所有的几十万服务器全部是自己修改正的Linux操作系统。2、经过Google修改的Java虚拟机Dalvik,是基于ApacheHarmony虚拟机版本进展改进而来,能够提供极高的执行性能。有了Java虚拟机,大局部Java核心类库都已经可以直接运行。3、大量立即可用的类库和应用软件,例如浏览器Webkit,数据库SQLite,让你可轻易开发出来媲美于桌面应用复杂度的手机软件。4、Google已经开发好了大量现成的应用软件,同时可以直接使用Google很多在线服务。5、Google提供了基于Eclipse的完整开发环境、模拟器、文档、帮助、例如等将极大推动Android快速的推广和开展。基于Android众多的优点,围绕Android形成了一个移动手机联盟,主要的手机厂商几乎全部在列,而此联盟在极大的推动Android平台的推广和开展,在未来的几年必将大方异彩,将极大的推动整个手机操作系统甚至是互联网乃至软件行业的开展。课题研究的目的和意义Android这个平台对于Google对于群众的意义不在于手机本身,Android存在的目的也不在于挑起手机操作系统之间的混战,而在于推动移动互联网产业链的迅速成型。具有开源特性的Android平台打破了之前Symbian、windowsmobile等操作系统收取高额的授权费用的模式,使得只能手机本钱大大的降低;而正是由于它开发源代码,使得手机产生更多个性化的应用。同时,合作方能够在这里得到利润或者创造价值,手机软件行业得到维护协调开展。以Google、苹果和诺基亚为中心各自形成的生态链将以原来数倍的速度推动移动互联网的开展,这正是Google推出Android平台的意义,也是Android平台存在的使命。而作为Android平台成员之一的中国移动也投资成立了一家通讯公司,专门从事Google手机软件的应用以及本地化的软件的开发,比方将在Google手机平台上添加飞信、输入法等一系列符合国内用户使用特色的功能。国内众多企业也将眼光投入到Android上面,并启动了相关的方案来深入的理解并开展Android。更多的手机软件开发企业已经或者筹备着将公司进展转型,从其方向的开发转向到Android的开发。综上所述,无论是在国内还是在国外,Android平台对手机软件行业和移动手机平台将发挥极大地推动作用,而在未来的几年或者一段时间内,Android将越发的凸显自己的重要性。基于此,我们有必要通过进展相关的研究来了解Android平台,来了解开发Android的那一大批人的先进的理念和思想,并通过这些来了解手机软件行业,进而了解未来无移动互联网的开展趋势,从而更好的适应时代的需要。研究现状本节对各大站点对RSS的支持情况以及现有RSS阅读器进展了分析和综合,提出了系统实现可以借鉴的地方。各种站点对RSS的支持情况目前支持RSS的站点主要分为下面几种:新闻资讯类站点、BSP站点、独立博客站点、其他站点。新闻资讯类站点指的是传统的门户网站,这类门户网站一般是站长管理式的,信息涉及非常广泛、来源比拟集中、权威性比拟高,一直受到传统互联网用户的青睐。用户可以从这一类网站了解到各种需要的综合信息。几大典型的例子有新浪门户、搜狐门户和腾讯门户等等。为了迎合用户的需要这类网站一般也有推出RSS订阅功能,这类网站的信息更新非常频繁、信息量也比拟巨大,因此,用户不怎么倾向于订阅此类网站。BSP站点,即Blogserviceprovider〔博客服务提供商〕,这类站点为用户提供博客服务,除了提供根本的博客添加、评论之外,大局部BSP都会针对某个博客提供RSS订阅功能。比方新浪博客和博客园等等。这类网站在RSS信息更新方面的特点是:更新相对不频繁、也不规律。但是用户比拟倾向于订阅这类网站,因为许多博客的话题是针对某一特定领域的,而用户的阅读倾向往往也是针对某一领域的。独立博客站点,指的是博主自己申请域名,自己开通并且自己维护的博客。这类博客站点一般使用已有的博客系统〔比方wordpress〕,而这些博客系统一般都会提供RSS订阅功能。在信息方面,独立博客一直是IT从业人员比拟青睐的网站,比方月光博客、小众软件等等。在国外,这一类博客站点更加流行。其他站点,指的是迎合用户特殊需求的站点。这类站点提供了某些定期更新的特殊信息,比方天气预报信息,学校就业信息,学院通知信息。这类信息不适合所有用户,但就算如此,提供RSS订阅服务能使得关心它的用户一劳永逸。这类信息更新的频繁度往往没有什么规律。对RSS源站点信息,我们总结如表1.1所示:表SEQ表格\*ARABIC1.1各种RSS源网站情况比照RSS源站点用户群体RSS支持程度更新频繁程度新闻门户群众用户一般频繁BSP站点专注某个领域的用户好不频繁独立博客站点专业用户非常好不频繁其他站点具有特殊需求的用户不好不确定移动阅读器实现方案离线阅读器离线RSS阅读器主要指的是用一个客户端软件进展RSS阅读,例如浏览器自带的RSS阅读,以及桌面RSS阅读器。这类阅读器的主要优点是:〔1〕通过本地缓存将内容呈现给用户,使得RSS阅读不受网络影响。〔2〕响应速度快,加载速度快。它的主要缺点是:〔1〕RSS信息的获取由客户端完成,增加了客户端的处理负担。〔2〕由于订阅信息都在本地,因此不便于用户转移数据。对手机来说,计算能力和内存空间属于稀缺资源,因此离线RSS阅读器实现方案并不适合手机。此外,离线阅读器的实现方案和互联网的开展趋势也是背道而驰的。在线阅读器在线阅读器大多是通过浏览器访问的一类阅读器,对于在线阅读器来说,各个订阅网站信息的获取是由提供服务的一方完成的,客户端只负责接收服务端返回的数据并且正确显示。在线阅读器的特点是依靠网络、极大化的减轻客户端的负担、便于用户在不同客户端使用软件及其数据等等。随着web2.0的开展,一些在线RSS阅读器已经进入人们的视野,典型的范例有Google阅读器、鲜果网、抓虾网和哪吒网,这些网站也相继都推出了各自的手机版。这些手机版的RSS阅读器都是我们需要借鉴的。但是,对普通用户来说,RSS是个比拟难以理解的东西〔尤其是在国内〕,因此这类手机阅读器的普及是个重大难题,我们的工作重点,就是屏蔽RSS阅读器的技术细节,给用户提供直观的、全面的、易懂的服务。Android相关理论知识Android平台介绍Android系统简介Android一词的本义指“机器人〞,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称。它包括操作系统、用户界面和应用程序——移动工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。Googleandroid平台的系统构架图如图2.1所示:图2.1Googleandroid平台的系统构架图虽然Android是Google公司推出的产品,但更贴切的说法应该是开放手机联盟的产品。开放手机联盟是由大约30家公司组成的联盟,致力于将“更好的〞和“开放的〞手机推向市场。其网站上的一句话很好的阐述了这一点:“Android是本着成为第一个开放、完整、免费、专门针对移动设备开发的平台这一目标,完全从零开场创立的。〞Android系统架构应用程序Android以Java为编程语言,从接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个Activity类〔class〕负责创立视窗〔window〕,一个活动中的Activity就是在foreground〔前景〕模式,背景运行的程序叫做Service。两者之间通过由ServiceConnection和AIDL连结,到达复数程序同时运行的效果。如果运行中的Activity全部画面被其他Activity取代时,该Activity便被停顿〔stopped〕,甚至被系统去除〔kill〕。View等同于J2ME的Displayable,程序人员可以通过View类与“XMLlayout〞档将UI放置在视窗上,Android1.5的版本可以利用View打造出所谓的Widgets,其实Widget只是View的一种,所以可以使用xml来设计layout,HTC的AndroidHero手机即含有大量的widget。至于ViewGroup是各种layout的根基抽象类〔abstractclass〕,ViewGroup之内还可以有ViewGroup。View的构造函数不需要再Activity中调用,但是Displayable的是必须的,在Activity中,要通过findViewById()来从XML中取得View,Android的View类的显示很大程度上是从XML中读取的。View与事件〔event〕息息相关,两者之间通过Listener结合在一起,每一个View都可以注册一个eventlistener,例如:当View要处理用户触碰〔touch〕的事件时,就要向Android框架注册View.OnClickListener。另外还有Image等同于J2ME的BitMap。中介软件操作系统与应用程序的沟通桥梁,应用分为两层:函数层〔Library〕和虚拟机〔VirtualMachine〕。Bionic是Android改进libc的版本。Android同时包含了Webkit,所谓的Webkit就是AppleSafari浏览器背后的引擎。Surfaceflinger是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的BionicLibc。Android采用OpenCORE作为根基多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideoMultimediaFramework(PVMF)、OperatingSystemCompatibilityLibrary(OSCL)、Common、OpenMAX。Android使用skia为核心图形引擎,搭配OpenGL/ES。skia与LinuxCairo功能相当,但相较于LinuxCairo,skia功能还只是雏形的。2005年Skia公司被Google收购,2007年初,SkiaGL源码被公开,目前Skia也是GoogleChrome的图形引擎。Android的多媒体数据库采用SQLite数据库系统。数据库又分为共用数据库及私用数据库。用户可通过ContentResolver类〔Column〕取得共用数据库。Android的中间层多以Java实现,并且采用特殊的Dalvik虚拟机〔DalvikVirtualMachine〕。Dalvik虚拟机是一种“暂存器型态〞〔RegisterBased〕的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。Dalvik虚拟机可以有多个实例〔instance〕,每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可到达优化。Dalvik虚拟机并非运行Java字节码〔Bytecode〕,而是运行一种称为.dex格式的文件。硬件抽象层Android的HAL〔硬件抽象层〕是能以封闭源码形式提供硬件驱动模块。HAL的目的是为了把Androidframework与Linuxkernel隔开,让Android不至过度依赖Linuxkernel,以达成kernelindependent的概念,也让Androidframework的开发能在不考虑驱动程序实现的前提下进展开展。HALstub是一种代理人〔proxy〕的概念,stub是以*.so档的形式存在。Stub向HAL“提供〞操作函数〔operations〕,并由Androidruntime向HAL取得stub的operations,再callback这些操作函数。HAL里包含了许多的stub〔代理人〕。Runtime只要说明“类型〞,即moduleID,就可以取得操作函数。编程语言Android是运行于Linuxkernel之上,但并不是GNU/Linux。因为在一般GNU/Linux里支持的功能,Android大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic取代Glibc、以Skia取代Cairo、再以opencore取代FFmpeg等等。Android为了到达商业应用,必须移除被GNUGPL授权证所约束的部份,例如Android将驱动程序移到userspace,使得Linuxdriver与Linuxkernel彻底分开。bionic/libc/kernel/并非标准的kernelheaderfiles。Android的kernelheader是利用工具由Linuxkernelheader所产生的,这样做是为了保存常数、数据构造与宏。目前Android的Linuxkernel控制包括安全〔Security〕,存储器管理〔MemoryManagement〕,程序管理〔ProcessManagement〕,网络堆栈〔NetworkStack〕,驱动程序模型〔DriverModel〕等。下载Android源码之前,先要安装其构建工具Repo来初始化源码。Repo是Android用来辅助Git工作的一个工具。Android系统的特点与功能Android系统的特点1、开放性。Google与开放手机联盟合作开发了Android,Google通过与运行商、设备制造商、开发商和其他有关各方面结成深层次的合作伙伴关系,希望通过建设标准化、开放式的移动软件平台,在移动产业形成一个开放式的生态系统。2、应用程序无界限。Android上的应用可以通过标准API访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可以提供应其他应用程序使用。3、应用程序是在平等的条件下创立的。移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件。4、应用程序可以轻松地嵌入网络。应用程序可以轻松地嵌入HTML、JavaScript和样式表,还可以通过WebView显示网络内容。5、应用程序可以并行运行。Android是一种完整的多任务环境,应用程序可以在其中并行运行。在后台运行时,应用程序可以生成通知以引起注意。Android系统的功能1、支持虚拟键盘。虚拟键盘的出现意味着基于Android1.5或以上版本的移动设备可以同时支持物理键盘和虚拟键盘。2、使用Widget实现桌面的个性化。可以用Widget修饰自己的桌面。大多数小的web应用都是从网络上获得实时数据并展示给用户的。Android预装了5个桌面Widget,包括数字时钟、日历、音乐播放器、相框和搜索。3、用在线文件夹快速游览数据。类似于OSXLeopard的QuickLook特征,Android的在线文件夹可显示常见的数据条目,比方联系人、喜欢的应用、E-mail信息、播放列表、书签、RSS源等,并不需要运行系统程序处理特定的数据条目。4、视频录制和分享。Android还有录制和分享视频的功能,对回放和MPEG-4、3GP等视频格式也有了更好的支持。可以通过E-mail、MMS或直接上传到YouTube等方式来分享视频。5、图片上传。在线分享图片需要的点击更少。完成照相后,当浏览图片或选择Google在线图片服务Picasa时,只需轻点“分享〞就会拥有1Gb的免费图片存储空间。6、更快、更兼容的游览器。Android的基于Webkit内核的游览器带来了重要的调速装置(SpeedPumb),这得益于新的Wenkit渲染引擎和优化的Java脚本编译器(SquireFish).7、VoiceSearch语音搜索。带有语音识别技术的Google手机已于2008年11月面世,它支持语音搜索功能。该功能增强了默认的搜索能力,已超过纯文本搜索。8、立体声蓝牙和免提。除了增强的免提体验,Android还支持立体声蓝牙(A2Dphe和AVCRP),并有自动配对功能。9、强大的GPS技术。Android内部提供了大量的GPS组件,我们可以很轻松地获得设备当前的位置等信息,让导航等功能更加完美。10、Android系统硬件检测。Android可自动检测和修复SD卡的文件系统,允许第三方应用显示Android系统的硬件特征。为了让用户下载到与自己的设备匹配的应用,我们可以检测用户设备的硬件信息,让满足应用要求的设备安装该程序,当更多的Android设备建设在不同的硬件上时,这个功能显得很实用。Android平台与iPhone平台的比照过去智能手机市场的领先者是WindowsMobile/SmartPhone和BlackBerry,同时Symbian和Palm也在其中角逐。但随着iPhone横空出世,就以简单易用,并功能强大,作为了智能手机的代名词。近来android也以其开源、免费的特质强势来袭,下面就其孰优孰劣进展一下比照。开发平台的比照对于iPhone平台的开发,首先要熟悉Apple的MACOS或者是Unix系统的开发根基,iPhone的开发工具Xcode并不支持Windows平台,因此开发者首先要拥有一台mac电脑;语言学习方面,熟悉C语言的工程师可以省一点力,因为在Objective-C中,可以直接编写C程序,唯有用户接口的局部,一定得仰赖Objective-C。Android采用java开发,因此Android对系统资源的操作程度已接近PC客户端开发。程序兼容性问题iPhone独此一家,因此可以很好控制应用兼容性问题,而Android平台的手机联盟战略,便有各家厂商的不同规格型号的机器,因而Google通过手机厂商统一硬件的规格手段到达兼容性的平衡。不过,也确实有开发者担忧Android的开放平台,未来难保手机厂商不会因为自身的需求而有所调整,仍可能导致兼容性问题发生。封闭和开放的审核制度封闭和严格的审核一直都是iPhone做为Apple设计理念和保证app质量的评审手段之一,在app应用开发完成,上架AppStore上前,Apple也必须审核软件的内容,以防止包含色情与暴力,或者有Bug的软件,影响整个市集的质量。由于iPhone软件的销售与安装,只能透过AppStore这个唯一的管道,有志进入IPhone市场的开发者,也不得不买账。相较于Apple的封闭,Android就显得开放许多,AndroidMarket则是被动审查机制(只有被足够多的用户举报,Google才会对此进展审核),程序上传几个小时后,使用者就可以下载。事实上开发者不经由AndroidMarket,也有其他途径营销。如:安卓市场。封闭与开放的作法各有好处,由Apple把关且锁定销售管道的作法,对消费者而言,可以确保质量;而开发者也省得比拟各市集之间的优劣。而Android的开放作法,则有不设限的好处──开发者不用担忧Apple因为自身利益的考虑,而驳回软件上架的申请。消费者的选择自由度也高出很多。UI交互上的差异在传统手机时代,用户直接用键盘、按键操作数据。iPhone的操作有别于之前传统手机的体验,iPhone大触摸屏概念推出,用户可以直接对内容进展操作排除其他中间设备控制,降低用户使用门槛,对内容操作也有很直接的体验。Android则保存传统手机的一些特征(返回、搜索、home、menu实体按键),也同样有大触摸屏;两者之间的硬件差异,因此也决定了交互视觉上本质的差异;iPhone遵从Apple精简设计风格,用隐喻的视觉方式提示用户进展使用操作,同样也直观表达下一步的操作流程。大局部操作直接和内容交互完成,用户体验统一连贯,典型案例:解锁。Android有实体按键,承载其余过多的根本操作,将用户停留在最重要的内容上,因为有更多硬件操作,也能有更丰富的表现,典型案例:轨迹球颜色提醒。缺点:局部操作,屏幕与按键之间来回转换。title和导航指引手持移动设备的特性决定屏幕的有限,在应用程序的层级关系中如何指引用户完成操作,便尤为重要。iPhone:应用程序有信息层级关系,iPhone利用title区域进展操作指引,title的左边是返回。让用户明确层级之间的关系。Android:页面的回退依靠实体返回按键,因此title区域不必要操作,在视觉上减小了高度,扩大了内容区域。缺点:没有一个好的导航指引。Android平台开发过程研究Android移动平台作为21世纪的新秀,受到了越来越多的开发者的追捧,在这股开发的浪潮中,逐渐形成了一套具有Android特色的开发流程。由于Android的优越性,其开发显得非常的有规律性可寻。大致的开发流程如下:1、需求分析。作为一个软件,它必须有其存在的意义和价值。而这价值和意义就需要靠需求分析来确定。2、功能分析。作为一个手机软件,它的任务就是给用户使用的。如何提供最好的用户体验就值得每一个程序员深思。这也是衡量一个程序成功与否的关键所在。3、界面设计。作为一个手机软件,它只能在极有限的区域中显示自己。如何在有限的空间里面更完美的展现出自己的独特之处就显得尤为重要了。4、系统开发。作为一个软件的主体局部,系统开发的好坏直接决定了该系统的性能和寿命。5、测试。在任何一个软件开发行业中,无论是J2EE、J2SE、J2ME等等其他开发中,测试时必不可少的一环。在Android开发中,由于手机的高频率使用,和硬件系统上的缺乏,使得对软件的要求更加的严格,这就要求在开发完成后,在对其进展严格的测试。而测试又包括了单元测试、系统测试等等方面的测试。6、发布。在完成了一个系统的开发后,就要将其发布,只有经过广阔用户的考验,才算是一个合格的产品。在Android平台中,Google提供了一套完整的发布机制——Googlemarket。Android开发环境的搭建下载需要用到的工具1、下载JAVA的IDE开发工具–Eclipse到Eclipse官方网站下载EclipseForJavaEE的最新Windows版本下载页面地址::///downloads/,如图2.1所示:图2.1下载Eclipse2、下载Java开发包—JavaSEDevelopmentKit(JDK)JDK6到Sun官方网站下载JDK6,选择JDK6Update12下载页面地址:://java.sun/javase/downloads/index.jsp,如图2.2所示:图2.2下载JDK3、下载Android开发包—AndroidSDK到Google的官方网站下载ForWindows的Android的开发包下载地址:://dl.google/android/android-sdk_r11-windows下载完需要的工具之后,开场安装1、安装Eclipse:下载回来的Eclipse(eclipse-jee-ganymede-SR2-win32.zip)直接解压即可2、安装JDK6:运行下载回来的JSK安装包(jdk-6u25-windows-i586.exe),一路“下一步〞即可3、安装Android开发包(SDK):下载回来的SDK包(android-sdk_r11-windows.zip)直接解压即可让Eclipse自动安装Android开发插件(ADT-plugin)1、启动安装完(解压)后的Eclipse目录下的Ecplise.exe2、点击菜单“Help〞->“SoftwareUpdates〞,在翻开的窗口中切换到选项页“AvailableSoftware〞3、首先点击选项“Addsite…〞,然后手动输入以下地址:://dl-ssl.google/android/eclipse/,点击“OK〞4、刚刚参加的地址,点击“Install…〞进展ADT(AndroidDevelopmentTools)的安装工作。5、Eclipse此时会从参加的地址中自动下载跟安装ADT,稍等一会,安装完毕后,提示需要重启Eclipse,点击“OK〞重启Eclipse。如图2.3所示:配置AndroidSDK路径重启Eclipse后,点击菜单“Window〞->“Preference〞,翻开配置窗口,在左边选中Android,在右边输入AndroidSDK的路径(刚刚步骤下载的AndroidSDK解压出来的目录),点击“OK〞,如图2.4所示:图2.3安装ADT图2.4配置AndroidSDK路径创立AVD为使android应用程序可以在模拟器上运行,必须创立AVD。在eclipse中选择Windows>AndroidSDKandAVDManager,点击左侧面板的VirtualDevices,再右侧点击New。填入Name,选择Target的API,SDCard大小任意〔推荐256M〕,Skin随便选,Hardware目录保持默认值。点击CreateAVD即可完成创立AVD。本系统是在AndroidSDK2.1下完成的。自此Android开发环境搭建完成。相关技术理论RSS技术简介信息传播工具多种多样,包括可以免费收听的无线电播送、公共和有线电视、印刷媒体,甚至包括Internet这样颠覆性的技术,以及其庞大的Web站点和电子邮件订阅。虽然选择很多,但是这些工具都存在一个问题:很难在庞杂的海量数据中准确查找到真正感兴趣的信息和价值。幸运的是,RSS可以帮助我们解决这个问题。RSS是“ReallySimpleSyndication〞的缩写。RSS是一种内容发布者用来发布信息的XML数据格式,这些信息经过了分类并适合人机阅读。RSS提要通常使用诸如新闻阅读器这种人类可读的友好格式进展处理并显示给用户,本教程中构建的应用程序就是这样一种新闻阅读器。RSS提要同样可以供计算机使用,从而生成后续的、聚合的信息源。举例来说,定期检索并提供应旅行社本地预订系统的租赁列表就是一个机器使用RSS提要的例子。在讨论新闻内容时经常会提到RSS,然而,除新闻以外,这种格式可用于组织和发布其他很多类型的信息。例如,很多Web站点都发布可用的pod-cast的RSS提要,从而发布音频和视频内容。Handango是一个流行的移动软件和内容的在线商店,它根据移动平台分类,提供新的流行软件标题的提要。例如,提供针对Windows®Mobile、Blackberry、Palm和其他平台的提要。用不了多久,很可能就会提供针对Android应用程序的提要了!RSS的格式是XML数据,这表示数据本身就包含描述性元素,也就是说它是自包含的。随着行业的逐步标准化,XML构造在过去几年也经历了一些变化。最新的版本也是应用最广的版本是2.0。RSS2.0是一种相对简单的XML构造,很容易由计算机程序解析。RSS是站点用来和其他站点之间共享内容的一种简易方式〔也叫聚合内容〕,通常被用于新闻和其他按顺序排列的网站,例如Blog。一段工程的介绍可能包含新闻的全部介绍,Blogpost等等。或者仅仅是额外的内容或者简短的介绍。这些工程的链接通常都能链接到全部的内容。网络用户可以在客户端借助于支持RSS的新闻聚合工具软件〔例如NewzCrawler、FeedDemon〕,在不翻开网站内容页面的情况下阅读支持RSS输出的网站内容。网站提供RSS输出,有利于让用户发现网站内容的更新。RSS的优点。如果没有RSS,用户就不得不每日都来您的网站检查新的内容。对许多用户来说这样太费时了。通过RSSfeed〔RSS通常被称为Newsfeed或RSSfeed〕,用户们可以使用RSS聚合器来更快地检查您的网站更新〔RSS聚合器是用来聚集并分类RSSfeed的网站或软件〕。由于RSS数据很小巧并可快速加载,它可轻易地被类似移动或PDA的服务使用。拥有相似内容的网站环〔Web-rings〕可以轻易地在它们的网站共享内容,使这些网站更出色更有价值。Pull解析算法研究构建RSS阅读器应用程序的核心操作就是获取并处理XML数据。当前GoogleAndroid处理读取XML数据有三种主流方式:DOM解析、Pull解析、SAX解析。下面来对这三种解析方法来进展比拟:DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOMAPI遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比拟直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比拟大,特别是对于运行Android的移动设备来说,因为设备的资源比拟珍贵,所以建议还是采用SAX或者PULL来解析XML文件,当然,如果XML文件的内容比拟小的时候采用DOM是可行的。SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某局部,如果符合就会触发事件。所谓事件,其实就是一些回调〔callback〕方法,这些方法(事件)定义在ContentHandler接口。如果在一个XML文档中我们只需要前面一局部数据,假设使用SAX方式或DOM方式会对整个文档进展解析,尽管XML文档中后面的大局部数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。因此使用PULL方式比拟适宜。Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进展处理,因此你不能控制事件的处理主动完毕;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,完毕解析。这是他们主要的区别。而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件,开场文档START_DOCUMENT和完毕文档END_DOCUMENT,开场元素START_TAG和完毕元素END_TAG,遇到元素内容TEXT等,但需要调用next()方法提取它们〔主动提取事件〕。Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创立XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进展相应的逻辑处理。另外Pull方式比拟简单,而且可以根据判断停顿解析〔DOM和SAX都需要对文件的文章解析中途不能停顿〕。综合考虑,本系统的实现用到的是Pull解析算法来解析数据源。Android平台下RSS阅读器的详细分析设计与实现问题的提出需求分析1、系统开发背景。在信息高速开展的今天,人们对信息非常的重视,希望能够随时随地的获取即时更新的信息。而新闻阅读器刚好可以满足人们的要求。在传统的平台例如IPhone,有许多类似的程序,都受到了用户的好欢送。通过武汉某公司在Googleandroidmarket上面的程序的调查,发现关于信息方面的程序普遍受到广阔用户的欢送。因此本系统将能满足人们对信息的需求。2、系统功能的描述1)频道的切换:用户能按照自己的需求来切换自己所需要的频道。2)新闻的阅读:当用户翻开一个新闻的时候,用户能准确无误并且方便的读取到新闻的内容。3)新闻的收藏:当用户觉得某一个新闻有趣的时候,用户能将其添加到自己所喜欢的新闻列表中。4)新闻的更新:当RSS更新以后,程序能做相应的更新,能与网络上的内容保持一致性。做到即时更新。系统功能构造根据系统需求描叙和系统数据流图,得出系统功能构造如图4.1所示:RSS阅读器新闻频道显示与切换新闻的显示新闻的收藏与删除图4.1系统功能构造图解决方案为了解决上一节所提出的需求分析,我们提出下面的解决方案,它遵循了android平台开发的规律,具体流程如图4.2所示:数据源的选取数据源的选取数据的解析系统的布局设计系统稳定性的设计与检测开场完毕图4.2系统解决方案流程图在开发前期,笔者先找到了适合作为新闻源的RSS源的数据源,并找到最优的解析算法——Pull。在数据准备完成后,笔者为基于Googleandroid移动平台的新闻阅读器的界面做了详细的规划。在完成这些以后,笔者对系统的稳定性进展了相关的调研,然后做出了相应的假设,并进展验证,最后通过验证的结果来对系统的稳定性做了相应的检测和操作。主要功能详细设计与实现RSS数据源的选取基于Android平台的RSS阅读器作为一款新闻阅读器,对RSS源的要求及其苛刻:(1)RSS源必须是稳定的,除非出现特殊情况,否则不会出现无法读取的情况。(2)RSS源的更新频率必须尽量的高,能做到将第一手的新闻资料上传更新,使得用户能最早的获得相关新闻资料。(3)RSS源的访问速度。由于基于GoogleAndroid平台的新闻阅读器的使用对象是手机,而手机则是通过GPS、WIFI等其他的无线网络访问RSS源,所以对RSS源的访问速度有较高的要求。(4)RSS源的格式。由于读取RSS源的内容是通过解析相应的XML文件而获得的,所以基于GoogleAndroid平台的新闻阅读器对RSS源的格式有非常高的要求,既当RSS源的格式一旦固定,无论是将来的更新或者是添加等其他操作的时候RSS源的格式必须保持一定。基于以上几点,加上本人的个人喜好,并经过测试,本系统选择了新浪RSS源。RSS源的解析构建RSS阅读器应用程序的核心操作是获取并处理XML数据。当前GoogleAndroid处理读取XML数据有三种主流方式:DOM解析、Pull解析、SAX解析。下面来对这三种解析方法来进展比拟:DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOMAPI遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比拟直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比拟大,特别对于运行Android的移动设备来说,因为设备的资源比拟珍贵,所以建议还是采用SAX或者PULL来解析XML文件,当然,如果XML文件的内容比拟小的时候采用DOM是可行的。SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某局部,如果符合就会触发事件。所谓事件,其实就是一些回调〔callback〕方法,这些方法(事件)定义在ContentHandler接口。如果在一个XML文档中我们只需要前面一局部数据,假设使用SAX方式或DOM方式会对整个文档进展解析,尽管XML文档中后面的大局部数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用PULL方式正适宜。Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进展处理,因此你不能控制事件的处理主动完毕;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,完毕解析。这是他们主要的区别。而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件,开场文档START_DOCUMENT和完毕文档END_DOCUMENT,开场元素START_TAG和完毕元素END_TAG,遇到元素内容TEXT等,但需要调用next()方法提取它们〔主动提取事件〕。Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创立XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进展相应的逻辑处理。//创立XmlPullParser,有两种方式//方式一:使用工厂类XmlPullParserFactoryXmlPullParserFactorypullFactory=XmlPullParserFactory.newInstance();XmlPullParserxmlPullParser=pullFactory.newPullParser();//方式二:使用Android提供的实用工具类android.util.XmlXmlPullParserxmlPullParser=Xml.newPullParser();XmlPullParser.setInput(InputStreaminputStream,StringinputEncoding)解析对应的输入文件XmlPullParser.getEventType()得到元素PULL方式比拟简单,而且可以根据判断停顿解析〔DOM和SAX都需要对文件的文章解析中途不能停顿〕。因此在本RSS阅读器系统中,RSS数据源的解析用到的是方式一使用工厂类XmlPullParserFactory来创立XmlPullParser。系统界面的设计在讲述系统界面的设计之前,我们先来介绍一下Android中的四大组件。对于一个Android应用程序来说,是由四种构造块组织而成的,这四种构造块如下ActivityIntentReceiverServiceContentProvider但是,并不是每一个Android应用程序都需要这四种构造块,这不是必须的,某些时候,我们只需要这四种中的几种组合成我们的应用。Activity:Activity是Android构造块中最根本的一种,在应用中,一个activity通常就是一个单独的屏幕。每一个activity都被实现为一个独立的类,并且继承于Activity这个基类。这个activity类将会显示由几个Views控件组成的用户接口,并对事件做出响应。大部份的应用都会包含多个的屏幕。例如,一个短消息应用程序将会有一个屏幕用于显示联系人列表,第二个屏幕用于写短消息,同时还会有用于浏览旧短消息及进展系统设置的屏幕。每一个这样的屏幕,就是一个activity。从一个屏幕导航到另一个屏幕是很简单的。在一些应用中,一个屏幕甚至会返回值给前一个屏幕。当一个新的屏幕翻开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。默认情况下,Android将会保存从主屏幕到每一个应用的运行屏幕。Android使用了Intent这个特殊类,实现在屏幕与屏幕之间移动。Intent类用于描述一个应用将会做什么事。在Intent的描述构造中,有两个最重要的局部:动作和动作对应的数据。典型的动作类型有:MAIN〔activity的门户〕、VIEW、PICK、EDIT等。而动作对应的数据则以URI的形式进展表示。例如:要查看一个人的联系方式,你需要创立一个动作类型为VIEW的intent,以及一个表示这个人的URI。与之有关系的一个类叫IntentFilter。相对于intent是一个有效的做某事的请求,一个intentfilter则用于描述一个activity〔或者IntentReceiver〕能够操作哪些intent。一个activity如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。IntentFilter需要在AndroidManifest.xml中定义。通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开场运行。当startActivity方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:A、Activities能够重复利用从其它组件中以Intent的形式产生的一个请求;B、Activities可以在任何时候被一个具有一样IntentFilter的新的Activity取代Intentreceiver:当你希望你的应用能够对一个外部的事件〔如当呼入时,或者数据网络可用时,或者到了晚上时〕做出响应,你可以使用一个IntentReceiver。虽然IntentReceiver在感兴趣的事件发生时,会使用NotificationManager通知用户,但它并不能生成一个UI。IntentReceiver在AndroidManifest.xml中注册,但也可以在代码中使用Context.registerReceiver()进展注册。当一个intentreceiver被触发时,你的应用不必对请求调用intentreceiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的intentreceiver播送给其它应用程序。Service:一个Service是一段长生命周期的,没有用户界面的程序。比拟好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service一直执行,直到这个service运行完毕。另外,我们还可以通过使用Context.bindService()方法,连接到一个service上〔如果这个service还没有运行将启动它〕。当连接到一个service之后,我们还可以service提供的接口与它进展通讯。拿媒体播放器这个例子来说,我们还可以进展暂停、重播等操作。ContentProvider:应用程序能够将它们的数据保存到文件中、SQL数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,ContentProvider将会很有用。一个ContentProvider类实现了一组标准的方法,从而能够让其它的应用保存或读取此ContentProvider处理的各种数据类型。下面开场讲述本RSS阅读器主界面的设计。先看看整个系统的架构流程图如图4.3所示:MainActivityMainActivityNewsView主菜单界面新闻大类新闻小类新闻内容页面显示新闻标题图4.3RSS阅读器系统架构流程图MainActivity是程序的主体局部,整个程序的执行从这里开场,在MainActivity里调用NewsCategory.java中的方法,进入NewsView,在NewsView中展示主菜单的布局,包括主界面和新闻大类,新闻小类的显示可以通过新闻大类的频道切换来完成,新闻大类和新闻小类是分别是在GetNewsMenu.java和GetNewsTitle.java中用pull解析法获取RSS数据源,点击新闻标题以后可以进入新闻页面阅读新闻内容。由于RSS源是从新浪网获取,而且为了迎合不同人群的不同喜好的新闻类型,所以主界面可以多设计几个新闻类别选择的菜单,本系统仿照新浪首页的菜单显示方式,主界面如图4.4所示:图4.4RSS阅读器主界面1点击向左或者向右可以获得更多的新闻类别,如图4.5和图4.6所示:图4.5RSS阅读器主界面2图4.6RSS阅读器主界面3其中“新闻中心〞包含了所有类别,而且在进入该RSS阅读器的时候,光标会默认的停在“新闻中心〞上,每个频道下面都有对应的新闻小类,新闻小类下面才是一条条新闻的标题。现在先介绍频道之间的切换,上图中的向左向右键便是用来实现频道切换功能的,下面是实现频道切换的关键代码:publicvoidonClick(Viewv){switch(v.getId()){caseR.id.main_backward_imageView:mViewFlipper.showPrevious();break;caseR.id.main_next_imageView:mViewFlipper.showNext();break;default:break; }if(v.getId()>=R.id.tv01&&v.getId()<=R.id.tv15){ Log.d(this.toString(),"onClick"); TextViewtv=(TextView)findViewById(v.getId());list=map.get(tv.getText().toString().replaceAll("\n","").replaceAll("",""));if(list!=null){mListView.setAdapter(newDemoListAdapter(this,list)); }else{ Log.e(LOG,"List<NewsCategory>isnull"); } } }上述代码中的switch语句便是用来实现频道切换的,其中上一页的ID是R.id.main_backward_imageView,当程序执行到这个case的时候,便调用showPrevious〔〕方法来显示前一页的主菜单内容,图4.4的前一页是图4.6;同样的,下一页的ID是R.id.main_next_imageView,当程序执行到这个case的时候,便调用showNext〔〕方法来显示后一页的内容,图4.4的后一页是图4.5。其实包括以上15个新闻类别在内,每个选项都对应了一个属于自己的ID,即“新闻中心〞、“体育频道〞、……、“视频频道〞的ID分别是R.id.tv01……R.id.tv15,在主程序中使用ID来进展调用,所有这些ID对应的选项都包含在main.xml中。上述代码中的if语句实现了当点击所有这些新闻频道图标时程序应该调用的方法。新闻阅读界面设计在新闻显示界面我们采用GoogleAndroid比拟流行的WebView来进展显示,下面以“体育频道〞为例,效果如图4.7所示:图4.7点击“体育频道〞以后的界面显示实现这个界面的关键代码包含在GetNewsMenu.java里,通过pull解析方法使用工厂类XmlPullParserFactory创立XmlPullParser来解析从新浪网RSS源里读取的xml数据,关键代码如下:publicclassGetNewsMenu{publicstaticMap<String,List<NewsCategory>>PullParseXML()throwsException{List<NewsCategory>listNews=null; NewsCategorynewsCategory=null; StringmapKey=null; XmlPullParserFactorypullParserFactory=XmlPullParserFactory.newInstance(); XmlPullParserxmlPullParser=pullParserFactory.newPullParser(); Log.e("PullParseXML","getXML"); xmlPullParser.setInput(GetNewsMenu.class.getClassLoader().getResourceAsStream("sina_news.xml"),"UTF-8");Log.e("PullParseXML","PullParseXMLstart");inteventType=xmlPullParser.getEventType();while(eventType!=XmlPullParser.END_DOCUMENT){ StringnodeName=xmlPullParser.getName();switch(eventType){caseXmlPullParser.START_DOCUMENT:break;caseXmlPullParser.START_TAG:if("item".equals(nodeName)){ newsCategory=newNewsCategory(); }if("title".equals(nodeName)&&newsCategory!=null){ newsCategory.setTitle(xmlPullParser.nextText()); }if("link".equals(nodeName)&&newsCategory!=null){ newsCategory.setLink(xmlPullParser.nextText()); }break;caseXmlPullParser.END_TAG:if("item".equals(nodeName)){ listNewsTitle.add(newsCategory); }break;default:break; } eventType=xmlPullParser.next(); }returnlistNewsTitle; }}}下面来谈谈解析过程,这段代码首先使用工厂类XmlPullParserFactory创立XmlPullParser,然后通过调用XmlPullParserFactory.newInstance()方法来获取XmlPullParser的实例,设置好输入流XML文件装载器后开场while循环,pull解析器读到的XML返回的数字如下所示:读取到xml的声明返回数字0START_DOCUMENT;读取到xml的完毕返回数字1END_DOCUMENT;读取到xml的开场标签返回数字2START_TAG;读取到xml的完毕标签返回数字3END_TAG;读取到xml的文本返回数字4TEXT通过while循环中的switch语句中的不同case来判断元素是否是START_DOCUMENT、END_DOCUMENT、START_TAG、END_TAG、TEXT中的一种,再进展相应解析,只要这个事件返回的不是1我们就一直读取xml文件。每一个case在break以后,都会调用xmlPullParser.next()方法,依次主动提取事件,并根据提取的事件类型进展相应的逻辑处理。现在我们在新闻menu菜单里可以选择自己感兴趣的体育新闻,例如点击“英超〞以后,界面效果如图4.8所示。这个界面显示的都是新闻标题,同样是通过pull解析方法使用工厂类XmlPullParserFactory创立XmlPullParser来解析从新浪网RSS源里读取的xml数据,方法和技术与前面介绍的根本一致,这里就不再赘述。图4.8点击“英超〞以后的界面显示此时便可以根据自己的喜好来看标题选择自己感兴趣的新闻了,至于新闻条目的上下拉动可以通过鼠标滚轮来实现,比方,我们想知道“曼联垂涎天王扬言不购强援就离队清洗7人可获4400万〞这个新闻标题中来自英格兰足球超级联赛的曼联队所“垂涎〞的“天王〞到底是谁,可以点击此新闻标题来阅读新闻内容,如图4.9所示。图4.9RSS阅读器中新闻内容网页显示这些新闻都是从新浪RSS源读取的,局部源的网址如下所示〔这里只包括了“体育频道〞中从“体育要闻汇总〞到“篮球新闻〞的所有新闻类别的RSS源链接〕:……<newstitle="体育频道"><outlinetitle="体育要闻汇总"xmlUrl="://rss.sina.cn/roll
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 典型化工园区挥发性有机物源解析研究报告
- 薄层色谱基本原理及特点
- 家庭象牙制品保养指南
- T∕CSER 002-2026 电石渣固化土道路路基工程应用技术规范
- 2026年天津市西青区王稳庄中学中考英语模拟试卷(含详细答案解析)
- 2026年江苏省扬州市高邮市中考化学二模试卷(含答案)
- 2026年教师资格证真题含答案
- 2026年教师资格证笔试教育知识与能力真题汇编
- 建筑施工应急演练方案
- 肾功能衰竭透析患者专科护理查房
- 2026年湖南长沙新奥燃气有限公司社会招聘5人考试参考题库及答案解析
- 2026年安全生产月知识竞赛试题(7套完整版 含答案)
- 2026文化和旅游部恭王府博物馆招聘应届毕业生4人考试备考试题及答案解析
- 2025年江苏省中考道德与法治试题及答案解析
- 昆明供电局项目制用工招聘笔试真题2025
- 2026年4月自考07816公共行政学试题及答案含评分参考
- 放射性肠炎治疗管理
- 2026年二级建造师之二建机电工程实务真题含答案详解
- 《广告媒体策划》
- 无人机组装调试与检修 第五章 无人机系统调试
- GB/T 615-2006化学试剂沸程测定通用方法
评论
0/150
提交评论