
本书是Android应用程序开发领域的权威之作。它由Android系统的资深专家执笔,深入浅出地讲解了Android应用程序开发平台的搭建、Android应用程序开发过程中的点点滴滴,以及应用程序发布的技术要点。书中配有大量的注释和图片来引导读者学习。
致谢 这本书的顺利付梓得益于很多人在多方面的努力,包括Pearson教育(Addison-Wesley Professional)集团的小组、技术评审人的专业建议;以及来自家庭、朋友、同事和其他人的支持和鼓励。同时我们也要感谢Android开发者社区、Google和OHA组织的远见和专业态度。特别要感谢的是Mark Taub对这个版本的信任;感谢Laura Lewin在本书背后所做的强有力的支持;感谢Olivia Basegio对本书参与者的精密分工和策划;感谢Songlin Qiu无数次的审校,以使书本可以顺利出版;还有技术审阅人员:Ray Rischpater给出了很多有益的建议,Doug Jones对细节部分有不少改进意见(还有Mike Wallace, Mark Gjoel, Dan Galpin, Tony Hillerson, Ronan Schwarz,和Charles Stearns等人的支持)。Dan Galpin提供了“小窍门”,“友情提示”和“警告”的清晰图片。Amy Badger给出了瀑布流的完美描述图。最后要感谢Hans Bodlaender允许我们使用他利用业余时间所开发的有趣的字体。 作者简介 Joseph Annuzzi,Jr.是一名自由软件架构师、艺术家、作家和技术评论家。他是以下几方面的专家:Android平台,最前端的HTML5技术,各种云技术,各种不同的编程语言,灵活掌握多种framework,集成各式各样的社交API,修改各种端对端,密码学和计算机图形学的算法,以及创造卓越的3D渲染器。他是Internet和移动端技术的前瞻者,同时拥有几项正在申请中的专利。他本科毕业于加州大学戴维斯分校的管理经济学专业,辅修计算机科学,并常住在硅谷。 除了技术领域的成绩外,他还曾被媒体发现与国际电影明星共同在黑河沙滩上享受日光浴;他曾在冬天徒步跋涉穿越巴伐利亚森林;沉浸在意大利地中海文化中,同时也亲身经历过发生在东欧的某ATM机(刚好是他乘坐的出租车的下车地点)暴力犯罪事件。他的生活方式健康且积极向上,他设计出了独特的减肥方式来保持身材,并且很喜欢他的小猎犬,Cleopatra。 Lauren Darcey在一家小型的软件公司(专注于移动技术,包括Android、iOS、BlackBerry、Palm Pre、BREW和J2ME,同时也提供咨询服务),负责技术方面的领导工作。Lauren在软件开发领域有超过二十年的专业经验,并且是应用程序架构和商业级移动应用程序开发方面的有名权威。Lauren本科毕业于加州大学圣克鲁斯分校的计算机科学专业。 她利用大量的空余时间来与痴迷于移动端开发的丈夫一起环游世界。她还是一位天生的摄影师。她的工作成果曾经见诸世界的各类书报中。在南非,她和一条4米长的大白鲨一起潜入水中;也曾被困在一大群发疯的河马和大象之间。她在日本时曾被猴子攻击过;也曾在肯尼亚因两只饥饿的狮子而被困山谷;在埃及差点渴死;在泰国经历过政变事件;在阿尔卑斯记录下了她的行程;在德国啤酒城一路买醉;睡在欧洲的摇摇欲坠的城堡中;在冰岛曾把舌头卡在冰山之中(并被一群野生驯鹿看到了)。 Shane Conder有非常丰富的开发经验,并且在过去十年中一直专注于移动式和嵌入式的开发。他设计并研发了很多商业级的应用程序,目标平台包括Android、iOS、Brew、BlackBerry、J2ME、Palm和Windows Mobile——其中有一些程序已经被安装在世界各地百万级数量的手机中。Shane在他的技术博客中已经写了很多移动式领域和开发平台方面的文章,并在博客圈中“家喻户晓”。他本科毕业于加州大学的计算机科学专业。 Shane总是拥有最新潮的智能机、平板以及其他移动式设备。你会发现他经常在研究一些最新的技术,譬如云服务和移动端平台,和其他让人兴奋的、尖端的技术——这些可以极大地激活他的大脑创造能力。他也很享受与其妻子一起畅游世界——即便她强迫他与4米长的大白鲨一起深潜,也曾使他在肯尼亚差点被狮子吃掉。他承认自己一定会携带最少两部手机——即便当前都没有网络信号覆盖;他也承认如果当时看到Laurie将舌头卡在冰岛的冰山中,一定会掏出他的Android手机拍照,然后心中窃喜。他同时也承认是时候要写自己的简历了。 引言 Android是一个流行、免费、开源的移动端平台,它已经迅速攻占了无线电子世界。本书为软件开发小组提供了很多专业的指导,包括如何设计、开发、测试、调试和发布专业的Android应用程序。如果你是一位移动开发的老兵,你可能会关注于开发流程化中的一些技巧,并充分利用Android的一些特性。相反如果你是移动开发的新手,那么本书也同样可以帮助你顺利地从传统软件领域过渡到移动端的实现中——特别是我们面对的还是非常有前景的平台:Android。 本书的目标读者 我们在移动领域有很多年的开发经验,并成功运作过不少项目。本书内容既包含了我们从这些成功项目中总结出来的技巧,同时也提供了开发人员从项目设想到最终实现所需要知道的一系列知识。在这里,你可以学习到移动端软件开发流程与传统领域软件开发流程的区别,以及一些可以帮助你节省很多宝贵时间、发现和解决缺陷的实用技巧。不论你面对的项目规模有多大,这本书都适用。 本书的目标读者包括: 有志于开发专业的Android应用程序的工程师。本书的大部分内容都适用于那些有Java经验,但不一定做过移动端开发的软件人员。对于有些经验的移动开发人员,他们也能从书中学习到如何充分利用Android的优势,并了解Android系统和当今市面上流行的其他移动平台的本质区别。 有志于测试Android应用程序的QA人员。无论他们面对的是黑盒还是白盒测试,QA人员都会觉得本书很有价值。我们专门花几章节的内容来分析QA人员所关心的问题,包括如何制定可靠的测试计划、移动端的问题追踪系统,如何管理手持设备,以及如何利用Android提供的可用工具来彻底测试应用程序等等。 有志于规划和管理Android开发团队的项目经理。项目经理们在整个项目流程中,都可以借助于本书来制定计划,招聘人员,以及运作Android项目。我们会讨论项目的风险管理,以及如何让Android项目运作得更加顺利。 其他读者。本书绝不仅适用于软件开发者。对于那些想在垂直市场应用领域掘金,或者是想规划很酷的手机应用程序的人,抑或是单纯只是想在他/她的手机上找点乐子的业余爱好者,本书也是很好的参考资料。甚至是想评估Android是否符合他们需求(包括可行性分析)的商人们,也会在这里找到一些有用的信息。总的来说,任何对移动应用程序有好想法,或者是自己有Android设备的人,都可以从中寻找到一些有价值的信息——无论他们是为了赚钱,还是兴趣使然。 本书所要阐释的一些关键问题 本书为读者解答了如下一些疑问。 1.Android是什么?各个SDK版本间如何区分? 2.Android和其他移动技术有什么区别,开发者又该如何利用这些差异? 3.开发者如何利用Android SDK和ADT,在模拟器或者真机设备上开发和调试Android应用程序? 4.Android应用程序的构造是怎么样的? 5.开发者如何设计出可靠的移动端用户界面——特别是针对Android系统? 6.Android SDK有哪些功能,开发者又该如何正确地使用它们? 7.移动端的开发流程和传统桌面型的开发流程有什么区别? 8.针对Android开发的最好策略是什么? 9.经理、开发者或者是测试人员在规划、开发和测试移动应用程序时,应该关注哪些方面的内容? 10.移动小组如何开发出可靠的Android应用程序? 11.移动小组如何为Android应用程序打包? 12.移动小组如何从Android应用程序中获利? 13.最后,作者在本次改版中添加了哪些新内容? 本书的编排架构 《Android应用程序开发权威指南》(第四版)的重点在于Android开发中的一些精华部分,包括建立开发环境,理解应用程序的生命周期,用户界面设计,面向多种类型的设备进行开发,以及设计、开发、测试和发布商业级应用程序的整个软件流程。 本书分为六大部分,下面是各部分的概述。 第一部分:Android平台的概述 这一部分是Android的入门,阐释了它与其他移动平台的区别。你会逐渐熟悉Android的SDK和工具,安装开发工具,以及编写和运行你的第一个Android应用程序——在模拟器上或者是在真机中。很多开发者和测试人员(特别是白盒测试员)对这一部分应该会比较感兴趣。 第二部分:Android应用程序基础 这一部分介绍了编写Android应用程序的一些设计原则。你会学习到Android程序的构造是什么样的,以及如何在项目中导入资源文件,譬如字符串、图像、用户界面元素等。开发者对这一部分应该会感兴趣。 第三部分:Android用户界面设计准则 这一部分对Android中的用户界面设计进行了更进一步的分析。你将学习到Android中的核心界面元素,即View。你也可以学习到Android SDK提供的很多常用的用户控件和布局。开发者对这一部分应该会感兴趣。 第四部分:Android应用程序设计准则 这一部分讨论了大多数Android应用程序会用到的特性,包括使用prefe-rence来存储程序数据;如何使用文件、文件夹和content provider。你也可以学习到如何让应用程序在多种设备中流畅运行。开发者对这一部分应该会有兴趣。 第五部分:发布Android应用程序 这一部分讨论了完整的移动端软件开发流程,针对项目管理、软件开发人员、用户界面设计人员及QA人员提供了很多建议和技巧。 第六部分:附录 这一部分讨论了很多有用的附录信息,帮助你运行和使用Android工具——具体而言,包括Android开发工具的概述,两个有用的开发工具快速入手指南——模拟器和DDMS——Android IDE技巧方面的附录,以及每章节最后的测验题答案。 本次改版所做的修改 当我们开始撰写本书的第一版时,市面上还没有Android设备。现如今全球已经有各式各样的Android产品了——手机、平板、电子书阅读器、智能手表,以及一些有特色的设备,譬如游戏控制台、Google电视、Google眼镜。另外,其他一些诸如Google Chromecast之类的设备还可以让Android设备和TV实现屏幕共享。 与本书第一版本出来时的Android平台相比,它已经经历了非常大的变化。Android SDK有很多新的特性,开发工具也有不少必需的升级。Android系统作为一种科技平台,已然是移动市场领域的王者。 在这一版本中,我们提供了大量Android应用程序体验方面的信息。另外,我们也会讨论很多对Android程序自动化测试有价值而且可用的技术,以保证你可以创造出高质量的产品。我们同时也修改了很多章节,并添加了对以Fragment为基础的实现途径的描述。但不用担心,读者们仍然会像以前的几个版本一样喜爱最新的这次更新;只是现在它更为强大,覆盖面更广,还加入了不少最佳实践建议。除新增了文字内容外,我们还对所有范例代码进行了升级,并且在最新的Android SDK中进行了重新测试(当然,它们是向后兼容的)。我们提供了测验问题来帮助读者确认是否已经很好掌握了章节的学习重点;我们在章节末尾还添加了练习题来让读者可以更深入地理解Android系统。有各种不同的Android开发社区,而我们的目标就是面向所有的开发者——不管他们的目标设备是什么。这其中也包括了那些希望为几乎所有平台提供服务的开发者。因而一些老式SDK的关键部分在本书中仍然被保留了下来——它们很可能对兼容性产生影响。 在这一版本中,我们做了如下改进和升级。 包含了最新和最重要的Android工具。 Android应用程序用户体验这一话题,现在用一个独立的章节来专门分析了,内容包括:不同的导航模式(有代码范例),改进用户体验可以借助的一些技术等等。 测试章节有了全新的内容,加入了对单元测试的讨论。同时也会通过一个实用的代码范例来指导读者使用自动化测试技术(很多专业的开发者都会使用这些技术)。 一个新的代码范例,以及对如何在应用程序中添加ActionBar的讨论。 对话框这一章节中添加了DialogFragment。 Android preference这一章节现在包含了一个代码范例,来讨论如何为“single-pane”和“multipane”布局添加preference fragment。 发布应用程序这一章节也经过了重新设计,重点讨论了如何使用Google Play Developer Console来发布你的应用程序,并对控制台的最新特性进行了突出描述。 所有章节和附录现在都有小测验和练习题,这样读者可以评估学习成果。 所有的范例代码和相应的应用程序都已经升级,以保证可以在最新的SDK中运行。 就如你所看到的,我们的讨论覆盖到了与Android相关的所有最热门的,也是最让人兴奋的特性。我们重新评估现有章节,更新内容,同时也添加了一些新章节。最后,我们也包含了很多附加的内容、声明——以及,针对各位亲爱的读者朋友们的回馈所做的修正。谢谢你们! 本书所用的开发环境 本书中的Android代码是在以下的开发环境中编写出来的。 Windows 7 Android ADT Bundle (使用了adt-bundle-windows-x86-20130729.zip) Android SDK Version 4.3, API Level 18 (Jelly Bean) Android SDK Tools Revision 22.0.5 Android SDK Platform Tools 18.0.1 Android SDK Build Tools 18.0.1 Android Support Library Revision 18 (如果适用的话) Java SE Development Kit (JDK) 6 Update 45 Android devices: Nexus 4 (phone)、Nexus 7 (small tablet)及Nexus 10 (large tablet) Android在与其他移动平台的竞争中(譬如Apple的iOS和BlackBerry),仍然保持了高速的增长率。不断有各种让人兴奋的Android新设备涌现出来。开发者已经把Android列为用户今后一段时间的选择重点。 Android最近的一次平台重大升级,是Android 4.3——即大家所知的Jelly Bean,或者JB——它带来很多在竞争中脱颖而出的特性。本书旨在帮助开发者支持所有市面上流行的设备,而不仅仅是一部分特殊的机器。截至本书编写阶段,大概有37.9%的用户的设备运行了Android的Jelly Bean,4.1或者4.2版本。当然,有些设备是通过在线方式进行了升级,有些用户则是购买了新的Jelly Bean设备。但是,对于开发者而言他们要面对的是各种不同版本的Android平台,以便能覆盖到这一领域的大部分设备。另外,Android的下一个版本很可能在近期发布。 那么这些对本书意味着什么呢?它意味着我们既要提供对以前API的支持,也要讨论Android SDK中出现的那些新API。我们从兼容性角度讨论了支持所有(至少是大部分)用户设备所需要采用的策略。我们提供了截屏图片来重点突出各SDK的差异,因为任何大的版本升级在UI外观上都会体现出来。换句话说,你应该已经下载了最新的Android工具,我们则提供了书本编写时最新的工具的截屏和操作步骤。这是我们在对书本内容进行取舍时所设定的界线。 附加的可用资源 本书中的示例程序可以从书本的官网中下载到,即:http://introductiontoan-droid.blogspot.com/2013/05/book-code-samples.html。你也可以在本书的官网中找到其他的Android讨论话题(http://introductiontoandroid.blogspot.com)。 寻求更多支持信息 你可以在网上找到各种充满活力的、有用的Android开发者社区——其中包含了很多对开发者和无线领域研究人员有价值的内容。 Android 开发者官网:Android SDK和开发者参考资料 http://d.android.com/index.html或 http://d.android.com Google Plus:Android 开发群组 https://plus.google.com/+AndroidDevelopers/posts Stack Overflow:包含了众多Android方面的技术信息,以及官方的支持论坛 http://stackoverflow.com/questions/tagged/android Open Handset Alliance:Android生产商,运营商和开发者 http://openhandsetalliance.com Google Play:购买和销售Android应用程序 https://play.google.com/store Mobiletuts+:移动开发指南,包括Android http://mobile.tutsplus.com/category/tutorials/android anddev.org:Android开发者论坛 http://anddev.org Google的Android应用小组:开源的Android应用程序 http://apps-for-android.googlecode.com Android工具项目:工具小组讨论升级和修改 https://sites.google.com/a/android.com/tools/recent FierceDeveloper:针对无线开发者的每周快报 http://fiercedeveloper.com Wireless Developer Network:无线领域的每日要闻 http://wirelessdevnet.com XDA-Developers上的Android论坛:从最基本的开发到ROM制作 http://forum.xda-developers.com/forumdisplay.php?f=564 Developer.com:提供了以开发者为中心的一系列文章 http://developer.com 本书的编写规范 本书使用了如下一些规范。 代码和编程术语是以monospace文本的形式提供的。 Java的import声明、异常处理,以及错误检测通常会从打印书稿中移除 掉,以使读者可以将精力放在重点部分,并控制书本内容的长度。 同时,本书也以如下几种形式提供了相关信息。 小窍门 提供了有用的信息或者是建议。 友情提示 提供了额外的、可能很有趣的相关信息。 警告 提供了一些可能的缺陷,以及规避它们的实用建议。 联系作者 我们欢迎各位读者对本书做出评论,提出问题,以及给出反馈。我们邀请你访问如下的博客网址: http://introductiontoandroid.blogspot.com 或者给我们发送E-mail: introtoandroid4e@gmail.com 或者是在Google+中找到我们: Joseph Annuzzi, Jr.——http://goo.gl/FBQeL Lauren Darcey——http://goo.gl/P3RGo Shane Conder——http://goo.gl/BpVJh
目录 致谢 xxvii 作者简介 xxix 引言 1 I Android平台概述 9 第1章 Android简介 11 1.1 移动软件开发简史 11 1.1.1 遥想当年…… 11 1.1.2 “砖” 13 1.1.3 无线应用协议(WAP) 15 1.1.4 专有移动平台 17 1.2 开放手机联盟 19 1.3 Google进入无线市场 19 1.3.1 开放手机联盟的形成 20 1.3.2 制造商:设计Android设备 20 1.3.3 移动运营商:提供Android体验 21 1.3.4 应用程序驱动设备的销售:开发Android应用程序 22 1.3.5 利用所有Android设备的优势 23 1.3.6 Android市场:现在我们在哪里 23 1.4 Android平台的差异 24 1.4.1 Android:下一代的平台 25 1.4.2 自由和开放的源码 26 1.4.3 熟悉和廉价的开发工具 26 1.4.4 合理的开发学习曲线 27 1.4.5 功能强大的应用开发的支持 27 1.4.6 丰富和安全的应用程序集成 28 1.4.7 没有昂贵的开发费用 28 1.4.8 应用程序的“自由市场” 28 1.4.9 一个不断发展的平台 30 1.5 Android平台 30 1.5.1 Android的底层架构 31 1.5.2 安全和权限 32 1.5.3 探寻Android应用程序 34 1.6 总结 37 1.7 小测验 38 1.8 练习题 38 1.9 参考内容和更多信息 38 第2章 搭建你的Android开发环境 39 2.1 配置你的开发环境 39 2.1.1 配置你的操作系统用于设备调试 42 2.1.2 配置你的Android进行调试 42 2.1.3 更新Android SDK 44 2.1.4 Android SDK的问题 45 2.2 探索Android SDK 45 2.2.1 了解Android SDK的许可协议 45 2.2.2 阅读Android SDK文档 47 2.2.3 探索Android应用框架核心部分 47 2.2.4 探索Android核心工具 50 2.2.5 探索Android示例应用程序 54 2.3 总结 55 2.4 小测验 56 2.5 练习题 56 2.6 参考资料和更多信息 56 第3章 编写你的第一个Android程序 57 3.1 测试你的开发环境 57 3.1.1 使用SDK管理器加入Android示例程序 58 3.1.2 添加Snake项目到你的Android IDE工作区 60 3.1.3 为你的Snake项目创建一个AVD 63 3.1.4 为你的Snake项目创建一个启动配置 66 3.1.5 在Android模拟器中运行Snake应用程序 68 3.2 构建你的第一个Android应用 70 3.2.1 创建并配置一个新的Android项目 71 3.2.2 Android应用的核心文件和目录 74 3.2.3 为你的项目创建一个AVD 77 3.2.4 为你的项目创建一个启动配置 77 3.2.5 在模拟器中运行你的Android应用 79 3.2.6 在模拟器中调试你的Android应用 82 3.2.7 为你的Android应用增加日志记录 85 3.2.8 为你的应用程序增加媒体支持 87 3.2.9 在你的程序中增加基于位置的服务 90 3.2.10 在实体硬件上调试你的应用 93 3.3 小结 95 3.4 小测验 97 3.5 练习题 97 3.6 参考资料和更多信息 98 II Android 应用程序基础 99 第4章 了解Android应用结构 101 4.1 掌握重要的Android术语 101 4.2 应用程序 Context 102 4.2.1 获取应用程序Context 102 4.2.2 使用应用程序Context 103 4.3 使用Activity执行应用程序任务 104 4.3.1 Android Activity的生命周期 105 4.4 使用Fragment来组织Activity组件 110 4.5 使用Intent管理Activity之间的切换 112 4.5.1 通过Intent切换Activity 112 4.5.2 通过Activity和Intent来组织应用程序导航 115 4.6 使用服务 116 4.7 接收和广播Intent 117 4.8 总结 117 4.9 小测验 118 4.10 练习题 118 4.11 参考资料和更多信息 118 第5章 使用Android清单文件定义你的应用 119 5.1 使用Android清单文件配置Android应用 119 5.1.1 编辑Android清单文件 120 5.2 管理你的应用程序ID 126 5.2.1 控制你的应用程序版本号 126 5.2.2 设置应用程序的名称和图标 127 5.3 设置应用程序的系统需求 127 5.3.1 针对特定的SDK版本 128 5.3.2 设置应用的平台需求 131 5.3.3 使用外部库 134 5.3.4 其他应用程序配置和过滤器 135 5.4 在Android清单文件注册Activity 135 5.4.1 使用Intent过滤器为你的应用指定一个主入口Activity 136 5.4.2 配置其他的Intent过滤器 136 5.4.3 注册其他应用程序组件 137 5.5 访问权限 138 5.5.1 注册你的应用程序所需的权限 138 5.5.2 注册你的应用其他的权限 139 5.6 探索其他清单文件的设置 140 5.7 总结 141 5.8 小测验 141 5.9 练习题 141 5.10 参考资料和更多信息 142 第6章 管理应用程序资源 143 6.1 什么是资源? 143 6.1.1 存储应用程序资源 143 6.1.2 资源类型 144 6.1.3 以编程方式访问资源 148 6.2 使用Android IDE设置简单的资源值 149 6.3 使用不同类型的资源 153 6.3.1 使用字符串资源 153 6.3.2 使用格式化的字符串资源 154 6.3.3 使用带数量的字符串 156 6.3.4 使用字符串数组 157 6.3.5 使用布尔类型资源 158 6.3.6 使用整型资源 159 6.3.7 使用颜色资源 160 6.3.8 使用尺寸资源 160 6.3.9 可绘制资源 162 6.3.10 使用图像 164 6.3.11 使用颜色状态列表 166 6.3.12 使用动画 168 6.3.13 使用菜单 170 6.3.14 使用XML文件 172 6.3.15 使用原始文件 173 6.3.16 引用资源 174 6.3.17 使用布局 175 6.3.18 引用系统资源 182 6.4 总结 183 6.5 小测验 183 6.6 练习题 183 6.7 参考资料和更多信息 184 III Android用户界面设计要点 185 第7章 探索用户界面构建模块 187 7.1 Android的视图和布局介绍 187 7.1.1 Android视图 187 7.1.2 Android控件 187 7.1.3 Android布局 188 7.2 使用TextView来显示文本给用户 189 7.2.1 配置布局和大小 190 7.2.2 在文本中创建上下文链接 191 7.3 使用文本字段从用户获取数据 193 7.3.1 使用EditText控件获取输入文本 194 7.3.2 使用输入过滤器限制用户的输入 195 7.3.3 使用自动完成功能帮助用户 197 7.4 使用Spinner控件让用户选择 199 7.5 使用Button和Switch允许用户进行简单的选择 201 7.5.1 使用基本Button 202 7.5.2 使用CheckBox和ToggleButton控件 205 7.5.3 使用RadioGroup和RadioButton 206 7.6 使用Pickers来获取用户的数据、时间和数字 209 7.7 使用指示控件来给用户显示进度和活动 212 7.7.1 使用ProgressBar指示进度 212 7.7.2 使用Activity Bars和Activity Circles来指示Activity 214 7.8 使用SeekBar调整进度 215 7.9 其他有价值的用户界面控件 216 7.9.1 使用RatingBar显示评价数据 216 7.9.2 使用Chronometer显示时间的流逝 217 7.9.3 显示时间 218 7.10 总结 220 7.11 小测验 220 7.12 练习 220 7.13 参考资料和更多信息 221 第8章 布局设计 223 8.1 在Android中创建用户界面 223 8.1.1 使用XML资源文件创建布局 223 8.1.2 使用编程方式创建布局 225 8.2 组织你的用户界面 228 8.2.1 使用ViewGroup子类来设计布局 229 8.2.2 使用ViewGroup子类作为View容器 229 8.3 使用内置的布局类 230 8.3.1 使用LinearLayout 232 8.3.2 使用RelativeLayout 234 8.3.3 使用FrameLayout 237 8.3.4 使用TableLayout 240 8.3.5 使用GridLayout 242 8.3.6 在屏幕上使用多个布局 246 8.4 使用容器控件类 247 8.4.1 使用数据驱动的容器 247 8.4.2 添加滚动支持 252 8.4.3 探索其他View容器 253 8.5 总结 254 8.6 小测验 254 8.7 练习 255 8.8 参考资料和更多信息 255 第9章 用Fragment分割用户界面 257 9.1 理解Fragment 257 9.1.1 了解Fragment的生命周期 259 9.1.2 使用特殊类型的Fragment 262 9.1.3 设计基于Fragment的应用 263 9.2 使用Android支持包 272 9.2.1 为以前的应用添加Fragment支持 272 9.2.2 在新应用中使用Fragment针对于旧平台 273 9.2.3 将Android支持包链接到你的项目 273 9.3 探索嵌套的Fragment 274 9.4 总结 275 9.5 小测验 275 9.6 练习 276 9.7 参考资料和更多信息 276 第10章 显示对话框 279 10.1 选择你的Dialog实现方式 279 10.2 探索不同类型的Dialog 280 10.3 使用Dialog和Dialog Fragment 282 10.3.1 跟踪Dialog和DialogFragment的生命周期 282 10.3.2 使用自定义Dialog 285 10.4 使用支持包中的Dialog Fragment 286 10.5 总结 289 10.6 小测验 290 10.7 练习 290 10.8 参考资料和更多信息 290 IV Android应用设计要点 293 第11章 使用Android首选项 295 11.1 使用应用首选项 295 11.1.1 确定首选项是否合适 295 11.1.2 存储不同类型的首选项值 296 11.1.3 创建一个Activity私有的首选项设置 296 11.1.4 创建多个Activity共享的首选项设置 297 11.1.5 搜索和读取首选项设置 297 11.1.6 添加、更新和删除首选项设置 298 11.1.7 首选项修改时的反应 300 11.2 在Android文件系统中查找首选项数据 300 11.3 创建可管理的用户首选项 301 11.3.1 创建一个首选项资源文件 301 11.3.2 使用PreferenceActivity类 304 11.3.3 组织首选项设置的标头 308 11.4 了解Android应用的云存储 312 11.5 总结 312 11.6 小测验 312 11.7 练习 313 11.8 参考资料和更多信息 313 第12章 使用文件和目录 315 12.1 使用设备的应用程序数据 315 12.2 实现良好的文件管理 316 12.3 了解Android系统的文件权限 317 12.4 使用文件和目录 318 12.4.1 探索Android应用程序目录 319 12.4.2 使用Android文件系统上的其他目录和文件 325 12.5 总结 327 12.6 小测验 327 12.7 练习 328 12.8 参考资料和更多信息 328 第13章 使用内容提供者 329 13.1 探索Android的内容提供者 329 13.1.1 使用MediaStore内容提供者 330 13.1.2 使用CallLog内容提供者 332 13.1.3 使用浏览器内容提供者 334 13.1.4 使用CalendarContract内容提供者 336 13.1.5 使用UserDictionary内容提供者 336 13.1.6 使用VoicemailContract内容提供者 336 13.1.7 使用Settings内容提供者 337 13.1.8 ContactsContract内容提供者的介绍 337 13.2 修改内容提供者数据 340 13.2.1 添加记录 340 13.2.2 更新记录 341 13.2.3 删除记录 342 13.3 使用第三方的内容提供者 343 13.4 总结 344 13.5 小测验 344 13.6 练习 344 13.7 参考资料和更多信息 345 第14章 设计兼容的应用 347 14.1 最大程度提供应用程序兼容性 347 14.2 设计兼容的用户界面 350 14.2.1 使用Fragment 351 14.2.2 使用Android支持库 351 14.2.3 支持特定的屏幕类型 352 14.2.4 使用Nine-Patch可缩放图形 353 14.2.5 使用“工作区块”原则 353 14.3 提供替代应用程序资源 354 14.3.1 了解资源是如何被解析的 355 14.3.2 使用限定符组织替代资源 356 14.3.3 为不同屏幕方向提供资源 361 14.3.4 在程序中使用替代资源 363 14.3.5 高效地组织应用程序资源 363 14.4 针对平板、电视和其他新设备 364 14.4.1 针对平板设备 364 14.4.2 针对Google电视设备 365 14.5 针对Google Chromecast设备 367 14.6 总结 367 14.7 小测验 367 14.8 练习 368 14.9 参考资料和更多信息 368 V 发布和部署Android应用程序 371 第15章 学习Android软件开发流程 373 15.1 移动端开发流程概述 373 15.2 选择正确的软件方法论 374 15.2.1 理解瀑布流(Waterfall)模式的危险性 374 15.2.2 理解迭代的价值 375 15.3 收集应用程序的需求 375 15.3.1 明确项目需求 375 15.3.2 为移动端应用程序编写用例 378 15.3.3 结合第三方的需求和建议 379 15.3.4 管理设备数据库 380 15.4 评估项目风险 383 15.4.1 确认目标设备 383 15.4.2 获取目标设备 385 15.4.3 判断应用程序需求的可行性 386 15.4.4 理解质量保证(QA)的风险 387 15.5 编写至关重要的项目文档 388 15.5.1 为保证产品质量而制定测试计划 389 15.5.2 为第三方提供需要的文档 389 15.5.3 为维护和移植提供文档 390 15.6 运用配置管理系统 390 15.6.1 选择一个合适的源码控制系统 390 15.6.2 实现一个可用的应用程序版本系统 390 15.7 设计移动应用程序 391 15.7.1 理解移动设备的资源限制 391 15.7.2 研究通用的移动应用程序架构 391 15.7.3 为可扩展性和可维护性而设计 392 15.7.4 设计应用程序的互通性 394 15.8 开发移动端应用程序 394 15.9 测试移动端应用程序 395 15.9.1 控制测试版的发布 395 15.10 部署移动应用程序 396 15.10.1 选取目标市场 397 15.11 支持和维护移动应用程序 397 15.11.1 跟踪并解决用户提交的宕机报告 398 15.11.2 测试固件升级 398 15.11.3 维护应用程序文档 398 15.11.4 管理服务器的实时变化 398 15.11.5 鉴别低风险的移植机会 398 15.11.6 应用程序功能特性的选择 399 15.12 总结 399 15.13 小测验 399 15.14 练习 399 15.15 参考资料和更多信息 400 第16章 设计和开发可靠的Andriod应用程序 401 16.1 设计可靠的移动应用程序的最佳实践 401 16.1.1 满足移动端用户的需求 402 16.1.2 为移动设备设计用户交互界面 402 16.1.3 设计稳定并且响应迅速的移动应用程序 404 16.1.4 设计安全的移动应用程序 405 16.1.5 如何将应用程序利润最大化 406 16.1.6 遵循Android应用程序的质量指导方针 407 16.1.7 利用第三方的质量标准 408 16.1.8 开发易于维护和升级的移动应用程序 408 16.1.9 利用应用程序诊断手段 409 16.1.10 设计便于升级的应用程序 410 16.1.11 利用Android的工具辅助应用程序的设计 411 16.2 避免在Android应用程序设计中犯低级错误 411 16.3 开发可靠移动应用程序的最佳实践 412 16.3.1 设计适用于移动端的研发流程 412 16.3.2 尽早并经常测试应用程序的可行性 412 16.3.3 使用编码标准,审阅以及单元测试来改进代码质量 413 16.3.4 处理单个设备中出现的缺陷 416 16.3.5 利用Android提供的工具来做开发 417 16.3.6 避免在Android应用程序开发中犯低级错误 417 16.4 总结 418 16.5 小测验 418 16.6 练习 418 16.7 参考资料和更多信息 419 第17章 提升Android应用程序的用户体验 421 17.1 思考目标 421 17.1.1 用户目标 422 17.1.2 小组目标 422 17.1.3 其他股东的目标 423 17.2 集中研发精力的一些技巧 423 17.2.1 人物角色 423 17.2.2 发现和组织个体 424 17.2.3 用例和用例图 425 17.3 绘制应用程序的功能导航图 426 17.3.1 Android应用程序的导航场景 426 17.3.2 执行任务(Tasks)以及在Back Stack中导航 430 17.3.3 在Fragments间导航 430 17.3.4 规划应用程序导航 431 17.3.5 Android的导航设计模式 433 17.4 引导用户使用应用程序 438 17.4.1 菜单 438 17.4.2 操作栏 438 17.4.3 对话框 443 17.4.4 从应用程序内容中发起的操作 443 17.5 塑造应用程序的个性 444 17.6 针对不同屏幕的布局设计 445 17.7 正确处理视觉反馈 446 17.8 观察程序的可用性 446 17.8.1 应用程序的仿制 447 17.8.2 测试发布版本 448 17.9 总结 448 17.10 小测验 448 17.11 练习 449 17.12 参考和更多信息 449 第18章 测试Android应用程序 451 18.1 测试移动应用程序的最佳实践 451 18.1.1 设计移动应用程序的问题追踪系统 451 18.1.2 管理测试环境 453 18.1.3 让测试覆盖率最大化 456 18.1.4 利用Android的SDK工具来做应用程序测试 464 18.1.5 避免Android应用程序测试中的一些低级错误 465 18.2 Android应用程序测试精要 466 18.2.1 利用JUnit进行单元测试 467 18.2.2 PasswordMatcher应用程序入门 468 18.2.3 确认测试的预期结果 471 18.2.4 创建一个Android测试工程 472 18.2.5 编写测试代码 479 18.2.6 添加其他测试用例 485 18.3 更多Android自动化测试程序和API 488 18.4 总结 488 18.5 小测验 489 18.6 练习 489 18.7 参考资料和更多信息 489 第19章 发布你的Android应用程序 491 19.1 选择正确的分发模型 491 19.1.1 保护你的知识产权 492 19.1.2 遵循Google Play的政策 493 19.1.3 向用户收费 493 19.2 为即将发布的应用程序打包 494 19.2.1 为打包工作准备好代码 495 19.2.2 打包应用程序并签名 497 19.2.3 测试用于发布的应用程序包 500 19.3 在Google Play中发布程序 501 19.3.1 将你的应用程序上传到Google Play中 505 19.3.2 上传应用程序营销相关的资源 506 19.3.3 配置定价和发布详情 508 19.3.4 配置额外的应用程序选项 509 19.3.5 管理其他开发者控制台选项 509 19.3.6 将应用程序发布到Google Play中 510 19.3.7 在Google Play中管理应用程序 510 19.4 Google Play平台上的“阶段性展示产品” 511 19.5 通过Google Play的私有渠道发布程序 512 19.6 翻译你的应用程序 512 19.7 通过其他方式发布应用程序 512 19.8 自行发布应用程序 513 19.9 总结 515 19.10 小测验 515 19.11 练习 516 19.12 参考资料和更多信息 516 VI 附录 517 附录A 掌握Android开发工具 519 A.1 使用Android文档 520 A.2 利用Android模拟器 523 A.3 通过LogCat查看应用程序日志 524 A.4 利用DDMS来调试应用程序 525 A.5 使用Android调试桥(ADB) 526 A.6 使用资源编辑器和UI设计器 527 A.7 使用Android的“层级浏览器” 529 A.7.1 启动层级浏览器 531 A.7.2 在布局视图模式下工作 531 A.7.3 优化你的用户接口 533 A.7.4 在“像素级”模式下工作 533 A.8 利用Nine-Patch可拉伸图像 534 A.9 使用其他的Android工具 537 A.10 总结 540 A.11 小测验 540 A.12 练习 540 A.13 参考资料和更多信息 541 附录B 快速入手指南:Android模拟器 543 B.1 模拟现实世界:模拟器的用途 543 B.2 使用Android虚拟设备 545 B.2.1 使用Android虚拟设备管理器 547 B.2.2 创建一个AVD 547 B.2.3 定制AVD的硬件配置 549 B.3 以特定的AVD配置启动模拟器 550 B.3.1 维护模拟器性能 551 B.3.2 配置模拟器的启动参数 552 B.3.3 启动模拟器来运行应用程序 552 B.3.4 从Android虚拟设备管理器中启动一个模拟器 555 B.4 配置模拟器的GPS位置 555 B.5 在两个模拟器实例间互相通话 556 B.6 在两个模拟器实例间发送短信 559 B.7 通过控制台来与模拟器进行交互 560 B.7.1 使用控制台来模拟来电 560 B.7.2 使用控制台来模拟SMS信息 560 B.7.3 使用控制台来发送GPS坐标 562 B.7.4 使用控制台来监视网络状态 562 B.7.5 使用控制台来操纵电源设置 563 B.7.6 使用控制台的其他命令 564 B.8 享受模拟器的功能 564 B.9 理解模拟器的限制 565 B.10 总结 566 B.11 小测验 566 B.12 练习 567 B.13 参考资料和更多信息 567 附录C 快速入手指南:Android DDMS 569 C.1 将DDMS作为独立程序和Android IDE配合 使用 569 C.2 使用DDMS的核心功能 571 C.3 与进程、线程和堆进行交互工作 571 C.3.1 为Android应用程序关联一个调试器 572 C.3.2 终止进程 572 C.3.3 监视Android应用程序的线程活动 572 C.3.4 监视堆的活动 573 C.3.5 执行垃圾回收 574 C.3.6 创建并使用一个HPROF文件 575 C.4 使用内存分配追踪器 576 C.5 观察网络数据 577 C.6 使用File Explorer 577 C.6.1 浏览模拟器或者设备的文件系统 578 C.6.2 从模拟器或者设备中复制文件 579 C.6.3 将文件传送到模拟器或者设备中 580 C.6.4 从模拟器或者设备中删除文件 580 C.7 使用Emulator Control 580 C.7.1 改变电话状态 581 C.7.2 模拟语音来电 581 C.7.3 模拟SMS来信 582 C.7.4 发送坐标修正信息 583 C.8 使用System Information 583 C.9 为模拟器和设备执行截屏操作 584 C.10 使用应用程序的日志追踪功能 585 C.11 总结 586 C.12 小测验 586 C.13 练习 586 C.14 参考资料和更多信息 586 附录D Android IDE和Eclipse使用技巧 589 D.1 正确组织你的Android IDE工作区 589 D.1.1 集成源码控制服务 589 D.1.2 重新调整各视图栏的位置 590 D.1.3 最大化窗口 590 D.1.4 最小化窗口 591 D.1.5 并排浏览窗口 591 D.1.6 查看同一个文件的两个不同区域 591 D.1.7 关闭不需要的页面 593 D.1.8 让窗口可控 593 D.1.9 创建定制的日志过滤条件 593 D.1.10 搜索你的工程 594 D.1.11 组织Android IDE任务 594 D.2 使用Java语言来编程 595 D.2.1 使用自动完成功能 595 D.2.2 创建新的类和方法 595 D.2.3 导入(Imports)功能 596 D.2.4 格式化代码 596 D.2.5 为几乎所有事物重命名 597 D.2.6 重构代码 597 D.2.7 重新组织代码 599 D.2.8 使用快速修正功能 599 D.2.9 提供Javadoc风格的文档 600 D.3 解决某些诡异的编译错误 600 D.4 总结 601 D.5 小测验 601 D.6 练习 601 D.7 参考资料和更多信息 601 附录E 小测验答案 603