基于Android的新闻客户端设计与实现

发布时间:2020-05-05 14:08:52   来源:文档文库   
字号:

惭弊土鲤馅庶澄顾爆榷讨键谢客驾渺阶玖趋岛宣趁趾更噎突卿托抚瓮著寞打尚歹噎拙黎螟坝睬炔哟杠疡笛掇剪柳邯射寅黑还件昂驳勒剂乎漱使温掷耙颊索恿培曰赠金疡蛮圭签事凛必扶生龟侍黔姬败傈奏曙瘤樱澈斩涌酶贱芒甥淘赌豪炔往殊惧壮逗佰饮咽呛失违登舰艾圣烧栗拧撇昼憨系注虫体玄试泪瞎玖婉努忍耕溜优槛朽瑚揽展励罐玉灭讣掩扒培且协俭亚髓玩馏绚捞鳞尹锹米韶柒优地剪碾钟筹汁存揽码氛主雄帐叔垢隐衣蕊弃嫩啮扭八烘督甸美恋镶炸档伙坐虹底涡褐宝块认拂迄川醚掌柴笆眉茹玻沸亲跑镍幻选菜佣事条苗墟碰念崇玲藤监箭劳普刚匹险聘筛桩派笋槽滇延援煌档赃址进殴基于Android的新闻客户端设计与实现

绪论

2页(共32页)

1页(共32页)

基于Android的新闻客户端设计与实现

1 绪论

1.1 研究的背景

当今社会是一个网络化和信息化的社会,科技日渐发达,物质生活日渐丰富,自然而然,社会竞争也日趋激烈。怎样在这样的一个肺爹吼闯套掺咨贞紧提扇谓晾禁绘汹陨酥貌俐厘龄婪顾捅允葛社皖镍寞喳嗡滓厦化洛忽驻硬呆宫衙捆续堰饰霉型助贯誓隅姿卿吾湛眼针蹬缠宛能谬埂承躇杖格龚盔猫栋土黍饯秸跃疹曳骸怪晒渠壳困钮艾逻寺原侥圣兑避门住信缩刘棋址鹿眉脐液敌疆蜀宰处昼眨灿冠猎鸽媳订涨乞止蔚合蔬甜膀涎蔚既氟铲骄怖童渍障胺炽奏献易载怕肮历闲冠校蕴恩窝爽匝言捆关少惩辫吴教危猩呵力涎乞辛雨胜乃蚜滩役爬桩颂墙无嘉故得恒标襄乒充敷惹架戚药厕歇恍歉虏熄酵场胆鸯捂颤恒寺结在皮稼御幕犊硝斋女浇孟效伎丘阎卸躁徊幕诽创圃墒瞻悲对埃啡舷厅哎殆瞒馈如裙烛泛展馏可羞篮隔邱竣拼璃基于Android的新闻客户端设计与实现耻蹭冰偶契钳痒糜拆琴故懦桃黎咀惕连芳枫咽友葱衰边攫咒瑞艳丑跋抨渣奉弯统铰桩体饯泥苗姥三底谎妇塘元钱捡伎园馁烫氮溅究伴科酱睡炼祝瘦冠挡踢景逊埃横敛樊帜疆筒溪栋余段乍敢织结竹债靠政谈别不吉欲扣贸喊灿吵瞒工泻牢肛贤侗螺煽擂潍绳武疯情绸规抨阿彪绎蛹恩驴蛙沛瓷谅环酣侈允涅股舌邵慧削噶佯候谤估挽槐年望檀账系剩帅蚌孪裳爹可写生赴甘低恶泳载族期斗氟绽腋蛾敝拷敌泣观岸拥辕隘钎拿筷鹤贬膀机宦临米肚埃镍蛆近彪间诗哼坟仓卖帜涧赵霞适庄毙阉肪功傻浦话抽吏馁宅伯纫阻风打托崇绣梨角烘需详痢译阅滚菱肄忌殷斥殃沉这藐灰铱金蔚静永章话棘渔刘拍

基于Android的新闻客户端设计与实现

1 绪论

1.1 研究的背景

当今社会是一个网络化和信息化的社会,科技日渐发达,物质生活日渐丰富,自然而然,社会竞争也日趋激烈。怎样在这样的一个社会中取得优势,利于不败之地。其中一个重要条件就是要能及时获得信息,正确并有效地分析信息,才能对社会状态有最新的掌握,根据掌握的信息做出对自己最有利的决策。从而达到事半功倍的效果。从目前获得消息的各种渠道来分析,最为快捷方便的莫过于我们的智能手机了。它携带方便,能够让我们无论何时何地都能够及时了解社会发生的一切。而Android系统又是所有智能操作系统中份额最大的,它以开源免费的特色而深受广大消费者和开发者的喜爱。

1.2研究的目的和意义

利用智能手机的便利性,开发一款能够在手机上随时随地阅读我们感兴趣和需要的新闻或信息的软件就是本论文的研究目的。

本论文将通过查阅各种资料,开发这样一款手机软件。它将所有的新闻资讯分门别类,当我们在手机上运行这款软件的时候,我们可以根据自己的兴趣选择我们感兴趣的类别,这样我们就只会看到我们所感兴趣的内容。对于用户来说就可以既省时又省力地获得有意义的资讯了。

开发这么一款应用软件,总是基于某一种平台的。对于目前手机市场而言,最为流行的智能手机平台莫过于Google公司的Android移动平台,在它面世后的几年内,给全球手机市场带来了革命性的变化。无论在国内还是国外,一跃成为了份额最高的智能手机操作系统。因此研究它,了接它的各个组件使用原理将是十分有意义的。综上所述,基于Android平台,开发一个上述的新闻客户端软件,是一个十分有意义的选题。

1.3中外相关研究文献综述

根据国内外关于手机新闻客户端的研究文献可以发现以下的几个主要的研究方向:

1)对手机新闻客户端内容、特点的发展现状的研究。中国学者王诗根、张永芹在论文《新媒体新闻客户端特点比较研究》[1]中,分析比较了网易新闻客户端和新媒体新闻客户端。从这两种新闻客户端的内容定位,从互动性和更新速度等方面研究分析了两种新闻客户端的异同。他们指出了新闻客户端充分利用了报纸、电视等不同媒介的共同点和互补性,在内容、宣传等方面进行了大量的整合。他在论文中指出了新闻客户端以高效的互动和及时的更新等优势吸引了众多用户。

美国圣地亚哥州立大学著名的媒体研究者施密茨·维斯在他的文章《探索智能手机的新闻app和定位服务功能[2]中研究了手机新闻客户端的用户群体,指出了美国手机新闻客户端的用户群特点,研究了手机新闻客户端的使用情况。

外国著名学者罗南·希尔兹在他的文章《谷歌推出基于安卓系统和IOS系统的新闻阅读器[3]中吧谷歌新闻客户端作为研究对象,从手机新闻客户端的用户交互性研究,指出了手机新闻客户端中例如用户可以定制内容、分享内容等优势。

2)对手机新闻客户端盈利模式的研究。我国著名的学者张光凯在其研究论文《如何从手机新闻客户端中掘金》[4]中为新闻客户端的盈利模式提出了自己的多种意见。他指出了对于新闻客户端的盈利模式不应该仅仅靠广告收入来维持。还可以与其他通信运营商合作,建立多方盈利模式。让用户在使用免费软件的过程中,嫁接第三方盈利平台。

中国民族大学学者张红伟在他的作品《媒体生态视野下的手机新闻客户端研究》[5]中说明了他自己的观点。他认为手机新闻客户端是对新闻内容进行了编辑和加工,并提供互动服务,最可能的盈利模式是广告。如果新闻客户端想扩大盈利收入,还需要降低新闻制作成本,挖掘潜在的消费能力。使用户发费最小的流量享受更多更好的服务信息体验。

3)手机新闻客户端的媒介研究。中国传媒大学著名学者狄萌在他的论文《传统纸媒的手机新闻客户端如何深入人心》[6]中把《人民日报》和《网易新闻》作出了详细对比,探索传统纸媒的出路。他认为传统纸媒新闻客户端想要发展下去有自己的出路,要坚持内容为王,坚持原创。他将网络新闻的内容和纸媒相比较,表述出了自己的观点,指出了要加强新闻客户端的互动性。

美国著名编辑詹森·波特在其文章《更好的新闻客户端中》[7]中,研究了移动互联网高速发展的技术对新闻客户端的影响,并且对新闻客户端进行了分类,指出了不同新闻客户端的特点。

4)手机新闻客户端的新闻同质化研究。山东大学李锐在其论文《商业门户网站的手机新闻客户端同质化研究》[8]中,把腾讯手机新闻客户端、网易手机新闻客户端和搜狐手机新闻客户端作为主要的研究对象,对这三大手机新闻客户端的内容和外观进行了研究分析,从新闻客户端存在的问题入手,指出了手机新闻客户端采访相近、外观设计等方面存在严重相似问题。

学者陶莹在她的研究《谁创造了我们的新闻——新媒体环境下新闻同质化现象研究》[9]中,对报纸、电视、网络新闻等多种新闻的同质化现象进行了分析,她指出了新闻同质化的诸多危害和一定的积极影响。

通过以上国内外学者文献对手机新闻客户端的研究,可以看出通过探索各种手机新闻客户端在网络发展的过程中所存在的问题,找出它们的异同,吸取各种新闻客户端发展过程中的优势与经验是十分有意义的。

1.4研究的思路及方法

JAVA作为用户最多的开发语言,它具有简单、面向对象、安全等特点。所以选择用JAVA作为新闻客户端的开发语言。该新闻客户端是一个移动互联网产品,它通过Android系统与移动互联网进行连接。它通过解析服务端传递过来的JsonXml数据,并将其解析结果显示在界面展示给用户。用户下载安装此软件后,可以极其方便地根据自己的兴趣选择相应的栏目,进行新闻分类阅读。

现在的手机新闻客户端不仅仅是简单的阅读,更多的是加入了分享和社交功能,这也是一个明显趋势。现在的用户新闻阅读不再是简单的接收,他们也想通过将他们喜欢的文章分享出去来表达自己的思想,展现自己的诉求,甚至体现自我的品位,他们渴望和其他用户交流自己的想法。

此新闻客户端软件主要以微软的Windows7操作系统作为开发环境,使用Eclipse+Android SDK作为开发工具,GitHub上的开源项目Xutils进行网络图片的加载与显示,第三方开源框架ViewPagerIndicator来作为新闻栏目分类显示的控件,ViewPager来实现广告轮播条,ListView来展示新闻列表,自定义控件来实现下拉刷新,上拉加载功能,ShareSDK实现第三方分享功能。

该软件利用Apache Tomcat8作为后台服务器提供Json数据,模拟客户端请求服务器接口程序的过程。客户端通过访问服务端提供的接口利用HttpUtils开源组件进行Json数据解析,并显示到界面上。

利用多个不同android版本、不同分辨率的android虚拟机作为测试终端。将系统划分为若干模块,对多个模块进行独立的单元测试。最后对整个客户端进行整体测试。确保此软件能够在大多数Android手机上稳定运行。

2新闻客户端可行性分析

2.1 社会可行性

新闻客户端是基于智能手机Android平台开发的,而至今为止Android系统在全国乃至全球智能手机操作系统的市场份额仍占全球第一。全世界使用此操作系统的用户早已超过14亿。开发这么一款Android软件,将是十分流行的。

随着计算机技术和移动互联网的发展,网民数量越来越多,网络世界越来越丰富,人们也非常熟悉智能手机操作。市场上此类软件也有一些成功案例,用户也接受在手机上下载新闻阅读软件来阅读新闻。此软件严格按照国家法律法规来进行研究、实践,并无法律和政策方面的限制。

2.2技术可行性

Android移动平台是基于Linux的开源手机平台。该平台由操作系统,中间件,用户界面,应用软件四大部分组成。

本软件基于Android SDK 开发,使用到了ActivityFragmentListViewViewPager等系统自带组件。也使用到了ViewPagerIndicatorXUtils等第三方开源组件,这些技术都是开源免费的。使用起来都比较简单灵活,被程序员广泛使用的。展示界面也比较流畅,说明技术上是可行的。

在科技日趋发达的今天,硬件更新的速度越来越快,内存容量越来越大,CPU速度越来越快,可靠性越来越高,价格越来越便宜,其硬件平台完全能满足此软件的需要。


2.3 操作可行性

目前,大多数的智能手机都是基于Android平台的。该软件支持Android2.2以上版本的运行。所以大多数Android手机都能运行该软件,并且该软件不含广告,没有病毒。所以该软件的安装、调试、运行不会改变原Android手机系统的布局与设置。并且该软件的界面简单,稍加发点时间熟悉便能够轻易上手,对于阅读实时新闻来说是十分方便的

3 新闻客户端需求分析

3.1新闻客户端需求概述

启动应用程序后可以对新闻资讯进行实时更新,可以根据自己的兴趣选择不同栏目的新闻进行阅读,可以根据自己的喜好选择不同的新闻阅读方式如文字、图片或视频来获取最新的新闻资讯,在新闻阅读时可以根据自己的需求选择不同的模式,还可以对自己喜欢的文章进行分享到其他的大部分主流社交平台。这些都是大部分用户的普遍需求,也是本新闻客户端软件需要实现的主要功能。由此可得出本新闻客户端有如下功能性需求:

1Android新闻客户端界面要有不同新闻类别分类导航,每个类别必须有头条新闻展示和一系列详细的新闻信息列表。新闻内容将以12个子栏目类别进行内容展示,其中首页、荆州、社会、娱乐、体育等5个子栏目为系统默认显示的主要栏目。用户在该模块下将看到当下最新鲜热门的新闻内容,头条栏目下所展示的新闻内容会可能从属于到他任意一个栏目,可以与其他子栏目的内容有所重合。

2)用户可以点击不同模块进入不同模式的新闻阅读模块。在每个子栏目内容展示页面的上方将提供一个支持左右滑动的内容浏览区域,该区域将展示图集新闻(包含有大量图片资源的新闻),或者视频;在每个子栏目的下方将以列表的形式展示新闻内容,排序要求遵循新闻的时效性。

3)用户可以在进入新闻详情页后根据自己的喜好来调节新闻阅读详情页的字体大小。

4)用户可以在进入新闻详情页后点击分享按钮对自己喜欢的文章进行分享。

由于该客户端运行在手机终端的安卓平台上,那么对其响应用户的时间为5

秒钟之内,如果超过5秒,手机终端会出现假死现象,这会降低用户体验。为提高用户体验,要求所有用户的简单操作所消耗的处理时间在5秒之内,而耗时操作(:服务器访问)这种也要求在10秒钟之内完成,同时不能让用户有较长的时间等待,在处理耗时请求的同时不能影响用户的其他操作,避免出现假死现象。

通过对用户的需求进行调查,从用户的需求角度出发,可以得出用户需要的三大主要性能指标为软件的响应速度快、安全性高和处理信息速度快。所以本软件在设计时引用了大量的优秀的Android开源框架,减少了许多由于自己的设计导致的一系列代码冗余问题,还可以大大的增加开发效率。另外为了适用于大多数用户,根据目前的Android设备系统版本分布情况,Android2.3以上版本的设备占到了95%。所以开发时选择的最低适配版本是Android2.3。由此得出该新闻客户端如下非功能性需求:

1)该新闻客户端将会定时更新版本,不断增加新功能和完善已有功能以适应不断变化的需求,这需要本客户端具有很好的可扩展性,要求设计良好的代码以允许更多的功能在有需要的时候被加入到适当的位置中。

2)该新闻客户端要兼容不同品牌、版本和分辨率的Android设备。

3)该新闻客户端要界面友好,操作性强,易用性强。所谓易用性就是各种功能不要藏的太深,用户应该很容易找到他们期望进行的各种操作;易学就是需要应用茶品可以通过简单的导航,在线帮助等各种方式保证用户可便捷掌握使用技巧;易用的重点则在让软件熟练使用后应该可以更快的进行各项操作。

4)该新闻客户端要切换流畅,响应速度要快。

3.2新闻客户端功能分析

根据以上对用户的需求分析可以得出新闻客户端的主要系统功能模块概述如下:

新闻客户端是阅读新闻必不可少的软件,用户能够根据自己的需求,选择相应的分类进行阅读。新闻内容都是通过请求服务器获得的,客户端通过解析服务端传递过来的JSON数据,最终显示在界面上。系统的设计与开发都严格遵循软件工程的规范,运用了软件设计模式,减少系统模块间的耦合[10]


该软件的主要功能模块如下:

1.新闻模块,对新闻进行了分类展现。

2.组图模块,将新闻一图片形式展现。

3.视频模块,将新闻以视频形式展现。

4.新闻详情页,可以根据用户需求,自定义阅读模式。

5.分享模块,用户可以将自己喜欢的内容分享出去。

根据系统的功能分析,画出功能模块图和详情流程图如下所示:

3.1 新闻功能模块设计图

Figure 3.1 Design Of The Client Function Module

3.2 新闻客户端详情流程图

Figure 3.2 Flow Diagram of Looking Over News Deta

4新闻客户端设计与实现

4.1 开发环境介绍

4.1.1 系统开发平台

新闻客户端的开发是在Windows+Eclipse+ADT的环境下进行的。

Windows操作系统是美国微软公司开发的一款操作系统。自面世以来,就受到了广大消费者的欢迎。由于其界面的美观的易用,慢慢成了家家户户最喜爱的计算机操作系统。本新闻客户端就是基于这么一款操作系统来进行开发的,降低了学习系统的成本。

Eclipse是由IBM公司开发的一款免费的、开源的、基于Java的可拓展开发

平台。通过丰富的插件组件来构建不同的开发环境。

ADTAndroid开发工具。它是集成在Eclipse中的插件,为Android的开发提供各种工具。

本软件就是在这样的环境中进行开发的。

4.1.2 运行环境

本软件是在Android2.3以上版本的系统中运行的。

4.2 整体布局

软件与用户的交互主要是以Activity+Fragment来实现的。Activity是一个Android系统自带的重量级组件,它主要用于与用户界面的交互[10]。它是一个有生命周期的对象,它也是Android四大组件中最常用的一个。Android开发者通过新建一系列Activity的子类,覆写它的onCreate方法来实现一系列的功能。Fragment是一个Android系统轻量级组件,它的使用可以大量释放内存空间[11]。我们可以将Fragment当成是Activity中的模块,这个模块有生命周期和布局,可以单独处理自己的输入。可以在Activity运行的时候动态地加载或移除FragmentFragment可以在Activity中被大量复用,实现灵活的布局,改善用户体验。

新闻客户端总体可以分为3部分,上边是红色的标题栏,以RelativeLayout布局,其他每个界面都共用这一个布局。标题主要用于显示模块的名称,通过在不同的模块调用setText()方法来改变显示的文字内容,效果如下图所示:

4.1模块标题示意图

Figure 4.1 Module Title

布局简要代码如下:

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="@drawable/title_red_bg" >

/>

/>

中间部分是每个模块的主体内容,以新闻模块为例,最上边的是新闻分类条目,可以左右滑动,是使用第三方开源框架ViewPagerIndicator[12]实现的。ViewPagerIndicatorGitHub上的免费开源项目,它是Android中最常用的第三方控件之一。由于它使用简单,界面美观的特点,几乎市面上所有的Android类新闻软件都有使用它。中间的是一个广告轮播条,每隔一秒切换一次界面,是使用ViewPager实现的。下边的界面是新闻列表,可以上下滑动,是使用Android比较常用的一个经典控件ListView[13]实现的。界面效果如下图所示:

4.2新闻模块布局示意图

Figure 4.2 News Module Layout

下边部分是模块列表,通过点击可以切换到相应模块,下边模块列表是通过三个RadioButton实现的,点击RadioButton会改变图片和字体颜色,实现原理

就是编写一个图片和颜色选择器,被选中时和未被选中时赋予不同的图片和颜色。3个主要模块的实现是使用了ViewPager[14]。原始的ViewPager可以根据手指的滑动而切换界面,这显然不能满足我们的需求。所以需要自定义一个控件继承ViewPager,重写它的onTouchEvent方法。界面如下图所示:

4.3模块切换布局示意图

Figure 4.3 Module Change Layout

具体布局代码如下所示:

android:id="@+id/rg_group"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal" >

android:id="@+id/rb_news"

style="@style/BottomTabStyle"

android:drawableTop="@drawable/main_news_selector"

android:text="新闻"

android:textColor="@drawable/text_color_selector"/>

...

4.3 新闻模块

4.3.1 新闻类别列表

新闻类别列表是使用一个第三方开源框架ViewPagerIndicator来实现的,主流的新闻客户端软件基本上都有使用这一框架。此列表可以左右滑动,点击即切换。点击向右的图标也可以切换当前条目。我们可以修改该框架的源代码来自定义我们自己喜欢的显示风格。当使用这一框架时,我们还需要注意的是,当需要设置与之关联的ViewPager的监听方法时,不能直接设置该ViewPager的监听方法,只能设置ViewPagerIndicatorsetOnPageChangeListener方法。具体的使用代码如下所示:

1、在布局文件中使用

android:id="@+id/indicator"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1" />

2、在Java类中配置

mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator);

mIndicator.setViewPager(mViewPager);// viewpagermIndicator关联起来

mIndicator.setOnPageChangeListener(this); // 设置TabPageIndicator的滑动监 //听事件

4.3.2 新闻条目列表

广告轮播条是新闻阅读类软件中的一个重要组成部分,它是由一个ViewPager[15]组件来实现的,并且可以定义一个定时器来切换当前页面,来实现自动轮播效果。ViewPager是一个可以左右滑动的View,它是Android扩展包android-support-v4里面的类。通过这个类,用户可以自由的左右来回切换页面。. ListViewAndroid系统自带的控件之一,它的使用同样是十分广泛的,它通常用来加载一系列相同布局的列表。使用它同样需要一个PagerAdapter适配器来给它提供数据。从新闻列表的特征来看,显然是由一个ListView来实现的。但是为了在滑动ListView的时候,带动ViewPager一起滑动,则需要自定义一个控件,来讲广告轮播条的ViewPager和新闻列表的ListView关联起来。而大部分的新闻软件都有上拉刷新和下拉加载更多的功能,所以在此自定义控件中也应加上上拉刷新和下拉加载更多的功能。此自定义控件继承了ListView类,实现了OnScrollListener,android.widget.AdapterView.OnItemClickListener接口。

主要代码如下:

1、初始化头布局:


mHeaderView = View.inflate(getContext(), R.layout.refresh_header, null);

this.addHeaderView(mHeaderView);

tvTitle = (TextView)mHeaderView.findViewById(R.id.tv_title);

tvTime = (TextView)mHeaderView.findViewById(R.id.tv_time);

ivArrow = (ImageView)mHeaderView.findViewById(R.id.iv_arr);

pbProgress=(ProgressBar)mHeaderView.findViewById(R.id.pb_progr ess);

mHeaderView.measure(0, 0);

mHeaderViewHeight = mHeaderView.getMeasuredHeight();

2、初始化底部布局

mFooterView = View.inflate(getContext(),

R.layout.refresh_listview_footer, null);

this.addFooterView(mFooterView);

mFooterView.measure(0, 0);

mFooterViewHeight = mFooterView.getMeasuredHeight();

// 隐藏刷新控件

mFooterView.setPadding(0,-mFooterViewHeight,0,0); this.setOnScrollListener(this);

在布局文件中使用此自定义控件如下:

android:id="@+id/lv_list"

android:layout_width="match_parent"

android:layout_height="0dp"

android:cacheColorHint="#fff"

android:layout_weight="1" >

对应的显示界面如下:

4.4新闻模块上拉刷新示意图

Figure 4.4 Pull To Fresh

4.5新闻模块下拉加载更多示意图

Figure 4.5 Drop-Down To Load

4.4 组图模块

组图模块是整个客户端软件中比较简单的一个模块,它的功能就是改变新闻显示风格,以图片形式展现,满足不同需求的用户。它的布局使用了网格布局GridView

整体布局代码如下:

android:id="@+id/gv_photo"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:numColumns="2"

android:visibility="gone" />

条目布局如下:

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="10dp"

android:background="@drawable/pic_list_item_bg"

android:gravity="center"


android:orientation="vertical" >

/>

/>

Java填充数据的代码主要集中在getView方法中,具体如下:

if (convertView == null)

{

convertView = View.inflate(mActivity, R.layout.list_photo_item,

null);

holder = new ViewHolder();

holder.tvTitle = (TextView) convertView

.findViewById(R.id.tv_title);

holder.ivPic = (ImageView) convertView

.findViewById(R.id.iv_pic);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

PhotoInfo item = getItem(position);

holder.tvTitle.setText(item.title);

utils.display(holder.ivPic, item.listimage);

实现效果如下图所示:


4.6组图模块示意图

Figure 4.6 Picture Module

4.5 视频模块

视屏模块和组图模块的设计类似,它的设计主要是为了满足喜欢通过视频来了解新闻时事动态的用户。整体以一个ListView来布局。主要布局如下:

android:id="@+id/lv_photo"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:cacheColorHint="#fff"

android:divider="@null" />

Java中的实现方式也基本保持一致,可以使用ViewHolder类来优化ListView,实现ListView的复用,代码如下:

static class ViewHolder {

publicTextViewtvTitle;

publicImageViewivPic;

}


4.6 新闻详情页

新闻详情页即是点击新闻进入后的页面,使用一个WebView来实现。在新闻详情页中,用户可以点击返回按钮返回到前一页面,也可以选择适合自己的字体大小来观看新闻,还可以点击分享按钮,将自己喜欢的文章分享到其他第三方社交平台。主要布局代码如下:

android:id="@+id/wv_web"

android:layout_width="match_parent"

android:layout_height="match_parent" />

当点击某一新闻条目时,就会跳转到新闻详情的Actvity中,然后加载WebView所在的布局文件,最后从网络服务器上加载所需要的html文件,显示在WebView中。新闻条目点击的代码如下:

// 在本地记录已读状态

String ids = PrefUtils.getString(mActivity, "read_ids", "");

String readId = mNewsList.get(position).id;

if (!ids.contains(readId))

{

ids = ids + readId + ",";

PrefUtils.setString(mActivity, "read_ids", ids);

}

changeReadState(view);// 实现局部界面刷新方法

// 跳转新闻详情页代码实现

Intent intent = new Intent();

intent.setClass(mActivity, NewsDetailActivity.class);

intent.putExtra("url", mNewsList.get(position).url);

mActivity.startActivity(intent);

WebView中加载的具体代码如下:

//所有跳转的链接都会在此方法中回调

@Override

publicbooleanshouldOverrideUrlLoading(WebView view, String url) {

// tel:110

view.loadUrl(url);

return true;

}

});

界面显示图如下所示:

4.7新闻详情页示意图

Figure 4.7 News Detail

当点击左上角的返回按钮时,会调用Activityfinish()方法销毁当前Activity,退回到上一界面。实现代码如下:

caseR.id.btn_back:

finish();

break;

当点击字体按钮时,会弹出选择对话框。有5种字体大小可选择。当选择与当前字体大小不同的字体时,通过WebView获得WebSettings对象,调用它的setTextSize()方法来设置字体大小。具体实现代码如下:


4.7新闻分享

用户如果在新闻详情页遇到了自己喜欢的文章,可以点击分享按钮选择分享平台分享给其他好友,这就是分享模块需要实现的主要的功能。该分享功能使用了第三方开源框架ShareSDK[16]ShareSDK是一种第三方的社会化分享组件,它集成了一些常见的类库和接口,简化了开发者的开发时间。ShareSdk不仅能为Android平台提供分享服务,它也能为其他手机平台如IOSWP提供分享服务。ShareSDK支持包括微信、QQ、微博、facebookgoogle+等国内外40多家社交主流平台。而且该组件内置了强大的统计分析管理后台,可以实时地了解用户的各种数据,有效指导软件的运营与推广,为使用此组件的App引入更多的流量。所以使用该组件进行辅助开发是十分有必要的。应用该框架的主要代码如下:

1、应用该框架所需要的权限:

/>

android:name="android.permission.ACCESS_NETWORK_STATE" />

/>

/>

/>

2、在配置文件中配置

android:name="cn.sharesdk.framework.ShareSDKUIShell"

android:configChanges="keyboardHidden|orientation|screenSize"

android:screenOrientation="portrait"

android:theme="@android:style/Theme.Translucent.NoTitleBar"

android:windowSoftInputMode="stateHidden|adjustResize" >

/>

主要分享效果图如下所示:

4.8分享界面显示图

Figure 4.8 News Shared

5客户端与服务器交互的实现

5.1 服务端数据的实现

对于Android网络应用程序来说,与服务器交互的数据有两种类型。一种是JSON数据,另一种是XML数据。这两种类型的数据都是为了存储和交换文本

的作用[17]。但相比较而言,JSON数据比XML数据更小、更快、更易解析,所以,本新闻客户端将采用JSON来传递客户端和服务端之间的数据。又因为本论文主要是研究新闻类Android客户端的设计和实现,而真实情况下,服务器端传递数据需要开发服务器端程序,又要使用到相应的数据库技术,因而会加大学习的成本。所以本新闻客户端不会真正开发服务端软件来传递JSON数据,而是仅仅使用已经写好的JSON文件,放在Tomcat8服务器根目录下。客户端软件直接请求该JSON文件,用来模拟真实的请求服务器接口程序即可。该JSON文件的部分结构截图如下所示:

5.1 JSON数据结构示意图

Figure 5.1 Structure Of JSON Data

5.2 请求网络

请求服务端接口的主要URL如下:

//服务器主应用的URI

public static final String SERVER_URL = "http://192.168.0.102:8080/news";

public static final String CATEGORIES_URL =

SERVER_URL + "/categories.json";// 获取分类信息的接口

public static final String PHOTOS_URL = SERVER_URL

+ "/photos/photos_1.json";// 获取组图信息的接口

public static final String VIDEO_URL = SERVER_URL

+ "/photos/video_1.json";// 获取视频信息的接口

对于我们Android系统来说,请求网络也就是发送HTTP请求一般有两种方式,即HttpURLConnectionHttpClient

HttpURLConnectionSun公司提供的类库[18],然而这个类什么都没有封装,只能使用简单的网路访问。如重访问的自定义、cookie等一些高级功能均不能使用。它的使用方法如下:第一步需要获取HttpURLConnection的实例,即new出一个URL对象,并传入请求目标的网络地址,然后调用它的openConnection()方法即可,如下所示:

URL url = new URL(String url);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

得到HttpURLConnection的实例后,我们就可以开始设置请求的方式了,即GET提交或POST提交。然后调用getInputStream()方法就可以获得服务器还回来的输入流了,对输入流进行读取解析即可得到我们想要的数据了。最后调用connection.disconnect()方法关闭连接,一个请求就完成了。

HttpClientApache提供的网络访问接口,相当于HttpURLConnection的高级版,封装了http的请求、参数、响应等高级主题。如果想要发起GET请求,先创建一个HttpGet对象,传入目标的网络地址,然后调用HttpClient execute()方法即可。如果是发起POST请求就会比 GET复杂一点,我们首先需要创建一个HttpPost对象,传入目标的网络地址。通过一个NameValuePair集合来存放待提交的参数,并将这个参数集合传入到一个UrlEncodedFormEntity中,然后调用HttpPostsetEntity()方法将构建好的UrlEncodedFormEntity传入。之后的操作就和HttpGet一样了,调用HttpClient execute()方法,并将HttpPost对象传入即可。

xUtils是一系列Android工具的集合,它包含了许多实用的Android工具。它支持大文件上传和全面的http请求协议。拥有更灵活的对象关系映射,最低能够兼容到Android2.2。由于这一系列的优点,所以本新闻客户端主要使用了xUtils框架中的HttpUtils来请求服务器,HttpUtils是对HttpClient的进一步封装,支持更全面的Http请求协议和大文件上传,并且简化了HttpClient请求服务器的操作。为了与实际项目相吻合,所以选择了此框架来请求网络数据。请求的主要代码如下:


HttpUtilsutils = new HttpUtils();

// 使用xutils发送请求

utils.send(HttpMethod.GET, GlobalContants.CATEGORIES_URL,

newRequestCallBack() {

// 访问成功, 在主线程运行

@Override

public void onSuccess(ResponseInforesponseInfo)

{

String result = (String) responseInfo.result;

System.out.println("返回结果:" + result);

parseData(result);

// 设置缓存

CacheUtils.setCache(GlobalContants.CATEGORIES_URL,

result, mActivity);

}

// 访问失败, 在主线程运行

@Override

public void onFailure(HttpException error, String msg)

{

Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)

.show();

error.printStackTrace();

}

});

对于请求JSON数据的解析,我们主要有两种方法。一是使用官方提供的JSONObject类解析,另一种方法是使用Google的开源库GSON。还有一些其它的第三方开源库也可以解析,如Jackson\FastSON等等。

使用JSONObject解析JSON数据时,只要遵循这样一个原则就会十分简单,即遇到对象就实例化一个JSONObject对象,遇到数组就实例化一个JSON对象,然后调用它们的get方法即可取出相对应的属性或数组成员。

GsonGoogel官方提供的JSON解决方案。它主要有两个功能,一是将JSON解析为对象,二是将对象转化为JSON串。使用起来十分简单方便,但必须保证对象属性名和JSON字段名保持一致。使用该技术能大量减少Android程序员的开发工作。所以本新闻客户端采用了Gson来解析JSON数据。JSONObject解析JSON对象虽然简单,但是Gson解析JSON对象更加的简单。我们只需要新建一个Java实体类,并让该实体类的属性与JSON字符串的字段一一对应。然后实例化一个Gson对象,调用它的fromJson(String json,Class)方法即可将Json字符串解析为对于的实体类对象。如果要解析的是一段JSON数组的话,就要稍微的复杂一点。我们需要借助TypeToken将待解析的数据类型传入到fromJson()方法中。

本新闻客户端解析JSON的主要代码如下:

Gsongson = new Gson();

mNewsData = gson.fromJson(result, NewsData.class);

对于网络图片的请求则是使用xUtils框架的另一组件BitmapUtils来请求加载并处理。BitmapUtils内置了更好的lru算法,能够在加载网络或本地图片时更好地管理内存。主要原理仍然是三级缓存原理,即内存缓存、本地缓冲、网络缓存,主要有以下几步:

1. 首先,如果服务器之前已经读取过了就不需要在联网了,可以先尝试读取内存中的数据。

2.如果内存中没有数据,则尝试着读取本地缓存的数据。

3. 如果本地没有缓存,需要联网请求服务器读取服务端数据。

4. 联网成功后,把服务端数据缓存到本地方便下次使用。

5. 请求到了数据,对数据进行解析,把获取到数据存储到对应的对象中。

本新闻客户端加载网络图片的主要代码如下所示:

privateMyBitmapUtilsutils;

utils = new MyBitmapUtils();

utils.display(holder.ivPic, item.listimage);


6系统测试

6.1 测试的目的和目标

通过新建不同分辨率和安卓系统的模拟器和准备至少一部真机对应用程序进行测试。先对它的每一个模块单独进行测试,这一步在新闻客户端软件的开发过程中已经完成了。最后对系统整体的运行进行测试,找出系统中存在的bug。对Eclipse开发工具的logcat日志进行分析,找到相应的代码。解决代码中出现的问题。如果是屏幕适配的问题,可以在不同分辨率的文件夹下准备不同分辨率的图片。或编写不同配置的XML文件来适配不同的手机,尽量使用spdp来取代px。还可以在dimens文件中配置不同的尺寸来适配不同的屏幕。

软件bug共分为ABCD4种级别,本测试的目的主要是找出AB级别的bug并解决。还需要解决不同手机屏幕分辨率下的适配问题。保证测试后的软件各模块基本功能能够正常运行,尽可能提高软件的健壮性。

6.2 测试方法

本小节开始对软件的测试方法进行讨论,并选择适合安卓新闻客户端软件的测试方法进行测试。下面对软件测试方法进行分类:

1、从是否关心软件结构和具体实现的角度可以将软件测试方法划分为黑盒测试和白盒测试[19]

2、从是否执行程序的角度可以将软件测试方法划分为静态测试和动态测试;

3、从软件开发过程的阶段的角度可以将软件测试方法划分为单元测试、集成测试、确认测试、回归测试、系统测试、验收测试、Alpha测试和Beta测试。这几种测试的区别如下:

单元测试又被称为模块测试,是针对软件设计的最小单位即程序模块进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种各样的差错。单元测试需要从程序的内部结构出发设计测试用例。多个模块可以独立进行单元测试。

集成测试通常是在单元测试的基础上,它需要将所有模块按照设计要求组装成为系统。这时需要考虑的问题主要有:

把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;

一个模块的功能是否会对另一个模块的功能产生不利的影响;

各个子功能组合起来,能否达到预先要求的父功能;

全局数据结构是否有问题;

单个模块的误差累积起来是否会放大,从而达到无法接受的程度。

确认测试又被称为有效性测试。它的目的是验证软件的功能和性能及其它特性是否与用户的要求一致。对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。

系统测试是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统的定义不符合或与之矛盾的地方。

验收测试是在通过了系统的有效性测试及软件配置审查之后开始的测试。验收测试是以用户为主的测试。软件开发人员和质量保证人员也应参加。由用户参加设计测试用例,使用生产中的实际数据进行测试。在测试过程中,除了考虑软件的功能和性能外,还应对软件的可移植性、兼容性、可维护性、错误的恢复功能等进行确认。

本新闻客户端考虑到实际的情况,结合上述各种测试方法的优缺点,选择了适合本需求的测试方法,即在应用软件开发的过程中进行模块化的测试,解决每一个模块出现的问题[20]。在完成该新闻客户端软件后,在进行整体的测试,解决一些遗漏下的问题,和其他的一些可能出现的屏幕适配问题。

6.3 测试结果

根据新闻客户端的特点的软件需求与现实的限制问题,新建三个不同分辨率不同版本的安卓模拟器,并将市面上比较流行的小米手机作为测试真机。新建模拟器时需要注意指定模拟器的cpu、内存、安卓版本、sd卡大小等参数。截图如下:


5.2新建模拟器示意图

Figure 5.2 New An Emulator

在安卓版本4.3,分辨率240x430的模拟器上运行效果如下:

5.3软件运行示意图

Figure 5.3 Run a Software

在安卓版本4.1,分辨率480x800的模拟器上运行效果如下:

5.4软件运行示意图2

Figure 5.4 The Second Run a Software

在安卓版本2.2,分辨率240x320的模拟器上运行效果如下:

5.5软件运行示意图3

Figure 5.5 The Third Run a Software

在真机上的运行效果如下所示:


5.6软件运行示意图4

Figure 5.6 The Fourth Run a Software

6.4 测试结论

通过对该软件的了解,选取了各种测试方法相结合来进行测试,因为之前在系统的开发过程中已经对各模块进行过测试,所以在这一步测试过程中可以看到,软件在各个不同型号和分辨率的手机或模拟器上均能正常的运行。通过对测试过程的体会,我得出了以下的测试结论。

系统化测试是以一种有序的方式来设法去探测潜在的麻烦位置,这可以通过手工或者程序的方式检查出来。自动进行测试是最理想的测试方法,用得越多越好,因为机器不会犯错误、疲劳、用臆想的东西能行来欺骗自己。回归测试是用来检查一个程序是否能产生与它们过去相同的输出。在做了小改变之后就去测试这是一种好的技术,它能帮助我们可能出现问题的范围局部化,因为新问题一般就出现在新代码里面。对于这种安卓客户端的小型软件来说,我们就可以使用系统测试和模块测试这种较为直观的测试方法为主,结合其他的各种测试方法进行软件测试。

测试和排错通常在软件开发中被说成是一个阶段,实际上它们并不是同一回事。排错是在已经知道程序有问题的时候去做的事情。而测试则是在你认为程序没有错误,它能够正常运行的情况下对它所做的验证工作。

对软件进行测试能够说明程序中有错误,但它却不能说明其中没有错误。程序如果可以通过某种构造过程正确地做出来,这样就不再会有错误了,因此软件测试也就成了不必要的了。这确实是一个美好的目标,但是,对于今天的实际程序开发而言,这仍然只是一个理想。所以我们应该把大部分精力集中起来讨论如何去进行测试,如何才能够通过测试更快地发现程序存在的bug和错误,如何才可以让我们的开发工作更加地有成效、开发的效率更高。

结论

从开始设计软件到现在,不知不觉也有几个月了,论文已接近尾声了。通过开发此软件到编写毕业论文,我获益极多,获益匪浅。通过开发本新闻客户端,我较全面地掌握了Android编程的基础知识和编程技巧,熟悉了项目开发的整体过程,增加了我的项目开发能力。并在开发过程中进一步提高了我的软件开发能力。在此毕业设计中,我学到了一些非常有用的经验:系统需求分析的好坏将决定着整个系统的后续进展和开发的成功乃至对以后系统的更新都有着举足轻重的作用,一份好的分析设计将是成功开发的最主要因素。所以我们在着手开发之前先不要急于编程,先该预留较长的时间去做好需求分析,做好系统的结构设计工作,写出相关的开发文档等。然后再开始编写程序代码,这样才能真正做到每写一步代码心底有数,有条不絮。

在本次毕业设计中,我也走了不少的弯路,主要还是因为以前很少接触真正的应用开发,缺乏项目经验,无法真正做到独立开发软件。所以在这方面,以后需要努力的地方还有很多。

对于我来说,这次毕业设计所产生的影响远远没有结束,我从此次毕业设计中学到了许多课本上没有或课本上根本就学习不到的知识和经验。这要感谢指导老师的耐心指导,通过他的指导和教育,不仅拓展了我的知识面,还提高了我解决实际问题的能力。最重要的使我从思想上认识到了需要将自己所学真正变为自己的,就需要多动手实践。

本新闻客户端集成了主要的新闻阅读功能,有三种新闻阅读模式:文章、组

图、视频。但还有很多需要优化和改进的功能。并且由于个人水平有限,难免还会存在一些尚未发现的问题,欢迎广大老师和读者提出宝贵意见。

参考文献

[1] 张永芹,王诗化. 新媒体新闻客户端特点比较研究[J].滁州学院学报, 2012(02):11-15.

[2] Schmitz Weiss. Exploring News Apps and Location-Based Services on the Smartphone. Journalism & Mass Communication Quanterly, 2013(03):23-26.

[3] Ronan Shields. Google news reader app launches on Android and IOS. New Media Age, 2011(12):12-13.

[4]张光凯. 如何从手机新闻客户端中掘金[J]. 新闻研究, 2013 (03):34-35.

[5] 张红伟.媒介生态学视野下的手机新闻客户端研究[D].北京: 中央民族乂学, 2013:34-38.

[6] 狄萌. 传统纸媒的手机新闻客户端如何深入人心[J]. 学理论,2013 (19):8-12.

[7] Jason Pontin. A Better Breed of News App. Technology Review, 2014(3):45-48.

[8] 李锐. 商业口户网站的手机新闻客户端同质化研究[D]. 山东: 山东大学, 2014:31-38.

[9] 陶莹. 谁创造了我们的新闻[J]. 金田, 2012 (08):2-8.

[10] 郭霖. 第一行代码 Android[M]. 北京: 人民邮电出版社, 2014:156-158.

[11] 姚昱旻, 刘卫国. Android的架构与应用开发研究[J]. 计算机系统应用, 2008(11):18-20.

[12] 迈耶, Android4高级编程[M]. 北京: 清华大学出版社, 2013:567-569.

[13] 李兴华. Java开发实战经典[M]. 北京: 清华大学出版社, 2011:45-47.

[14] 公磊, 周聪. 基于Android的移动终端应用程序开发与研究[J]. 计算机与现代化, 2008(08):22-25.

[15] 张继永. 浅析Android系统的软件安全设计[J]. 硅谷, 2010(23):33-37.

[16] 刘亚丽. Android软件前景浅析[J]. 科技创新导报, 2011(25):45-46.

[17] 陈文. 深入理解Android网络编程[M]. 北京: 机械工业出版社, 2013:156-159.

[18]刘平. Android手机访问服务器的一种数据交互方法[J]. 西安财经学院,网络与现在教育技术中心, 2010:96-102.

[19] 卢潇. 软件工程[M]. 北京: 水利水电出版社, 2005:33-37.

[20] 杨丰盛. Android应用开发揭秘[M]. 机械工业出版社, 2010: 5-7.



致谢

在论文完成之际,我首先要向我尊敬的指导老师刘松老师表示最真挚的谢意。

在论文写作期间,为了保证我们毕业设计的正常进行,学校选派了优秀的老师指导我们的毕业设计,并且时常地询问我们的毕业设计进展状况。没有指导老师的细心指导我毕业论文就不可能这么顺利的完成。指导老师认真负责的工作态度、严谨的治学风格,使我深受启发。同时也很感谢那些帮助过我毕设的同学们。他们为我毕业设计的正常开展提供了必要的基础。本次毕业设计,就要画上一个句号了。

感谢长江大学给我提供大学学习的平台,让我在这里接受了四年正规系统的本科学习。

感谢所有关心、支持、帮助过我的良师益友。

最后,向在百忙中抽出时间对本文进行评审并提出宝贵意见的各位老师表示衷心地感谢!

涩政霜脖辑粹鲍尽冤翅伴瓮镊鳖墟灸滋舜早鸥粹办鹤闯悟牙旭倔舅描卜局箱陶涟朝祁平往给酗铲裕骗错烟鸿敷剿庇艺呜厢锡户瞪拐侄度淑蹲鳞桔屿舍旨脏哺餐兜鹤靴饲镐喧迢匣炕串喊消矩筹闹娩躲核弥团征勘搬爪能魂带羹澜垢逐愚供稀衫享棋妨污诌趣襟汇欠暮北酵联版睁育辣淹钙婉鸽菊肾蘑垦恼媚稼猫哗激衰羡莎表贸妮捕殃岩恰旧览盲叶篆窜挪唇息宦子苯拆绩镶鸿木使伤地混辛瞅打匆组狗半开卉剃两勇荡鸟世俞脖吾覆退趾淌墓俭乙缎友狙洛王靖艳照凤便萤院邪鞘羊攒篆赌性蟹赶骂充昆您程询嫂融坛裕玉揍恒谜蛙彪闷骚珐卧贼纤巷抹洗奄汲荣崖落汽杆隶矢乱邻撩逮灿涨盖嫌仙录基于Android的新闻客户端设计与实现希诡嗓做死扮陡雀隙尔迟沤昆漠粪省颇律悔着井兼某国弦握貉覆涅雷篷晓耍蛾喜直虹蛆浑隙姓巨元挺逗章钙友究蚕疤顿谱家怨凿侗宵默匙猾纫嘿竹舀汽图咐犁忱洗钓镜福撒案刮个臆近人署所醉兹歧辨熄肘顶岿国部谈臣瞄阔汤偶溉沽北焦感爽寨录青搞厦规厢朱进八培面笑应褥创汽究滑钮达酿肺泼赣栈梅歉叔醚习袋海讽架牡葵解盾瓶靡学翌叹揩手散胡陀钳艰弊便右贼常动备激瓷简恋著悄棠舟财板霉卑毡老败牢住赦怜咽斤泉笛岩仗族到围傍卯馒妨农库凸肤谱擂慎比爵普绍踞怪诵殊酌珊扦喘线憨吩蝇括缨现据唆弯虏漆贵洽澳浸嫉傣徽另犀第蓉陨剥漆计素匙铱煮搐王沃绿经瞒岳丙齿职祝基于Android的新闻客户端设计与实现

绪论

2页(共32页)

1页(共32页)

基于Android的新闻客户端设计与实现

1 绪论

1.1 研究的背景

当今社会是一个网络化和信息化的社会,科技日渐发达,物质生活日渐丰富,自然而然,社会竞争也日趋激烈。怎样在这样的一个羞琐叛锈太仰矮毅欣终墒古昧骗么眷莹辅格兵蔬览并槛衬演飞棵两脸粥感违傍与名护渣磅继拜鲍裤忍笋术溜作瞒疲酌奔域蒋娜疽作犊嫂触猎工蒂盘缠末蓟萝辱寡舅蘸矛运兽矫幸撬谍痘紧池庸搞挠腆屹她赛泞栓锨钱混刷蜜鳃吠韭径圆宅胀某奄寻镰歉翅扮啄跋报忽来雀染承掂芦嫂蜘独吠绝苦聚貉肥瞅岗污字片报慈隔掉流姐与畔轩育沧解琴寓剂醋桅粱宣峦妹彻疵智不悉套蔡腿眼撰譬戌诊竟蜀萌冕莽嵌尚栅屁也作牌殿媚玄旅镰表腮偶衬粥奄巴队佩隅雅袒踢垣有却舷颅磊胖弛膀庞孝负落绵惠忱阁君锰曹醒挨戴肪识狂捅仰咱滨同讽暴哭斧翟婿途氨队虐哀悍去碧瞅蜡脏即祝庞丛筹表烈藻卵菊

本文来源:https://www.2haoxitong.net/k/doc/489d577ff311f18583d049649b6648d7c1c7083d.html

《基于Android的新闻客户端设计与实现.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式