这是一本实践与理论紧密结合的 Android 应用开发参考书。实践部分以一个完整的大
型案例(功能完善的微博客户端)贯穿始终,以迭代的方式详细演示和讲解了该案例的开
发全过程,旨在帮助读者迅速理清 Android 应用开发的完整流程和实现细节,同时,对开
发过程中所涉及的理论知识进行了详细的分析和讲解。理论部分是对实践部分的升华,对
Android 应用开发所需具备的高级知识和常用技巧进行了深入的阐述,读者掌握这部分内容
后,在迅速获得实际应用开发经验之后还能进一步提升自己的理论技术功底。
全书一共分为三个部分。第一部分基础篇:全面介绍了 Android 的系统架构、开发环境
的搭建、Android 应用程序的常用组件,以及一个简单的微博客户端的实现方法,为接下来
动手实现本书中的完整案例(新浪微博客户端)奠定了基础;第二部分实例篇:介绍了微博
客户端的概况以及新浪微博 API,然后根据微博客户端的功能划分详细地介绍了微博客户端
各个功能模块的实现方法和细节,包括界面展示、代码分析,还有对所运用的理论知识的
重点讲解,既便于读者动手实践,又能帮助读者巩固已经掌握的理论知识 ;第三部分高级
篇 :讲解了 Android 开发中的高级技术,包括各种常用的 Android 资源、通信功能的开发、
数据库、蓝牙与 Wi-Fi、第三方程序库、2D 绘图技术、OpenGL ES 绘图技术、Android 的
编译,以及 Android 的性能优化方法和实践;最后,详细介绍了 Android 4.0 的新特征。
封底无防伪标均为盗版
版权所有,侵权必究
本书法律顾问 北京市展达律师事务所
图书在版编目(CIP)数据
Android 应用开发实战 / 李宁著 . —北京:机械工业出版社,2011.11
ISBN 978-7-111-36260-9
I. A… II. 李… III. 移动电话机 - 应用程序 - 程序设计 IV. TN929.53
中国版本图书馆 CIP 数据核字(2011)第 217326 号
机械工业出版社(北京市西城区百万庄大街 22 号 邮政编码 100037)
责任编辑:白 宇
印刷
2012 年 1 月第 1 版第 1 次印刷
186mm×240mm · 27.75 印张
标准书号:ISBN 978-7-111-36260-9
定价:69.00 元
凡购本书,如有缺页、倒页、脱页,由本社发行部调换
客服热线: 010)88378991;88361066
购书热线: 010)68326294;88379649;68995259
投稿热线: 010)88379604
前 言
为什么要写这本书
几年前开始接触 Android 时就被 Android 自由开发的精神所感染。虽然 Android 在诞生
之初曾在 iPhone 的阴影下沉寂了很长时间,也受到很多的质疑,但随着加入 Android 阵营的
手机厂商、软件开发商、电信运营商和个人开发者的增多,Android 的势头也逐渐赶上并超
过了 iPhone,成为占有率第一的移动操作系统。
由于 Android 发展迅速,导致了就业市场对 Android 开发人员的需求量猛增。然而,很
多企业需要的是拥有实践经验的开发人员。刚毕业的大学生一般没有企业要求的实践经验,
而培训机构的高昂培训费又令他们望而却步。尽管可以通过很多 Android 书籍中的小例子积
累一些经验,但这些例子毕竟有限,有的也不完整,根本达不到企业所要求的水平。笔者在
参与公司的面试过程中多次遇到了这些问题。为此,笔者特意选择了一个完整的项目新浪微
博客户端作为本书的核心来讲解,其中涉及大部分的 Android 技术。读者通过仔细研究这个
项目的实现方法以及本书提供的源代码,可以大大增加自己的实践经验。为了使读者获得更
多的 Android 知识,本书还重点介绍了几项 Android SDK 中常用的技术,为读者提供实践经
验外的理论储备。
读者对象
想增加 Android 实践经验的 Android 初学者
想从事 Android 开发工作的在校或即将毕业的大学生
有 Java 基础,想进入移动领域的开发人员
想进一步提高技术和实践能力的开发人员
开设 Android 课程的大专院校和培训机构
IV
如何阅读本书
本书分为三大部分:
第一部分为基础篇,介绍了 Android 开发的基础知识,除此之外,还介绍了如何使用新
浪微博 SDK 开发客户端程序,并给出一个简单的例子供读者练习。
第二部分为实例篇,通过一个新浪微博客户端程序介绍如何使用 Android 技术和新浪微
博 SDK 开发一个完整的应用程序。这部分相对独立,如果你是一名有经验的 Android 开发
人员,能够理解和使用 Android 开发技术,那么可以直接阅读这部分内容。但如果你是一名
Android 初学者,请一定从第 1 章开始学习。
第三部分为高级篇,重点介绍了 Android SDK 中一些常用的高级技术。例如 Android 资
源、电话和短信的处理、数据库、蓝牙、2D 和 3D 绘图、编译器在 Android 中的应用等。读
者可以通过这部分内容,进一步提高 Android 的理论和实践能力。
本书的大部分章节都提供了源代码(由于篇幅有限,书中只展示了核心代码,完整的源
代码可以在网上 下载),建议读者先阅读本书的内容,如果仍然不理解书中的理论和代码,
可以将完整的源代码导入 Eclipse 中,运行并调试这些代码。
在下载本书的源代码后,可以按下面的方法将 Android 工程导入 Eclipse。
单击 Eclipse 的【File】→【Import】菜单项,打开【Import】对话框,选择【Existing Projects
into Workspace】节点,如图 1 所示。单击【Next】按钮进入下一个页面后,单击【Browse...】按
钮选择要导入的 Android 工程,如图 2 所示。最后单击【Finish】按钮即可导入 Android 工程。
图 1 选择【Existing Projects into Workspace】节点 图 2 选择要导入的工程
请先在华章公司网站(www.hzbook.com)上搜索到本书,在本书页面上即可找到相关源代码的下载链
V
勘误和支持
除封面署名外,参加本书编写工作的还有赵华振、李斌锋、邓斌、戚祥、于伟、皮文
星、陈育春、陆正武、虞晓东、张恒汝、高喆、刘威、刘冉、付志涛、宗杰、王大平、李振
捷、李波、张鹏、管西京、闫芳、王玉芹、王秀明、杨振珂。
由 于 作 者 的 水 平 有 限, 编 写 时 间 仓 促, 书 中 难 免 会 出 现 一 些 错 误 或 者 不 准 确 的
地 方, 恳 请 读 者 批 评 指 正。 为 此, 笔 者 特 意 创 建 了 一 个 在 线 答 疑 和 发 布 勘 误 的 论
坛 http://books.51happyblog.com,读者可以将书中的错误、建议、技术问题发布在相关的
版页,同时也请关注本论坛发布的本书相关信息。书中的全部源代码除可以从华章公司的
网站下载外,还可以从这个论坛下载。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱
techcast@126.com。期待得到你们的真挚反馈。
致谢
感谢所有在本书写作过程中给予我指导、帮助和鼓励的朋友,尤其是机械工业出版社华
章公司的编辑杨福川和白宇,他们不仅对本书提出了宝贵的写作建议,而且还对本书进行了
仔细的审阅。
感谢一直以来信任、鼓励、支持我的家人和朋友。
感谢 eoeAndroid、移动开发者社区的朋友对我技术上的帮助。
谨以此书献给我最亲爱的家人,以及众多热爱 Android 的朋友们!
李宁(银河使者)
2011 年 8 月于中国沈阳
目 录
前 言
第一部分 基础篇—Android 开发基础
第 1 章 Android 应用开发基础 / 2
1.1 Android 的系统构架 / 2
1.2 Android 开发环境搭建 / 3
1.2.1 安装 JDK 和配置 Java 开发环 / 3
1.2.2 安装 Android SDK / 4
1.2.3 安装 Eclipse 插件 ADT / 6
1.3 Android 应用程序中的资源 / 7
1.4 Android 的应用程序组件 / 8
1.4.1 Activity(Android 的窗体)/ 8
1.4.2 Service(服务)/ 9
1.4.3 Broadcast Receiver(广播接收器)/ 9
1.4.4 Content Provider(内容提供者)/ 10
1.5 小结 / 10
第 2 章 开发前的准备工作 / 11
2.1 建立 Android 工程 / 11
2.2 引用新浪微博 SDK / 12
2.3 引用第三方类库 / 12
2.4 跨工程调试新浪微博 SDK / 12
VII
2.5 异步访问 API / 13
2.5.1 使用 SDK 本身的异步功能 / 14
2.5.2 为 SDK 自定义异步功能 / 15
2.6 小结 / 18
第 3 章 实现一个简单的微博客户端 / 19
3.1 编写 Android 的服务 / 19
3.2 让任何拍照软件都成为微博客户端 / 19
3.2.1 可以监视目录文件的服务 / 20
3.2.2 发布带图像的微博 / 23
3.3 小结 / 25
第二部分 实例篇—微博客户端开发
第 4 章 微博客户端概况 / 28
4.1 参考客户端 / 28
4.1.1 新浪微博官方 Android 客户端 / 28
4.1.2 网易微博官方 Android 客户端 / 30
4.1.3 腾讯微博官方 Android 客户端 / 30
4.2 功能模块展示 / 31
4.2.1 登录 / 31
4.2.2 账户管理 / 31
4.2.3 微博列表 / 32
4.2.4 私信列表 / 32
4.2.5 撰写微博 / 32
4.2.6 图像渲染 / 33
4.2.7 转发、评论与收藏微博 / 33
4.2.8 搜索微博和用户 / 33
4.3 小结 / 34
第 5 章 新浪微博 API 详解 / 35
5.1 新浪微博 API 有哪些功能 / 35
5.2 使用新浪微博 API 开发前的准备工作 / 36
5.2.1 申请新浪微博应用程序 / 36
VIII
5.2.2 访问和测试 API / 37
5.2.3 测试新浪微博 SDK / 40
5.3 身份认证 / 43
5.3.1 Basic 认证 / 43
5.3.2 OAuth 认证 / 44
5.4 利用新浪微博 SDK 获取微博消息 / 46
5.4.1 获取公共微博消息 / 46
5.4.2 获取登录用户首页的微博消息 / 48
5.4.3 获取当前用户发布的微博消息 / 50
5.4.4 获取 @ 提到我的微博消息 / 50
5.4.5 获取当前用户的评论列表 / 51
5.4.6 获取指定微博的评论列表 / 52
5.4.7 获取微博的评论数和转发数 / 53
5.4.8 获取用户相关消息 / 53
5.5 更新微博及其相关内容 / 54
5.5.1 发布文字微博 / 54
5.5.2 发布图像微博 / 55
5.5.3 评论微博 / 56
5.5.4 回复评论 / 56
5.5.5 转发微博 / 58
5.6 新浪微博 API 的搜索功能 / 59
5.6.1 搜索用户 / 59
5.6.2 搜索微博 / 59
5.7 小结 / 60
第 6 章 用户登录与用户注册 / 61
6.1 设计登录界面 / 61
6.1.1 登录界面的布局 / 61
6.1.2 登录界面的装载模式 / 63
6.2 事件处理机制 / 64
6.2.1 编写事件处理类 / 65
6.2.2 扩展微博事件处理 / 66
6.3 用户登录 / 69
6.3.1 响应用户登录事件 / 69
6.3.2 用户登录成功 / 70
IX
6.3.3 用户登录失败 / 71
6.4 用户注册 / 72
6.5 关注作者微博 / 72
6.6 小结 / 72
第 7 章 首页微博列表 / 73
7.1 主界面设计 / 73
7.1.1 主界面布局 / 73
7.1.2 微博列表项布局 / 77
7.1.3 装载主界面 / 78
7.2 实现系统工具类 / 81
7.2.1 NotificationProcess 类(处理通知列表)/ 81
7.2.2 SystemDBService 类(操作数据库)/ 85
7.2.3 HappyBlogConfig 类(读写配置文件)/ 87
7.2.4 ProcessTasks 类(处理返回数据)/ 88
7.3 系统初始化 / 90
7.3.1 初始化 SystemDBService 对象 / 90
7.3.2 为每个账号创建 MyMicroBlogAsync 对象 / 92
7.3.3 初始化处理微博列表的对象 / 93
7.4 装载首页微博数据 / 94
7.4.1 显示微博数据 / 94
7.4.2 装载头像和微博图像 / 96
7.5 小结 / 99
第 8 章 切换微博列表 / 100
8.1 显示公共微博列表 / 100
8.2 显示我的微博列表 / 104
8.3 显示 @ 提到我的微博列表 / 105
8.4 刷新当前的微博列表 / 106
8.5 小结 / 106
第 9 章 显示其他列表信息 / 107
9.1 显示我的所有评论列表 / 107
9.2 显示我发出的评论列表 / 109
X
9.3 显示我的收藏列表 / 110
9.4 显示私信列表 / 111
9.5 小结 / 113
第 10 章 账号管理 / 114
10.1 账号管理主界面 / 114
10.2 添加账号 / 116
10.3 删除账号 / 118
10.4 设置主账号 / 118
10.5 同步账号 / 119
10.6 注销 / 119
10.7 小结 / 121
第 11 章 撰写和发布微博 / 122
11.1 发布文字微博 / 122
11.2 发布带图像的微博 / 124
11.2.1 手机拍照 / 125
11.2.2 从相册中获得图像 / 126
11.2.3 删除图像 / 127
11.2.4 发布图像微博 / 127
11.3 微博的辅助输入工具 / 127
11.3.1 语音录入 / 127
11.3.2 插入表情 / 129
11.3.3 插入话题 / 130
11.4 小结 / 131
第 12 章 处理微博与评论 / 132
12.1 与微博相关的操作 / 132
12.1.1 评论微博 / 132
12.1.2 转发微博 / 135
12.1.3 删除微博 / 137
12.1.4 收藏微博 / 138
12.1.5 以大图方式浏览微博图像 / 139
12.1.6 图像另存为与图像分享 / 139
XI
12.2 查看微博的详细内容 / 146
12.3 显示与回复评论 / 148
12.4 小结 / 149
第 13 章 图像特效 / 150
13.1 图像特效主界面 / 150
13.2 特效处理框架 / 150
13.2.1 处理图像的接口 / 151
13.2.2 如何处理图像 / 151
13.3 选择图像区域 / 153
13.4 图像特效详解 / 160
13.4.1 灰度 / 160
13.4.2 马赛克 / 165
13.4.3 截图 / 168
13.4.4 自由旋转 / 169
13.4.5 恢复原始图像 / 170
13.5 发布经过特效处理的图像微博 / 170
13.6 小结 / 171
第 14 章 搜索微博与搜索用户 / 173
14.1 搜索界面布局 / 173
14.2 实现 JSON 格式的搜索 API / 174
14.3 搜索微博 / 177
14.4 搜索用户 / 178
14.5 小结 / 181
第 15 章 个性化设置 / 182
15.1 设置主题 / 182
15.1.1 主题目录列表 / 182
15.1.2 主题图像 / 186
15.1.3 设置主题背景图 / 192
15.2 设置背景颜色和透明度 / 194
15.3 设置文字颜色 / 198
15.4 小结 / 204
XII
第 16 章 签名和发布微博客户端 / 205
16.1 签名应用程序 / 205
16.1.1 使用命令行方式进行签名 / 205
16.1.2 使用 ADT 插件进行签名 / 206
16.2 发布微博客户端 / 207
16.3 小结 / 208
第三部分 高级篇—Android SDK 高级技术
第 17 章 Android 资源详解 / 210
17.1 创建资源 / 210
17.2 访问资源 / 211
17.2.1 生成资源类文件 / 212
17.2.2 从代码中访问资源 / 214
17.2.3 从 XML 文件中访问资源 / 214
17.3 在代码中存取资源 / 216
17.3.1 存取简单资源 / 216
17.3.2 存取对象资源 / 219
17.3.3 处理配置变化 / 221
17.4 本地化 / 222
17.4.1 建立本地化的资源目录 / 222
17.4.2 资源目录的命名规则 / 225
17.4.3 建立别名资源 / 225
17.4.4 资源目录的优先级 / 227
17.5 资源类型 / 227
17.5.1 字符串(String)资源 / 227
17.5.2 布局(Layout)资源 / 230
17.5.3 图像(Drawable)资源 / 232
17.5.4 菜单(Menu)资源 / 242
17.5.5 动画(Animation)资源 / 243
17.5.6 风格(Style)资源 / 247
17.5.7 其他资源 / 248
17.6 小结 / 250
XIII
第 18 章 电话、短信与联系人 / 251
18.1 电话 / 251
18.1.1 显示拨号界面 / 251
18.1.2 直接拨打电话 / 251
18.1.3 控制呼叫转移 / 252
18.1.4 监听来 / 去电 / 254
18.1.5 用程序控制接听和挂断动作 / 257
18.1.6 获取通话记录 / 259
18.2 短信和彩信 / 261
18.2.1 通过系统程序发送短信 / 261
18.2.2 直接发送短信 / 261
18.2.3 保存短信发送记录 / 262
18.2.4 监听短信 / 264
18.2.5 发送彩信 / 265
18.2.6 监听彩信 / 266
18.2.7 显示视频缩略图 / 267
18.2.8 彩信内容与 SMIL 协议 / 270
18.3 联系人 / 280
18.3.1 查看联系人的内容 / 281
18.3.2 添加电话到联系人列表 / 282
18.3.3 修改联系人信息 / 283
18.3.4 删除联系人信息 / 284
18.4 小结 / 284
第 19 章 数据库 / 285
19.1 SQLite 数据库 / 285
19.1.1 管理 SQLite 数据库 / 285
19.1.2 SQLite 数据库基本操作 / 286
19.1.3 事务 / 288
19.1.4 核心函数 / 289
19.1.5 日期和时间函数 / 294
19.1.6 聚合函数 / 297
19.2 Android 版的 SQLite 数据库 / 299
19.2.1 操作数据库 / 299
XIV
19.2.2 升级数据库 / 300
19.2.3 数据绑定 / 302
19.3 持久化数据库引擎 db4o / 304
19.3.1 什么是 db4o / 304
19.3.2 下载和安装 db4o / 305
19.3.3 创建和打开数据库 / 305
19.3.4 操作 Java 对象 / 305
19.4 小结 / 308
第 20 章 蓝牙与 Wi-Fi / 309
20.1 蓝牙编程 / 309
20.1.1 蓝牙简介 / 309
20.1.2 控制蓝牙设备 / 310
20.1.3 使蓝牙设备可被搜索到 / 311
20.1.4 搜索蓝牙设备 / 313
20.1.5 蓝牙设备之间的数据传输 / 316
20.2 Wi-Fi 编程 / 320
20.2.1 控制 Wi-Fi 设备 / 320
20.2.2 获取 Wi-Fi 信息 / 321
20.2.3 客户端 Socket / 323
20.2.4 服务端 Socket / 324
20.2.5 移动版的 Web 服务器实例 / 324
20.2.6 在手机客户端访问 Web 服务器 / 329
20.3 小结 / 330
第 21 章 第三方程序库 / 331
21.1 GTalk 客户端 / 331
21.1.1 XMPP 协议简介 / 331
21.1.2 下载并安装 asmack / 331
21.1.3 登录 GTalk 服务器 / 332
21.1.4 获取联系人信息 / 333
21.1.5 监听联系人是否在线 / 335
21.1.6 发送聊天消息 / 336
21.1.7 接收聊天消息 / 337
XV
21.2 FTP 客户端 / 337
21.2.1 连接与断开 FTP 服务器 / 338
21.2.2 获取与改变当前工作目录 / 339
21.2.3 列出所有的文件和目录 / 339
21.2.4 建立、重命名、删除指定目录 / 341
21.2.5 上传、重命名、下载、删除指定文件 / 341
21.3 绘制图表的程序库 AChartEngine / 342
21.3.1 曲线图 / 342
21.3.2 条形图 / 346
21.3.3 离散点图 / 346
21.3.4 区域图 / 347
21.3.5 饼图 / 349
21.4 小结 / 349
第 22 章 编译在 Android 中的应用 / 350
22.1 JavaCC 使用入门 / 350
22.1.1 JavaCC 下载和安装 / 351
22.1.2 用 JavaCC 生成第一个分析器 / 351
22.2 JavaCC 语法 / 354
22.3 JavaCC 实战:计算器 / 355
22.3.1 生成计算表达式的分析器源代码 / 355
22.3.2 编写计算器的主程序 / 361
22.4 小结 / 365
第 23 章 Android SDK 的 2D 绘图技术 / 366
23.1 绘图基础 / 366
23.1.1 绘制点 / 366
23.1.2 绘制直线 / 368
23.1.3 绘制三角形 / 368
23.1.4 绘制矩形和菱形 / 369
23.1.5 绘制圆、弧和椭圆 / 371
23.1.6 绘制文字 / 372
23.2 高级绘图技术 / 372
23.2.1 在画布上旋转图像 / 373
XVI
23.2.2 在 EditText 控件上绘制图像和文本 / 373
23.2.3 制作动画效果 / 375
23.3 绘图实战:电子罗盘 / 376
23.4 SurfaceView 类 / 378
23.5 小结 / 380
第 24 章 OpenGL ES 绘图技术 / 381
24.1 OpenGL ES 简介 / 381
24.2 构建 OpenGL ES 框架 / 381
24.3 用 OpenGL ES 绘制 2D 图形 / 382
24.3.1 三角形 / 382
24.3.2 矩形 / 384
24.3.3 为图形上色 / 385
24.4 OpenGL ES 实战:旋转立方体 / 387
24.4.1 绘制立方体 / 387
24.4.2 使立方体旋转起来 / 388
24.5 小结 / 389
第 25 章 性能优化 / 390
25.1 性能优化的基础知识 / 390
25.2 编写 Java 程序的最优化原则 / 391
25.2.1 用静态工厂方法代替构造方法 / 391
25.2.2 避免创建重复的对象 / 391
25.2.3 防止内存泄漏 / 393
25.2.4 接口只用于定义类型 / 394
25.2.5 返回零长度的集合而不是 null / 394
25.2.6 通过接口引用对象 / 395
25.3 避免 ANR / 395
25.4 性能检测 / 396
25.4.1 执行时间测试 / 396
25.4.2 内存消耗测试 / 398
25.4.3 测试性能的工具 traceview / 399
25.5 小结 / 400
XVII
第 26 章 Android 4.0 新技术探索 / 401
26.1 全新的 Android,全新的体验 / 401
26.1.1 开发环境 / 401
26.1.2 模拟器 / 402
26.2 Activity 中的容器 Fragment / 405
26.2.1 Fragment 的特点 / 405
26.2.2 Fragment 的生命周期 / 406
26.2.3 显示对话框 / 410
26.2.4 隐藏和显示 Fragment / 412
26.2.5 回退堆栈 / 415
26.3 Android 4.0 的新特性 / 416
26.3.1 联系人提供者中的社会化 API / 416
26.3.2 高分辨率的联系人照片 / 417
26.3.3 新的日历 API / 417
26.3.4 语音信箱 / 417
26.3.5 多媒体 API / 417
26.3.6 人脸识别 / 418
26.3.7 焦距和感光区域 / 418
26.3.8 摄像头自动对焦 / 419
26.3.9 Wi-Fi 点对点连接 / 419
26.3.10 高级的网络应用 / 419
26.3.11 新增的设备传感器 / 420
26.3.12 WebKit 浏览器引擎 / 420
26.4 Android 4.0 实战:应用程序演示 / 420
26.5 小结 / 421