网站购物车   | 店铺购物车  
店铺平均得分:99.79 分,再接再厉!!!【查看全部评价】
评分 40分 50分 60分 70分 80分 90分 100分
数量 0 0 0 1 0 10 606
本店铺共有 0 笔投诉记录,投诉率 0% ,低于平均投诉率 1% 【查看详细】
投诉类型
数量
比例
店主称呼:书小二   联系方式:购买咨询请联系我  13983195021    地址:重庆 重庆市 南岸区 南山街道崇文路
促销广告:满50起包邮,拍下当天发货,最迟第二天发出
图书分类
店铺公告
正常发货,拍下当天发出,最迟第二天发出,电话联系:13983195021
店铺介绍
主要经营大学二手教材,教辅,资料书,还有文学书和课外书
交易帮助
第一步:选择图书放入购物车。
第二步:结算、填写收货地址。
第三步:担保付款或银行汇款。
第四步:卖家发货。
第五步:确认收货、评价。
书名:精通Android
精通Android
出版日期:2013年01月
ISBN:9787115297150 [十位:7115297150]
页数:744      
定价:¥119.00
店铺售价:¥23.80 (为您节省:¥95.20
店铺库存:0
注:您当前是在入驻店铺购买,非有路网直接销售。
正在处理购买信息,请稍候……
我要买: * 如何购买
** 关于库存、售价、配送费等具体信息建议直接联系店主咨询。
联系店主:购买咨询请联系我  13983195021
本店已缴纳保证金,请放心购买!【如何赔付?】
店主推荐图书:
买家对店铺的满意度评价:查看更多>>
评分
评价内容
评论人
订单图书
《精通Android》内容提要:
《精通Android》在上一版的基础上进行了全面改进,不仅在结构上有了相应的调整,内容上更是与时俱进,增加了Android内部构件的相关知识,介绍了线程、进程、长期运行的服务、广播接收程序、闹钟管理器、设备配置变化和异步任务。关于碎片、碎片对话框、ActionBar和拖放等全新内容更是映入大家的眼帘。此外,《精通Android》对服务和传感器的相关章节做了大幅改进。
《精通Android》囊括了Android开发人员所需的一切知识,既可为Android开发人员夯实基础,又能提高Android开发人员的技能。 精通Android_(印)克曼特内尼,(美)麦克莱恩_人民邮电出版社_
《精通Android》图书目录:
目 录
第1章 Android计算平台简介 1
1.1 面向新PC的全新平台 1
1.2 Android的历史 2
1.3 Dalvik VM剖析 4
1.4 理解Android软件栈 5
1.5 使用Android SDK开发*终用户应用程序 6
1.5.1 Android模拟器 6
1.5.2 Android UI 7
1.5.3 Android基础组件 7
1.5.4 **UI概念 8
1.5.5 Android Service组件 10
1.5.6 Android媒体和电话组件 10
1.5.7 Android Java包 11
1.6 利用Android源代码 14
1.6.1 在线浏览Android源代码 14
1.6.2 使用Git下载Android源代码 15
1.7 本书的示例项目 16
1.8 小结 16
第2章 设置开发环境 17
2.1 设置环境 17
2.1.1 下载JDK 6 18
2.1.2 下载Eclipse 3.6 19
2.1.3 下载Android SDK 19
2.1.4 命令行窗口 20
2.1.5 安装ADT 21
2.2 了解基本组件 23
2.2.1 View 23
2.2.2 Activity 23
2.2.3 Fragment 24
2.2.4 Intent 24
2.2.5 ContentProvider 24
2.2.6 Service 24
2.2.7 AndroidManifest.xml 24
2.2.8 AVD 25
2.3 Hello World! 25
2.4 AVD 29
2.5 在真实设备上运行 30
2.6 剖析Android应用程序的结构 31
2.7 了解应用程序生命周期 33
2.8 简单调试 35
2.9 参考资料 37
2.10 小结 37
2.11 面试问题 37
第3章 使用Android资源 39
3.1 资源 39
3.1.1 字符串资源 39
3.1.2 布局资源 41
3.1.3 资源引用语法 43
3.1.4 定义资源ID供以后使用 44
3.1.5 已编译和未编译的Android资源 45
3.2 Android关键资源 46
3.3 使用任意XML资源文件 54
3.4 使用原始资源 55
3.5 使用资产 56
3.6 了解资源目录结构 56
3.7 资源和配置更改 56
3.8 参考资料URL 59
3.9 小结 60
3.10 面试问题 60
第4章 ContentProvider 62
4.1 探索Android内置的ContentProvider 63
4.1.1 在模拟器和可用设备上利用数据库 63
4.1.2 快速了解SQLite 66
4.2 ContentProvider的架构 66
4.2.1 Android内容URI的结构 68
4.2.2 Android MIME类型的结构 68
4.2.3 使用URI读取数据 70
4.2.4 使用游标 71
4.2.5 使用where子句 72
4.2.6 插入记录 74
4.2.7 将文件添加到ContentProvider中 75
4.2.8 更新和删除 76
4.3 实现ContentProvider 76
4.3.1 计划数据库 76
4.3.2 扩展ContentProvider 78
4.3.3 履行MIME类型契约 83
4.3.4 实现query方法 83
4.3.5 实现insert方法 83
4.3.6 实现update方法 84
4.3.7 实现delete方法 84
4.3.8 使用UriMatcher来解析URI 84
4.3.9 使用投影映射 85
4.3.10 注册提供程序 86
4.4 练习图书提供程序 86
4.4.1 添加图书 86
4.4.2 删除图书 87
4.4.3 获取图书数量 87
4.4.4 显示图书列表 87
4.5 资源 88
4.6 小结 89
4.7 面试问题 89
第5章 Intent 90
5.1 Android Intent基础知识 90
5.2 Android中可用的Intent 91
5.3 Intent的组成 93
5.3.1 Intent和数据URI 93
5.3.2 一般操作 94
5.3.3 使用extra信息 95
5.3.4 使用组件直接调用活动 96
5.3.5 Intent类别 97
5.3.6 将Intent解析为组件的规则 99
5.4 练习使用ACTION_PICK 101
5.5 练习使用GET_CONTENT操作 103
5.6 挂起的Intent 104
5.7 资源 105
5.8 小结 106
5.9 面试问题 106
第6章 构建用户界面和使用控件 107
6.1 Android中的UI开发 107
6.1.1 完全利用代码来构建UI 108
6.1.2 完全使用XML构建UI 110
6.1.3 使用XML结合代码构建UI 111
6.2 Android中的常见控件 113
6.2.1 文本控件 113
6.2.2 按钮控件 116
6.2.3 ImageView控件 123
6.2.4 日期和时间控件 124
6.2.5 MapView控件 127
6.3 适配器 127
6.3.1 SimpleCursorAdapter 128
6.3.2 了解ArrayAdapter 129
6.4 结合使用适配器和AdapterView 131
6.4.1 基本的列表控件:ListView 131
6.4.2 GridView控件 138
6.4.3 Spinner控件 140
6.4.4 Gallery控件 141
6.4.5 创建自定义适配器 142
6.4.6 Android中的其他控件 146
6.5 样式和主题 147
6.5.1 使用样式 147
6.5.2 使用主题 149
6.6 布局管理器 150
6.6.1 LinearLayout布局管理器 150
6.6.2 TableLayout布局管理器 153
6.6.3 RelativeLayout布局管理器 156
6.6.4 FrameLayout布局管理器 157
6.6.5 GridLayout布局管理器 159
6.6.6 为各种设备配置自定义布局 160
6.7 参考资料 161
6.8 小结 161
6.9 面试问题 161
第7章 使用菜单 163
7.1 Android菜单 163
7.1.1 创建菜单 164
7.1.2 使用菜单组 165
7.1.3 响应菜单项 166
7.2 使用其他菜单类型 168
7.2.1 展开的菜单 168
7.2.2 使用图标菜单 169
7.2.3 使用子菜单 169
7.2.4 使用上下文菜单 170
7.2.5 使用交替菜单 173
7.2.6 动态菜单 175
7.3 通过XML文件加载菜单 175
7.3.1 XML菜单资源文件的结构 176
7.3.2 填充XML菜单资源文件 177
7.3.3 响应基于XML的菜单项 177
7.3.4 4.0版本中的弹出式菜单 178
7.3.5 其他XML菜单标记简介 179
7.4 资源 181
7.5 小结 181
7.6 面试问题 181
第8章 多用途的碎片 183
8.1 什么是碎片 183
8.1.1 何时使用碎片 184
8.1.2 碎片的结构 185
8.1.3 碎片的生命周期 186
8.1.4 展示生命周期的示例碎片应用程序 189
8.2 FragmentTransactions和碎片后退栈 194
8.3 FragmentManager 196
8.3.1 引用碎片时的注意事项 197
8.3.2 保存片段状态 198
8.3.3 ListFragments和 198
8.3.4 在需要时调用独立的活动 200
8.3.5 碎片的持久化 201
8.4 碎片之间的通信方式 202
8.5 使用ObjectAnimator自定义动画 203
8.6 参考资料 205
8.7 小结 205
8.8 面试问题 206
第9章 对话框 207
9.1 使用Android对话框 207
9.2 对话框碎片 207
9.2.1 DialogFragment的基础知识 208
9.2.2 构建对话框碎片 208
9.2.3 DialogFragment示例应用程序 212
9.3 使用Toast 220
9.4 旧版本Android的对话框碎片 221
9.5 参考资料 221
9.6 小结 222
9.7 面试问题 222
第10章 ActionBar 223
10.1 ActionBar剖析 223
10.2 选项卡导航操作栏活动 225
10.2.1 实现基础活动类 225
10.2.2 为ActionBar分配统一的行为 227
10.2.3 实现选项卡监听器 229
10.2.4 实现选项卡操作栏活动 230
10.2.5 可滚动的调试文本视图布局 232
10.2.6 操作栏和菜单交互 233
10.2.7 Android描述文件 235
10.2.8 测试选项卡操作栏活动 235
10.3 列表导航操作栏活动 236
10.3.1 创建SpinnerAdapter 236
10.3.2 创建列表监听器 237
10.3.3 设置列表操作栏 237
10.3.4 更改BaseActionBar-Activity 238
10.3.5 更改AndroidManifest.xml 238
10.3.6 测试列表操作栏活动 239
10.4 标准导航操作栏活动 240
10.4.1 设置标准导航操作栏活动 240
10.4.2 更改BaseActionBar-Activity 241
10.4.3 更改AndroidManifest.xml 242
10.4.4 测试标准操作栏活动 242
10.5 工具栏与搜索视图 243
10.5.1 将搜索视图部件定义为菜单项 244
10.5.2 配置搜索结果活动 244
10.5.3 通过可搜索XML文件自定义搜索 245
10.5.4 在配置清单文件中定义搜索结果活动 245
10.5.5 确定搜索视图部件的搜索目标 245
10.6 操作栏和碎片 246
10.7 参考资料 246
10.8 小结 247
10.9 面试问题 247
第11章 **调试与分析 249
11.1 启用**调试 249
11.2 Debug透视图 249
11.3 DDMS透视图 250
11.4 Hierarchy View透视图 252
11.5 Traceview 253
11.6 adb命令 254
11.7 模拟器控制台 255
11.8 StrictMode 255
11.8.1 StrictMode策略 255
11.8.2 关闭StrictMode 256
11.8.3 在旧版本Android上使用StrictMode 257
11.8.4 StrictMode练习 258
11.9 参考资料 259
11.10 小结 259
11.11 面试问题 259
第12章 响应配置变化 261
12.1 配置变化过程 261
12.1.1 活动的销毁/创建过程 262
12.1.2 碎片的销毁/创建过程 263
12.1.3 使用FragmentManager保存碎片状态 264
12.1.4 使用碎片的setRetain-Instance 264
12.2 弃用的配置变化方法 264
12.3 参考资料 265
12.4 小结 265
12.5 面试问题 265
第13章 **项及保存状态 266
13.1 探索**项框架 266
13.1.1 ListPreference 266
13.1.2 CheckBoxPreference 273
13.1.3 EditTextPreference 275
13.1.4 RingtonePreference及MultiSelectListPreference 276
13.2 组织**项 276
13.2.1 使用PreferenceCategory 276
13.2.2 创建依赖的子**项 279
13.2.3 带标题的**项 279
13.3 以编程方式操作**项 281
13.3.1 使用**项保存状态 281
13.3.2 使用DialogPreference 282
13.4 参考资料 283
13.5 小结 283
13.6 面试问题 283
第14章 探索**性和权限 284
14.1 理解Android**性模型 284
14.1.1 **性概念概述 284
14.1.2 为部署签名应用程序 285
14.2 执行运行时**性检查 290
14.2.1 进程边界上的**性 290
14.2.2 声明和使用权限 290
14.2.3 理解和使用自定义权限 292
14.2.4 理解和使用URI权限 297
14.3 参考资料 298
14.4 小结 298
14.5 面试问题 299
第15章 构建和使用服务 300
15.1 使用HTTP服务 300
15.1.1 将HttpClient用于HTTP GET请求 300
15.1.2 将HttpClient用于HTTP POST请求(多部分POST请求示例) 302
15.1.3 SOAP、JSON和XML分析程序 304
15.1.4 处理异常 305
15.1.5 解决多线程问题 307
15.1.6 有趣的超时 309
15.1.7 使用HttpURLConnection 310
15.1.8 使用AndroidHttpClient 310
15.1.9 使用后台线程(AsyncTask) 311
15.1.10 使用DownloadManager获取文件 316
15.2 使用Android服务 321
15.2.1 Android中的服务 322
15.2.2 本地服务 323
15.2.3 AIDL服务 329
15.2.4 在AIDL中定义服务接口 329
15.2.5 实现AIDL接口 331
15.2.6 从客户端应用程序调用服务 333
15.2.7 向服务传递复杂的类型 336
15.3 参考资料 345
15.4 小结 345
15.5 面试问题 346
第16章 包 347
16.1 包和进程 347
16.1.1 包规范的细节 347
16.1.2 将包名称转换为进程名称 347
16.1.3 列出安装的包 348
16.1.4 通过包浏览器删除包 348
16.2 包签名过程回顾 349
16.2.1 理解数字签名:场景1 349
16.2.2 理解数字签名:场景2 350
16.2.3 一种理解数字签名的模式 350
16.2.4 数字签名执行方式 350
16.2.5 签名过程的影响 350
16.3 在包之间共享数据 351
16.3.1 共享用户ID的性质 351
16.3.2 共享数据的代码模式 352
16.4 库项目 353
16.4.1 库项目的概念 353
16.4.2 库项目的性质 353
16.4.3 创建库项目 355
16.4.4 创建使用库的Android项目 358
16.4.5 使用库项目的注意事项 365
16.5 参考资料 365
16.6 小结 366
16.7 面试问题 366
第17章 处理程序 368
17.1 Android组件和线程 368
17.1.1 活动在主线程上运行 369
17.1.2 广播接收程序在主线程上运行 369
17.1.3 服务在主线程上运行 369
17.1.4 ContentProvider在主线程上运行 370
17.1.5 单一主线程的影响 370
17.1.6 线程池、ContentProvider及外部服务组件 370
17.1.7 线程实用程序:发现线程 370
17.2 处理程序 371
17.2.1 持有主线程的影响 372
17.2.2 使用处理程序延迟主线程上的工作 373
17.2.3 延迟工作的处理程序源代码示例 373
17.2.4 构造合适的Message对象 375
17.2.5 将Message对象发送给队列 375
17.2.6 响应handleMessage回调 376
17.3 使用工作线程 376
17.3.1 从菜单调用工作线程 376
17.3.2 在工作线程与主线程之间通信 377
17.4 组件和进程寿命 380
17.4.1 活动生命周期 380
17.4.2 服务生命周期 381
17.4.3 接收程序生命周期 381
17.4.4 提供程序生命周期 382
17.5 参考资料 382
17.6 小结 382
17.7 面试问题 383
第18章 AsyncTask详解 384
18.1 实现一个简单的AsyncTask 385
18.1.1 实现AsyncTask的泛型 385
18.1.2 创建AsyncTask子类 386
18.1.3 实现**个AsyncTask 386
18.1.4 调用一个AsyncTask 388
18.1.5 onPreExecute()回调方法和进度对话框 388
18.1.6 doInBackground()方法 389
18.1.7 触发onProgressUpdate() 389
18.1.8 onPostExecute()方法 390
18.1.9 升级为确定性进度对话框 390
18.2 AsyncTask的性质 392
18.3 设备旋转与AsyncTask 393
18.4 生命周期方法与AsyncTask 393
18.5 参考资料 393
18.6 小结 394
18.7 面试问题 394
第19章 广播接收程序和长期运行的服务 395
19.1 广播接收程序 395
19.1.1 发送广播 395
19.1.2 编写简单的接收程序:示例代码 396
19.1.3 在描述文件中注册接收程序 396
19.1.4 容纳多个接收程序 397
19.1.5 进程外接收程序项目 399
19.2 从接收程序使用通知 399
19.2.1 通过通知管理器监控通知 400
19.2.2 发送通知 401
19.2.3 在广播接收程序中启用活动 404
19.3 长期运行的接收程序和服务 404
19.3.1 长期运行的广播接收程序协议 404
19.3.2 IntentService 405
19.3.3 IntentService源代码 406
19.4 为广播接收程序扩展IntentService 407
19.4.1 长期运行的广播服务抽象 408
19.4.2 长期运行的接收程序 409
19.4.3 使用LightedGreenRoom抽象唤醒锁 411
19.5 长期运行的服务的实现 416
19.5.1 非粘滞性服务的细节 417
19.5.2 粘滞性服务的细节 417
19.5.3 非粘滞性的变体:重传送(redeliver)Intent 418
19.5.4 在onStartCommand中指定服务标志 418
19.5.5 挑选合适的粘滞性 418
19.5.6 从两个位置控制唤醒锁 418
19.5.7 长期运行的服务的实现 419
19.5.8 测试长期运行的服务 420
19.5.9 ***的职责 420
19.5.10 框架的职责 421
19.6 关于项目下载文件的一些说明 421
19.7 参考资料 422
19.8 小结 422
19.9 面试问题 422
第20章 闹钟管理器 424
20.1 闹钟管理器基本知识:设置一个简单的闹钟 424
20.1.1 获取闹钟管理器人的访问权限 424
20.1.2 设置闹钟时间 424
20.1.3 创建闹钟接收程序 425
20.1.4 创建适合闹钟的PendingIntent 426
20.1.5 设置闹钟 427
20.1.6 测试项目 427
20.2 探索其他闹钟管理器场景 428
20.2.1 设置重复闹钟 428
20.2.2 取消闹钟 429
20.2.3 使用多个闹钟 430
20.2.4 Intent在设置闹钟时的首要职责 432
20.2.5 闹钟的持久化 434
20.3 闹钟管理器事实 434
20.4 参考资料 434
20.5 小结 435
20.6 面试问题 435
第21章 2D动画揭秘 436
21.1 逐帧动画 436
21.1.1 计划逐帧动画 436
21.1.2 创建活动 438
21.1.3 将动画添加到活动 439
21.2 布局动画 441
21.2.1 基本的补间动画类型 442
21.2.2 计划布局动画测试工具 442
21.2.3 创建活动和ListView 443
21.2.4 将ListView制作成动画 445
21.2.5 使用插值器 447
21.3 视图动画 449
21.3.1 理解视图动画 449
21.3.2 添加动画 451
21.3.3 使用Camera实现2D图像的深度效果 454
21.3.4 探索AnimationListener类 455
21.3.5 关于变换矩阵的一些说明 456
21.4 属性动画:新动画API 457
21.4.1 属性动画 458
21.4.2 计划一个属性动画的试验台 459
21.4.3 使用对象动画生成器创建基本视图动画 461
21.4.4 使用AnimatorSet实现顺序动画 462
21.4.5 用AnimatorSetBuilder设置动画关系 463
21.4.6 使用XML加载动画生成器 463
21.4.7 使用PropertyValuesHolder 464
21.4.8 视图属性动画 466
21.4.9 类型求值器 466
21.4.10 关键帧 468
21.4.11 布局转变 469
21.5 参考资料 470
21.6 小结 470
21.7 面试问题 471
第22章 地图和基于位置的服务 472
22.1 地图包 472
22.1.1 从谷歌获取map-api密钥 473
22.1.2 MapView和MapActivity 474
22.1.3 使用覆盖图添加标记 479
22.2 位置包 484
22.2.1 使用Android进行地理编码 484
22.2.2 使用后台线程进行地理编码 487
22.2.3 LocationManager服务 489
22.2.4 使用MyLocationOverlay显示位置 495
22.2.5 使用接近提醒 498
22.3 参考资料 502
22.4 小结 502
22.5 面试问题 503
第23章 电话API 504
23.1 使用SMS 504
23.1.1 发送SMS消息 504
23.1.2 监视传入的SMS消息 507
23.1.3 使用SMS文件夹 509
23.1.4 发送电子邮件 511
23.2 使用电话管理器 511
23.3 SIP 514
23.3.1 体验SipDemo 514
23.3.2 android.net.sip包 515
23.4 参考资料 516
23.5 小结 517
23.6 面试问题 517
第24章 媒体框架 518
24.1 使用媒体API 518
24.2 播放媒体 522
24.2.1 播放音频内容 522
24.2.2 播放视频内容 532
24.3 录制媒体 534
24.3.1 使用MediaRecorder录制音频 535
24.3.2 使用AudioRecord录制音频 538
24.3.3 视频录制 542
24.3.4 MediaStore类 551
24.3.5 使用Intnet录制音频 551
24.3.6 将媒体内容添加到媒体存储 554
24.3.7 为整个SD卡触发MediaScanner 556
24.4 参考资料 557
24.5 小结 557
24.6 面试问题 558
第25章 主屏幕部件 559
25.1 主屏幕部件的架构 559
25.1.1 什么是主屏幕部件 559
25.1.2 主屏幕部件的用户体验 560
25.1.3 部件的生命周期 563
25.2 示例部件应用程序 567
25.2.1 定义部件提供程序 568
25.2.2 定义部件尺寸 569
25.2.3 与部件布局相关的文件 570
25.2.4 实现部件提供程序 571
25.2.5 实现部件模型 573
25.2.6 实现部件配置活动 579
25.3 部件预览工具 582
25.4 部件局限性和扩展 583
25.5 基于容器的部件 583
25.6 资源 583
25.7 小结 584
25.8 面试问题 584
第26章 列表部件 586
26.1 远程视图概述 586
26.2 在远程视图中使用列表 587
26.2.1 准备远程布局 588
26.2.2 加载远程布局 590
26.2.3 创建RemoteViewsService 591
26.2.4 创建RemoteViewsFactory 592
26.2.5 创建onClick事件 595
26.2.6 响应onClick事件 597
26.3 工作样例:测试主屏幕列表部件 598
26.3.1 创建测试部件提供程序 599
26.3.2 创建远程视图工厂 602
26.3.3 编写远程视图服务的代码 604
26.3.4 部件主布局文件 604
26.3.5 部件提供程序元数据 604
26.3.6 AndroidManifest.xml 605
26.4 测试列表部件 605
26.5 参考资料 607
26.6 小结 608
26.7 面试问题 608
第27章 触摸屏 609
27.1 MotionEvent 609
27.1.1 MotionEvent对象 609
27.1.2 回收MotionEvent 619
27.1.3 使用VelocityTracker 619
27.2 多点触摸 621
27.3 触摸地图 627
27.4 手势 629
27.4.1 捏合手势 629
27.4.2 GestureDetector和OnGestureListener 629
27.4.3 自定义手势 632
27.4.4 Gestures Builder应用程序 632
27.5 参考资料 638
27.6 小结 638
27.7 面试问题 638
第28章 实现拖放操作 640
28.1 拖放操作简介 640
28.2 3.0及其以上版本的基本拖放操作 644
28.3 拖放操作示例应用程序 645
28.3.1 文件列表 646
28.3.2 示例拖放应用程序的布局 646
28.3.3 响应Dropzone的onDrag事件 648
28.3.4 创建拖动源视图 650
28.4 测试示例拖放应用程序 653
28.5 参考资料 654
28.6 小结 654
28.7 面试问题 654
第29章 传感器 655
29.1 什么是传感器 655
29.1.1 检测传感器 656
29.1.2 可以了解的传感器信息 656
29.2 获取传感器事件 658
29.3 解释传感器数据 661
29.3.1 光线传感器 661
29.3.2 接近传感器 661
29.3.3 温度传感器 662
29.3.4 压力传感器 662
29.3.5 陀螺仪传感器 662
29.3.6 加速度计 663
29.3.7 磁场传感器 667
29.3.8 结合使用加速度计和磁场传感器 668
29.3.9 方向传感器 668
29.3.10 磁偏角和Geomagnetic-Field 673
29.3.11 重力传感器 673
29.3.12 直线加速度传感器 674
29.3.13 旋转矢量传感器 674
29.3.14 近场通信传感器 674
29.4 参考资料 683
29.5 小结 683
29.6 面试问题 684
第30章 联系人API 685
30.1 账户 685
30.1.1 账户屏幕概览 686
30.1.2 账户与联系人的相关性 688
30.1.3 枚举账户 689
30.2 联系人应用程序 689
30.2.1 个人账号简介 691
30.2.2 显示联系人 692
30.2.3 显示联系人详细信息 692
30.2.4 编辑联系人详细信息 693
30.2.5 设置联系人的照片 694
30.2.6 导出联系人 694
30.2.7 各种联系人数据类型 696
30.3 联系人 696
30.3.1 联系人SQLite数据库 697
30.3.2 原始联系人 697
30.3.3 数据表 699
30.3.4 聚合联系人 700
30.3.5 view_contacts 701
30.3.6 contact_entities_view 702
30.4 联系人API 703
30.4.1 浏览账户 703
30.4.2 浏览聚合联系人 705
30.4.3 浏览原始联系人 712
30.4.4 浏览原始联系人数据 715
30.4.5 添加联系人和它的详细信息 718
30.5 控制聚合 720
30.6 同步的影响 720
30.7 个人账号 721
30.7.1 读取账号原始联系人 722
30.7.2 读取账号联系人数据 722
30.7.3 添加数据到个人账号 723
30.8 参考资料 725
30.9 小结 725
30.10 面试问题 726
第31章 部署应用程序Android Market 727
31.1 成为发布者 727
31.1.1 遵守规则 728
31.1.2 开发人员控制台 729
31.2 准备销售应用程序 731
31.2.1 针对不同设备进行测试 732
31.2.2 支持不同的屏幕尺寸 732
31.2.3 准备上传AndroidManifest.xml 732
31.2.4 本地化应用程序 733
31.2.5 准备应用程序图标 734
31.2.6 付费应用程序需要考虑的因素 734
31.2.7 将用户引导至Market 735
31.2.8 Android授权服务 735
31.2.9 使用ProGuard来优化及对抗盗版行为 736
31.2.10 准备上传.apk文件 737
31.3 上传应用程序 738
31.3.1 图表 738
31.3.2 列出详细信息 739
31.3.3 发布选项 739
31.3.4 联系信息 740
31.3.5 需遵守的规定 740
31.4 Android Market上的用户体验 741
31.5发布途径 742
31.6 参考资料 742
31.7 小结 743
31.8 面试问题 743
《精通Android》文章节选:
Android计算平台简介

算正逐渐变得比以往更为易懂。手持设备已转变成计算平台。
移动设备(手机或平板电脑)正成为非常强大的通用计算平台,势必成为真正的PC。据预测,所有传统PC制造商都在计划推出基于Android的各种规格的设备。各种操作系统之间、计算平台之间、编程语言之间,以及开发框架之间的竞争将转而在移动设备上重演。
我们还预测,随着越来越多的IT应用程序开始推出移动版本,IT行业将掀起一场移动编程热潮。为了帮助读者从这一趋势中受益,本书将介绍如何使用Java为运行在谷歌公司Android平台(http://developer.android.com/index.html)上的设备开发应用程序。Android是一个面向移动开发和平板电脑开发的开源平台。
说明 Android令我们非常激动,因为它是一个引入了众多全新的框架设计模式的先进的基于Java的平台(即使受到移动平台的限制)。
本章将概述Android及其SDK,简短介绍一些重要的包,引出每章将涉及的主题,展示如何利用Android源代码,并**介绍一下为Android平台编程的美好前景。
1.1 面向新PC的全新平台
Android平台融入了面向手持设备的通用计算理念。它是一个综合平台,包含一个基于Linux的操作系统,用于管理设备、内存和进程。Android中的Java库涵盖了电话、视频、语音、图形、连接、UI编程和设备的其他许多方面。
说明 尽管是针对移动设备和平板设备而构建,但Android平台具备全功能桌面框架的所有特征。谷歌公司通过Android
SDK(Software Development Kit,软件开发工具包)将此框架提供给Java程序员。在使用Android
SDK时,很难感受到是在向移动设备编写应用程序,因为你能够访问在桌面或服务器(包括关系数据库)上使用的大部分类库。
Android SDK支持大多数Java SE(Java Platform, Standard
Edition),但并不支持AWT(Abstract Window
Toolkit,抽象窗口工具包)和Swing。对于AWT和Swing,Android
SDK拥有自己的扩展现代UI框架(extensive modern UI
framework)。因为你在使用Java编写应用程序,所以可以想到,需要一个JVM(Java Virtual
Machin,Java虚拟机)来解释运行时Java字节码。JVM通常会提供必要的优化,以使Java能够达到与C和C++等编译语言相当的性能水平。Android提供了自己的经过优化的
JVM来运行已编译的Java类文件,以克服手持设备在内存、处理器速度和功率等方面上的限制。这个虚拟机称为Dalvik
VM(1.3节将详细介绍)。
说明 Java编程语言的简单性和人们对它的熟悉,再加上Android丰富的类库,使Android成为了富有吸引力的编程平台。
图1-1简单展示了Android软件栈(1.4节将更详细地介绍它)。

图1-1 Android软件栈的总体结构
1.2 Android的历史
各种手机使用着不同的操作系统,比如Symbian OS、微软公司的Windows Phone OS、Mobile
Linux、iPhone OS(基于Mac OS
X)、Moblin(来自英特尔公司)以及许多其他专用操作系统。迄今为止,没有一个操作系统成为事实标准。可用于开发移动应用程序的API和环境具有诸多限制,似乎远远落后于桌面框架。对比之下,Android平台具有开放、经济和代码开源的特点,更重要的是,它还包含一个高端、高度集成且一致的开发框架。
谷歌公司于2005年收购了新兴公司Android,开始开发Android平台(参见图1-2)。Android公司的重要成员包括Andy
Rubin、Rich Miner、Nick Sears和Chris White。
2007年11月,Android SDK**发布“预览”版。2008年9月,T-Mobile发布了T-Mobile
G1,这是**部基于Android平台的智能手机。从那以后,我们相继看到了SDK2.0、3.0及现在的4.0,基本上是一年一个新版本。应用Android操作系统的设置一开始只是涓涓细流,现如今已是波涛汹涌。

图1-2 Android的发展历程
Android的一个重要架构目标是使应用程序能够彼此交互,重用彼此的组件。这种重用不仅适用于服务(service),还适用于数据和用户界面(UI)。
由于功能完善成熟,Android也吸引了一些早期追随者利用Web资源所提供的云计算模型,使用手机自身的本地数据存储增强云计算体验。Android对手机上的关系数据库的支持也是吸引早期采用者的一个重要因素。
1.0和1.1版(2008年发布)的Android不支持软键盘,设备需要配备物理键盘。2009年4月发布的1.5
SDK解决了这个问题,该版本还包含许多其他功能,比如**媒体录制功能、部件和活动文件夹(live folder)。
2009年9月发布了Android 1.6,在一个月内又发布了Android
2.0,这有力地推动了2009年圣诞节众多Android设备的上市。这个版本引入了**搜索功能和文本到语音的转换功能。
Android
2.3包括以下重要的功能:由管理员远程擦除**数据、在光照不足条件下使用照相机和视频、Wi-Fi热点、重大的性能改善、改进的蓝牙功能、可选择将应用程序安装在SD卡上、OpenGL
ES
2.0支持、备份改进、搜索实用性改进、针对信用卡处理的近场通信支持、显著改进的动作和传感器支持(类似于Wii)、视频聊天以及改进的Market。
Android 3.0主要针对基于平板电脑的设备和强大得多的双核处理器,比如NVIDIA Tegra
2。此版本的主要功能包括支持使用较大的屏幕,引入了一个名为“碎片”的重要的新概念。这个概念渗透到了3.0版的体验中。Android
3.0还引入了更加类似于桌面的功能,比如action
bar和拖放。主屏幕部件得到了显著改进。现在有更多UI控件可用。在3D领域,OpenGL使用Renderscript得以改进,为ES
2.0提供了进一步的补充。它对于平板电脑而言是一项激动人心的功能。
然而,3.0版本仅支持平板电脑。在3.0发布时,Android
2.x版本分支继续支持手机,而3.x分支则支持平板电脑。从4.0开始,Android将这些版本分支合并在一起,形成一个SDK。对于手机用户而言,平板电脑体验的主要UI差别也移植到了手机上。
4.0版本用户体验的主要方面如下。
使用新字体Roboto,在高清屏幕上显示清新效果。
采用一种更好的方法,在首页上将应用组织到文件夹。
支持将应用和文件夹拖到收藏托盘,使它们总是显示在屏幕底部。
基于设备类型进行通知优化。在小型设备上,通知显示在上面,而对于大型设备,则显示在底部的系统栏。
支持可变尺寸和可滚动的小部件。
各种屏幕解锁方法。
拼写检查程序。
通过“连续说话”选项改进语音输入。
更多网络数据使用控制方法。
改进联系人应用,增加与社会化网络相似的个人账号管理。
改进日历应用。
优化照相机应用:连续对焦、无快门滞后、人脸识别、触控对焦和照片编辑器。
照片逼真效果和视频傻瓜效果。
快速抓取和分享屏幕截图。
浏览器性能提升了两倍。
改进电子邮件。
提出新概念:通过基于NFC共享的Android Beam发送数据。
支持Wi-Fi Direct,推进P2P服务。
支持蓝牙HDP(Bluetooth Health Device Profile)。
4.0增加的主要***支持如下。
修正基于对象(包括视图)属性变化的动画。
修复3.0中多个基于列表小部件行为。
更成熟且集成搜索的工具栏。
支持大量的移动标准:**音频分发模型(Advanced Audio Distribution Profile,
A2DP:支持使用外部扬声器)、实时传输协议(Realtime Transport Protocol,
RTP:通过IP传输流式音频/视频)、媒体传输协议(Media Transfer Protocol,
MTP)、图片传输协议(Picture Transfer Protocol,
PTP:连接计算机下载照片和媒体文件)和蓝牙耳机模块(Bluetooth Headset Profile, HSP)。
全设备加密。
数字版权管理(DRM)。
加密存储与密码。
包括个人账号的社会化API。
增强的日历API。
语音邮件API。
1.3 Dalvik VM剖析
作为Android平台的一部分,谷歌公司花了大量时间思考针对低功耗手持设备的优化设计。与桌面设备相比,手持设备在内存和速度方面落后8~10年。它们的计算能力也有限。结果,手机的性能需求变得很严格,要求手机设计人员优化所有因素。如果查看Android中的包列表,你将会看到它们的功能全面而丰富。
这些问题使谷歌公司在许多方面重新审视标准JVM实现。(Dan
Bornstein对谷歌公司的这个JVM实现作出了重要贡献,他编写了Dalvik
VM,Dalvik是冰岛一个小镇的名称。)首先,Dalvik
VM获取生成的Java类文件,将它们组合为一个或多个Dalvik可执行文件(.dex)。Dalvik
VM的目标是找到所有可能的方式来优化JVM空间、性能及电池寿命。
采用Dalvik
VM的一个结果是,Android中*终的可执行程序代码不是基于Java字节码,而是基于.dex文件。这意味着无法直接执行Java字节码,必须首先得到Java类文件,然后将它们转换为可链接的.dex文件。
1.4 理解Android软件栈
到目前为止,我们介绍了Android的历史和它的优化功能,包括Dalvik
VM,还提到了可用的Java软件栈。本节将介绍与Android开发有关的内容。图1-3显示了从开发人员的视角所得出的Android软件栈。

图1-3 Android SDK软件栈详细结构
Android平台的核心是Linux内核,它负责设备驱动程序、资源访问、电源管理和完成其他操作系统的职责。提供的设备驱动程序包括显示器、照相机、键盘、Wi-Fi、闪存、音频和IPC(Inter-Process
Communication,进程间通信)。尽管核心是Linux,但Android设备(比如Motorola
Droid)上的绝大部分应用程序都是使用Java开发,通过Dalvik VM运行的。
我们看一下另一层,内核之上是许多C/C++库,比如OpenGL、WebKit、FreeType、SSL(Secure Sockets
Layer,**套接字层)、libc(C运行时库)、SQLite和媒体。基于BSD(Berkeley Software
Distribution,伯克利软件套件)的系统C库针对嵌入式Linux设备进行了调优(大小约为原始大小的一半)。媒体库基于PacketVideo(www.packetvideo.com/)的OpenCORE���这些库负责录制和播放音频和视频格式的内容。一个名为Surface
Manager的库控制对显示系统的访问,支持2D和3D。
说明 这些核心库可能会发生变化,因为它们都属于Android的内部实现细节,不会直接加到已发布的Android
API上。这里对核心库进行介绍,只是希望读者了解Android的底层特性。请参考Android***网站,了解*新更新和未来变化。
WebKit库负责浏览器支持,WebKit也是谷歌公司的Chrome和苹果公司的Safari使用的库。FreeType库负责字体支持。SQLite(www.sqlite.org/)是一个可在设备自身上使用的关系数据库。SQLite也是关系数据库的一项独立的开源成果,没有直接绑定到Android。适用于SQLite的工具也可用于Android数据库。
大多数应用程序框架都通过Dalvik VM访问这些核心库,Dalvik
VM就像Android平台的入口。前面几节已经提到,Dalvik经过了优化,可以运行多个VM实例。访问这些核心库时,每个Java应用程序都会获得自己的VM实例。
Android Java
API的主要库包括电话、资源、位置、UI、ContentProvider(数据)和包管理器(安装及**等)。程序员使用此Java
API开发*终用户应用程序。设备上的一些*终用户应用程序示例包括Home、Contacts、Phone及Browser等。
Android还支持谷歌公司一个名为Skia的自定义2D图形库,这个库是使用C和C++编写的。Skia也是Google
Chrome浏览器的核心组件。然而,Android中的3D API基于来自Khronos小组(www.
khronos.org)的一个OpenGL ES实现。OpenGL ES包含OpenGL中面向嵌入式系统的子集。
从媒体角度讲,Android平台支持*常见的音频、视频和图像格式。从无线角度讲,Android的API可支持蓝牙、EDGE、3G、Wi-Fi和GSM(Global
System for Mobile Communication,全球移动通信系统)电话,而具体则取决于设备硬件。
1.5 使用Android SDK开发*终用户应用程序
本节将介绍用于在Android上开发*终用户应用程序的**Android Java
API。我们将简单介绍Android模拟器、Android基础组件、UI编程、服务、媒体、电话、动画和OpenGL等。
1.5.1 Android模拟器
Android SDK包含一个Eclipse插件,名为ADT(Android Development
Tools,Android开发工具)。这个IDE(Integrated Development
Environment,集成开发环境)工具用于开发、调试和测试Java应用程序。(第2章将深入介绍ADT。)也可以单独使用Android
SDK,使用命令行工具代替ADT。两种方法都支持使用模拟器来运行、调试和测试应用程序。甚至90%的应用程序开发工作都不需要真实设备。全功能的Android模拟器能够模拟大部分的设备功能。模拟器不能模拟USB连接、照相机与视频采集、耳机、电池仿真、蓝牙、Wi-Fi、NFC和OpenGL
ES 2.0。
Android模拟器使用一种名为QEMU的开源“处理器模拟器”技术来完成它的工作,此技术由Fabrice
Bellard(http://wiki.qemu.org/Index.html)开发。这项技术还支持在一个操作系统上模拟另一个操作系统,而不用考虑采用了何种处理器。QEMU支持在CPU级别上进行模拟。
在Android模拟器中,处理器基于ARM(Advanced RISC
Machine,**精简指令集机器)架构。ARM是一种基于RISC(Reduced Instruction Set
Computer,精减指令集计算机)的32位微处理器架构,其设计上的简单性和较高的速度通过指令集中精减的指令来实现。模拟器在此模拟处理器上运行Linux的Android版本。
ARM被广泛应用于手持设备和其他嵌入式电子设备中,低功耗对这些设备非常重要。移动市场也广泛使用了基于此架构的处理器。
可以在Android
SDK文档中找到关于该模拟器的更多详细信息:http://developer.android.com/
guide/developing/tools/emulator.html。
1.5.2 Android UI
Android使用的UI框架类似于其他基于桌面的全功能UI框架。实际上,它在本质上更加先进,更具异步特征。如果将基于C的传统Microsoft
Windows API看做**代UI框架,将基于C++的MFC(Microsoft Foundation
Classes,Microsoft基础类)看做第二代,基于Java的Swing
UI框架可以看做第三代,它比MFC具有更高的设计灵活性。从本质上来讲,Android UI是第四代UI框架。Android
UI、JavaFX、Microsoft Silverlight和Mozilla XUL(XML User Interface
Language,XML用户界面语言)都是第四代UI框架的新成员,它们的UI是声明性的,具有独立的主题。
说明 在Android中,即使编程的目标设备是手持设备,也会使用一种时尚的用户界面模式。
在Android
UI中编程涉及在XML文件中声明界面。然后将这些XML视图(view)定义作为窗口加载到UI应用程序中。这与基于HTML的web页面很相似。与HTML一样,通过其ID及使用Java代码操作它们来找到(掌握)单独控制。
甚至Android应用程序中的菜单也是从XML文件加载的。Android中的屏幕或窗口通常称为活动(activity),包含用户完成一个逻辑动作单元所需的多个View。View是Android中的基本UI构建块,可以对它们进一步组合形成名为视图组的复合视图。
View在内部使用我们熟悉的画布、绘图和用户交互概念。在Android中,承载这些复合视图(包括View和视图组)的Activity是逻辑上可替换的UI组件。
Android
3.0引入了另一个名为碎片的UI概念,允许开发人员将视图和功能在平板电脑上分块显示。平板电脑为多窗格活动提供了充足的屏幕空间,而碎片提供了这些窗格的抽象。
Android框架的一个重要概念是Activity窗口的生命周期管理。Android采用一些协议在用户隐藏、还原、停止和关闭Activity窗口时管理状态。第2章将介绍这些基本的思想,还将介绍如何设置Android开发环境。
1.5.3 Android基础组件
Android
UI框架以及Android的很多其他部分都依赖于一种名为Intent(意图)的新概念。Intent是调用Android组件的intra-及interprocess机制。
在Android中,组件是指一段具有确切生命周期的代码。显示Android应用窗口的活动就是一个组件。Android进程中服务其他客户端的服务是一个组件。唤醒事件响应的接收器也是Android的一个组件。
虽然Intent的主要作用是调用组件,但是它同时也可以服务于窗口化消息、操作、发布订阅模型和进程间通信等组件。下面就是一个使用Intent类调用或启动Web浏览器的例子:

在这个例子中,通过一个Intent,我们要求Android启动合适的窗口来显示一个网站的内容。根据设备上安装的浏览器列表,Android将选择合适的浏览器来显示该网站。第5章将更详细地介绍Intent。
Android还支持广泛的资源,包括我们熟悉的字符串和位图,以及一些不太熟悉的基于XML的View(布局类似于HTML)定义。该框架以新颖的方式使用资源,使资源使用变得简单、直观和方便。下面这个例子为在XML文件中定义的资源自动生成资源ID:


这个类中每个自动生成的ID都与XML文件中的一个元素或整个文件对应。在希望使用这些XML定义的地方,使用这些生成的ID来代替。当基于场所及器件尺寸等来详细说明资源时,这种间接性具有很大帮助。(第3章将更详细地介绍R.java文件和资源。)
Android中另一个新概念是ContentProvider(内容提供程序)。ContentProvider是对数据源的抽象,使它看起来像RESTful服务的发出者和使用者。底层SQLite数据库使这个ContentProvider成为了应用程序开发人员的强大工具。第4章将探讨ContentProvider。第3章~第5章将介绍Intent、资源和ContentProvider如何促进Android平台中的开放性。
1.5.4 **UI概念
XML网页布局定义(类似于HTML网页)在描述Android UI的过程中扮演着重要角色。让我们通过下面这个例子,看看Android
layout XML文件如何在包含文本视图的简单布局中发挥作用:

我们将使用为此XML文件生成的ID来将此布局加载到Activity窗口中。(第6章将进一步介绍此过程。)Android还提供了对菜单的广泛支持(第7章将详细介绍),从标准菜单到上下文菜单。在Android中使用菜单很方便,因为它们也是作为XML文件加载的,而且这些菜单的资源ID是自动生成的。下面这段代码展示了如何在XML文件中声明菜单:

尽管Android支持对话框,但Android中的所有对话框都是异步的。对于习惯于一些窗口框架中的同步模态对话框的开发人员,这些异步对话框带来了一种特殊的挑战。第7章将更全面地介绍菜单,第9章将详细介绍对话框。
Android提供了对动画的大量支持。实现动画的基本方式有3种。分别是创建逐帧动画、通过修改视图变换矩阵(位置、尺寸、旋转和透明度)而创建的补间动画或通过修改对象属性创建补间动画。Android3.0引入了基于属性的动画,这是实现动画的*灵活方式,也是人们**使用的方式,我们将在第21章详述这些动画。
此外,Android还允许在XML资源文件中定义这些动画。在下面这个示例中,逐帧动画中播放了一系列带有编号的图像:

Android还通过其OpenGL ES 1.0和2.0标准提供了对3D图形的支持。与OpenGL一样,OpenGL
ES是一个基于C的平面API。由于Android SDK是一种基于Java的编程API,所以它需要使用Java绑定来访问OpenGL
ES。Java ME已经通过JSR(Java Specification Request)239为OpenGL
ES定义了这一绑定,Android在其实现中为OpenGL
ES使用了相同的Java绑定。如果还不熟悉OpenGL编程,那么学习起来可能比较困难。受篇幅的限制,我们无法在本书这一版本中讲解OpenGL,但是在第3版中却有超过100页的讲解。
使用主页,Android实现了大量让信息流于指尖的新理念。**个理念是活动文件夹。使用活动文件夹,可以用文件夹的形式在主页上发布一个项目集合。这个集合中的内容会随着底层数据的更改而更改。不断变化的数据可以来自设备,也可以来自因特网。受篇幅的限制,我们无法在本书的这一版本中讲解活动文件夹。不过,本书第3版中对此有大量介绍。
第二个基于主页的理念是主屏幕部件。主屏幕部件用于使用UI部件在主页上绘制信息。此信息可以定期变化。电子邮件存储中的电子邮件数量就是这方面的一个例子。第25章将介绍主屏幕部件。主屏幕部件在3.0版中得到了改进,包含可在底层数据更改时更新的列表视图。这些改进将在第26章中介绍。
集成Android搜索是第三个基于主页的理念。使用集成搜索,既可以在设备上搜索内容,也可以在网络上搜索内容。Android搜索超越了传统搜索的概念,支持通过搜索控件不断发出命令。受限于篇幅,我们无法在本书这一版本中讲解搜索API。不过,本书第3版中有详细介绍。
Android还支持触摸屏以及基于手指在设备上移动的手势。Android支持将手指在屏幕上的随机移动记录为命名的手势。应用程序然后可以使用这一手势来执行特定操作。第27章将介绍触摸屏和手势。
传感器现在成为了移动体验的重要部分。第29章将介绍传感器。
移动设备所需的另一项必要创新是其配置的动态性。例如,很容易在纵向和横向之间更改手持设备的查看模式。或者可以为手持设备连接扩展坞以转变为平板电脑。Android
3.0引入了碎片这一概念来有效地处理这些变体。第8章将专门介绍碎片,第12章介绍如何处理配置的变化。
第10章还将介绍3.0版中的操作栏功能(在4.0中得到大幅改进)。操作栏将Android提升到了与桌面菜单栏模式类似的水平。
3.0版本为平板电脑引入了拖放操作。这个特性现在也移植到手机上。本书将在第28章介绍拖放操作。
手持设备能够完全感知基于云的环境。在执行服务器端HTTP调用时,一定要理解线程模型,否则会遇到应用未响应错误。这一点很重要。本书将在第18章介绍异步处理机制。
在Android
SDK外部,还有大量独立的创新,它们使应用程序开发既令人激动又非常简单。一些示例包括XML/VM、PhoneGap和Titanium。Titanium支持使用HTML技术来编写基于WebKit的Android浏览器。本书的第2版介绍了Titanium,但由于时间和篇幅的限制,这一版不再介绍Titanium。
1.5.5 Android Service组件
**性是Android平台的一个基本部分。在Android中,**性贯穿应用程序生命周期的所有阶段——从设计时策略考虑到运行时边界检查。第14章将详细介绍**性和权限。
第15章将介绍如何在Android中构建和使用Service,尤其是HTML
Service。这一章还将介绍进程间通信(同一设备上各应用程序之间的通信)。
基于位置的服务是Android
SDK中另一个更加激动人心的组件。SDK的这部分为应用程序开发人员提供了API来显示和操作地图,以及获取实时设备位置信息。第22章将详细介绍这些概念。
1.5.6 Android媒体和电话组件
Android拥有处理音频、视频和电话组件的API。第23章将介绍电话API。第24章将详细介绍音频和视频API。
从Android
2.0开始,Android就加入了Pico文字转语音引擎。由于篇幅所限,本书第4版去掉了文字转语音的内容。第3版包含有文字转语音API的内容。
*后但同样重要的是,Android通过创建一个XML文件来定义应用程序包,将所有这些概念融入到一个应用程序中。这个XML文件就是应用程序的描述文件(AndroidManifest.xml)。下面给出了一个示例:

Android描述文件可用于定义Activity,注册服务和ContentProvider,以及声明权限。我们在探索每种理念时将介绍关于描述文件的各种细节。
1.5.7 Android Java包
快速了解Android平台的一种方式是查看Java包的结构。因为Android源于标准的JDK发行版,所以了解受支持的内容和不受支持的内容非常重要。下面简单介绍一下Android
SDK中重要的包。
android.app:实现Android的应用程序模型。主要的类包括Application(表示开始和结束语义),以及众多与Activity相关的类、片段、控件、对话框、提醒和通知。本书将介绍这些类中的大部分。
android.app.admin:为企业管理者等人员提供设备控制功能。
android.accounts:包含管理各种账户的类,如谷歌及Facebook等。主要的类有AccountManager和Account。本书将在第30章介绍联系人API时对这个API进行简单介绍。
android.animation:包含所有新的特性动画类。第21章将对这些类进行详细介绍。
android.app.backup:包含可以在更换设备时使用的应用程序备份和数据恢复功能类。
android.appwidget:包含首页小部件功能类。第25章和第26章将对这个包进行详细介绍。注意,提到首页小部件时,也包括基于列表的小部件。
android.bluetooth:提供一些类来处理蓝牙功能。主要的类包括BluetoothAdapter、Bluetooth-
Device、BluetoothSocket、BluetoothServerSocket和BluetoothClass。可以使用Bluetooth-
Adapter控制在本地安装的蓝牙适配器。例如,可以启用它、禁用它和启动发现流程。BluetoothDevice表示所连接的远程蓝牙设备。两个蓝牙套接字用于在设备之间建立通信。Bluetooth类表示所连接的蓝牙设备的类型。
android.content:实现ContentProvider概念。ContentProvider将数据访问从数据存储中抽象出来。这个包还实现了一些围绕Intent和Android
URI(Uniform Resource Identifiers,统一资源标识符)的核心理念。本书第4版将讲解这些内容。
android.content.pm:���现与包管理器相关的类。包管理器知道各种权限、安装的包、安装的提供程序、安装的服务、安装的组件(比如Activity)和安装的应用程序。
android.content.res:用于访问结构化和非结构化资源文件。主要的类包括AssetManager(面向结构化资源)和Resources。该包中的一些类在本书第3版中有所介绍。
android.database:实现抽象数据库的理念。主要的接口是Cursor接口。该包中的一些类在本书第4版中有所介绍。
android.database.sqlite:实现android.database包中的概念,该包将SQLite用作物理数据库。主要的类包括SQLiteCursor、SQLiteDatabase、SQLiteQuery、SQLiteQueryBuilder和SQLiteStatement。但是,大部分交互操作将会与抽象android.database包中的类进行。
android.drm:与DRM相关的类。
android.gesture:此包包含处理用户定义的手势所需的所有类和接口。主要的类包括Gesture、GestureLibrary、GestureOverlayView、GestureStore、GestureStroke和GesturePoint。Gesture是GestureStrokes和GesturePoints的集合。手势都收集在GestureLibrary中。手势库存储在GestureStore中。手势都具有名称,这样可以将其标识为动作。该包中的一些类在第27章中有所介绍。
android.graphics:包含类Bitmap、Canvas、Camera、Color、Matrix、Movie、Paint、Path、Rasterizer、Shader、SweepGradient和TypeFace。
android.graphics.drawable:实现绘制协议和背景图像,支持可绘制对象动画。
android.graphics.drawable.shapes:实现各种形状,包括ArcShape、OvalShape、PathShape、RectShape和RoundRectShape。
android.hardware:实现与物理照相机相关的类。照相机指的是照相机硬件,而android.
graphics.Camera表示一种图形概念,与物理照相机完全无关。
android.hardware.usb:使你能够对Android的USB设备讲话。
android.location:包含类Address、GeoCoder、Location、LocationManager和LocationProvider。Address类表示简化的XAL(Extensible
Address
Language,可扩展地址语言)。GeoCoder可用于获取给定地址的纬度/经度坐标或给定纬度/经度坐标处的地址,反之亦然。Location表示纬度/经度。该包的一些类将在第22章中有所介绍。
android.media:包含类MediaPlayer、MediaRecorder、Ringtone、AudioManager和FaceDetector。MediaPlayer支持流媒体,用于播放音频和视频。MediaRecorder用于录制音频和视频。Ringtone类用于播放可用作铃声和提示音的短声音片段。AudioManager负责控制音量。可以使用FaceDetector在位图中检测人脸。该包中的一些类会在第24章中有所介绍。
android.media.audiofx:提供音频处理类。
android.media.effect:提供视频处理类。
android.mtp:提供照相机和音乐设备的交互类。
android.net:实现基本的套接字级网络API。主要的类包括Uri、ConnectivityManager、LocalSocket和LocalServerSocket。这里需要注意,Android在浏览器级和网络级提供了HTTPS支持。Android还支持在其浏览器中使用JavaScript。
android.net.rtp:支持流媒体协议。
android.net.sip:支持VOIP。
android.net.wifi:管理Wi-Fi连接。主要的类包括WifiManager和WifiConfiguration。WifiManager负责列出已配置的网络和目前处于活动状态的Wi-Fi网络。
android.net.wifi.p2p:通过Wi-Fi Direct支持P2P网络连接。
android.nfc:支持设备的近距离交互,实现无触控交易,如销售柜台的信用卡处理。
android.opengl:包含围绕OpenGL ES 1.0和2.0操作的实用程序类。主要的OpenGL ES类在来自JSR
239的一组不同的包中实现。这些包是javax.microedition.khronos.opengles、javax.microedition.khronos.egl和javax.microedition.khronos.nio。这些包都是围绕OpenGL
ES的Khronos实现的瘦包装器,是使用C和C++编写的。
android.os:表示可通过Java编程语言访问的操作系统服务。一些重要的类包括BatteryManager、Binder、FileObserver、Handler、Looper和PowerManager。Binder类支持进程间通信。FileObserver监视对文件的更改。Handler类用于运行与消息线程有关的任务,Looper用于运行消息线程。
android.preference:使应用程序能够让用户以统一的方式管理它们针对该应用程序的**项。主要的类包括PreferenceActivity、PreferenceScreen和各种由**项派生出来的类,比如CheckBoxPreference和SharedPreferences。该包中的一些类将在第13章和第25章有所介绍。
android.provider:包含一组附加到android.content.ContentProvider接口的预先构建的ContentProvider。ContentProvider包括Contacts、MediaStore、Browser和Settings。这一组接口和类存储底层数据结构的元数据。该Contracts
Provider包中的很多类都将在第30章介绍。
android.sax:包含一组**的SAX(Simple API for
XML,XML简单API)解析实用程序类。主要的类包括Element、RootElement和许多ElementListener接口。
android.speech*:提供从文本到语音转换的支持。主要的类是TextToSpeech。获取文本后,可以请求此类的一个实例对要转换为语音的文本进行排队。例如,可以使用大量回调来监控语音何时结束。Android使用来自SVOX的Pico
TTS(Text to Speech,文本到语音转换)引擎。
android.telephony:包含类CellLocation、PhoneNumberUtils和TelephonyManager。Telep-
honyManager可用于确定手机位置、电话号码、网络运营商名称、网络类型、电话类型和SIM(Subscriber Identity
Module,用户身份模块)序列号。该包中的一些类将在第23章中介绍。
android.telephony.gsm:可用于根据基站来收集手机位置,还包含负责处理SMS消息的类。这个包名为GSM,是因为全球移动通信系统是*初定义SMS数据消息标准的技术。
android.telephony.cdma:提供对CDMA电话的支持。
android.test、android.test.mock、android.test.suitebuilder:这些是为Android应用编写单元测试的包。
android.text:包含文本处理类。
android.text.method:提供为各种控件输入文本的类。
android.text.style:为各种文本提供多种样式设置机制。
android.utils:包含类Log、DebugUtils、TimeUtils和Xml。
android.view:包含类Menu、View、ViewGroup以及一系列监听器和回调。
android.view.animation:提供对补间动画的支持。主要的类包括Animation、一系列动画插值器,以及一组特定的动画绘制类,包括AlphaAnimation、ScaleAnimation、Translation
Animation和RotationAnimation。该包中的一些类将在第21章中讲解。
android.view.inputmethod:实现输入方法框架架构。
android.webkit:包含表示Web浏览器的类。主要的类包括WebView、CacheManager和CookieManager。
android.widget:包含通常派生自View类的所有UI控件。主要的部件包括Button、Checkbox、Chronometer、AnalogClock、DatePicker、DigitalClock、EditText、ListView、FrameLayout、GridView、ImageButton、MediaController、ProgressBar、RadioButton、RadioGroup、RatingButton、Scroller、ScrollView、Spinner、TabWidget、TextView、TimePicker、VideoView和ZoomButton。
com.google.android.maps:包含类MapView、MapController和MapActivity,它们在本质上是处理谷歌地图所需的类。
以上是一些重要的特定的Android包。从这个列表可以看到Android核心平台的深度。
说明 总体而言,Android Java API包含50多个包和1000多个类,并且每一版的数量在不断增加。
此外,Android还提供了java.*命名空间中的许多包。它们包括awt.font、beans、io、lang、lang.annotation、lang.ref、lang.reflect、math、net、nio、nio.channels、nio.channels.spi、nio.charset、security、security.acl、security.cert、security.interfaces、security.spec、sql、text、util、util.concurrent、util.concurrent.atomic、util.
concurrent.locks、util.jar、util.logging、util.prefs、util.regex和util.zip。
Android还包含javax命名空间中的以下包:crypto、crypto.spec、microedition.khronos.egl、microedition.khronos.opengles、net、net.ssl、security.auth、security.auth.callback、security.auth.
login、security.auth.x500、security.cert、sql、xml和xmlparsers。
除了这些以外,它还包含来自org.apache.http.*的许多包以及org.json、org.w3c.dom、org.xml.
sax、org.xml.sax.ext、org.xml.sax.helpers、org.xmlpull.v1和org.xmlpull.v1.sax2。总而言之,无数的包为针对手持设备编写应用程序提供了一个功能丰富的计算平台。
1.6 利用Android源代码
Android文档在许多地方比较欠缺。Android源代码可用于填补这些空白。
Android及其所有项目的源代码由Git源代码控制系统管理。Git(http://git.scm.com/)是一个开源的源代码控制系统,旨在迅速、方便地处理各种规模的项目。Linux内核和Ruby
on Rails项目也依赖于Git进行版本控制。
Android源代码分布明细介绍见http://source.android.com。2008年10月左右,源代码正式开源。开放手机联盟的目标之一是使Android成为完全定制的免费移动平台。
1.6.1 在线浏览Android源代码
在Android
4.0之前,Android源代码发布在http://android.git.kernel.org/上。Android现在托管在独立的Git网站https://android.googlesource.com上。然而,在本书编写时,源代码还不支持在线浏览。网上有传言说很快就会支持在线浏览。
另一个访问量比较大的Android源代码在线浏览网站是www.google.com/codesearch/p?hl=
en#uX1GffpyOZk/core/java/android/。
然而,有传言称代码搜索项目可能很快就会关闭。 即使不会关闭,这个网站也无法搜索到Android
4.0的代码。例如,在这里无法找到新的联系人API。
另一个有用的网站是www.grepcode.com/search/?query=google+android&entity=project。
这里似乎有一个Android 4.01分支。
希望这些网站继续发布*新代码,这样我们就能够在线浏览源代码。
1.6.2 使用Git下载Android源代码
除此之外,我们就不得不在计算机上安装Git,然后手动下载源代码。如果有Linux发行版本,可以按照http://source.android.com的文档说明下载*新源代码。
如果使用Windows操作系统,那么下载源代码的过程会是一个挑战。首先,必须要安装Git,然后使用它下载想要的Android源码包。
说明 关于使用Git下载Android的研究记要见http://androidbook.com/item/3919。
1. 安装Git
使用下面的URL在Windows上安装msysGit软件包:
http://code.google.com/p/msysgit/downloads/list。
在安装完成之后,文件系统上会出现一个目录:C:\git(假设安装在c:\中)。
2. 测试Git安装
其中关键的目录是C:\git\bin。使用下面的命令来复制一个公共库,可以测试Git是否安装成功:
git clone git://git.kernel.org/pub/scm/git/git.git。
这条命令可以将库复制到本地硬盘。
3. 下载Android源码库
运行以下命令,来看一下有多少个Android Git源码库:
git clone https://android.googlesource.com/platform/manifest.git。
这条命令会下载目录manifest,查找文件manifest\default.xml。
这个文件中记录了多个Android源码库名称。下面从该文件截取的内容:

这个关于Android4.0的文件的完整内容已经上传到http://androidbook.com/item/3920,我们已经贴出了文件目录,以供浏览一下。记住,这个文件没有更新到*新版本。
现在,执行下面的命令,就可以获得基础包android.jar的源代码:
git clone https://android.googlesource.com/platform/frameworks/base.git。
采用相同的逻辑,执行下面的命令,可以获得联系人组件的源码包:
git clone
https://android.googlesource.com/platform/packages/providers/ContactsProvider。
1.7 本书的示例项目
本书包含许多能够正常执行的示例项目。各章末尾都有一节“参考资料”,其中包含本章示例项目的下载地址。所有这些示例项目都可以从以下地址下载:
http://androidbook.com/proandroid4/projects。
如果在下载或编译项目时遇到问题,请通过电子邮件satya.komatineni@gmail.com或davemac327@
gmail.com与我们联系。
我们将持续更新本书的支持网站androidbook.com。如果能够帮助读者进一步学习Android,我们乐意为之。
1.8 小结
在本章中,我们希望激发你对Android的好奇。如果你是Java程序员,这正是从这个令人激动、功能强大的通用计算平台获益的**机会。请阅读本书剩余内容,来系统及深入地理解Android
SDK。
《精通Android》编辑推荐与评论:
Android移动开发制胜宝典,权威专家力作,续写辉煌,亚马逊书店移动开发畅销书