第1章 Android简介 1
1.1一些背景信息 2
1.1.1不远的过去 2
1.1.2未来的前景 2
1.2对Android的误解 3
1.3 Android:开放的移动开发平台 3
1.4原生Android应用程序 4
1.5 Android SDK的特征 5
1.5.1访问硬件(包括摄像头、GPS和传感器) 5
1.5.2使用wi-Fi、蓝牙技术和NFC进行数据传输 6
1.5.3地图、地理编码和基于位置的服务 6
1.5.4后台服务 6
1.5.5使用SQLite数据库进行数据存储和检索 7
1.5.6共享数据和应用程序间通信 7
1.5.7使用Widget和Live Wallpaper增强主屏幕 7
1.5.8广泛的媒体支持和2D/3D图形 7
1.5.9 Cloud to Device Messaging 8
1.5.10优化的内存和进程管理 8
1.6开放手机联盟简介 8
1.7运行Android的环境 9
1.8从事移动开发的原因 9
1.9从事Android开发的原因 9
1.9.1推动Android普及的因素 10
1.9.2 Android的独到之处 10
1.9.3改变移动开发格局 11
1.10开发框架简介 11
1.10.1开发包中的资源 12
1.10.2理解Android软件栈 12
1.10.3 Dalvik虚拟机 14
1.10.4 Android应用程序架构 14
1.10.5 Android库 15
第2章 开始入手 17
2.1 Android开发 18
2.1.1开始前的准备工作 18
2.1.2创建第一个Android应用程序 24
2.1.3 Android应用程序的类型 31
2.2面向移动设备和嵌入式设备的开发 32
2.2.1硬件限制带来的设计考虑事项 32
2.2.2考虑用户环境 35
2.2.3 Android开发 36
2.3 Android开发工具 40
2.3.1 Android虚拟设备管理器 41
2.3.2 Android SDK管理器 42
2.3.3 Android模拟器 42
2.3.4 Dalvik调试监控服务(DDMS) 42
2.3.5 Android调试(ADB) 43
2.3.6 Hierarchy Viewer和Lint工具 43
2.3.7 Monkey和Monkey Runner 43
第3章 创建应用程序和Activity 45
3.1 Android应用程序的组成部分 46
3.2应用程序Manifest文件简介 47
3.3使用Manifest编辑器 54
3.4分离资源 55
3.4.1创建资源 55
3.4.2使用资源 63
3.4.3为不同的语言和硬件创建资源 66
3.4.4运行时配置更改 68
3.5 Android应用程序生命周期 70
3.6理解应用程序的优先级和进程状态 70
3.7 Android Application类简介 72
3.7.1扩展和使用Application类 72
3.7.2重写应用程序的生命周期事件 73
3.8深入探讨AndroidActivity 74
3.8.1创建Activity 74
3.8.2 Activity的生存期 76
3.8.3 Android Activity类 81
第4章 创建用户界面 83
4.1 Android UI基本设计 84
4.2 Android UI的基础知识 84
4.3布局简介 85
4.3.1定义布局 86
4.3.2使用布局创建设备无关的UI 87
4.3.3优化布局 90
4.4 To-Do List示例 93
4.5 Fragment介绍 100
4.5.1创建新的Fragment 101
4.5.2 Fragment的生命周期 101
4.5.3 Fragment Manager介绍 105
4.5.4向Activity中添加Fragment 105
4.5.5 Fragment和Activity之间的接口 110
4.5.6没有用户界面的Fragment 111
4.5.7 Android Fragment类 112
4.5.8对To-Do List示例使用 Fragment 112
4.6 Android widget工具箱 116
4.7创建新视图 117
4.7.1修改现有的视图 118
4.7.2创建复合控件 122
4.7.3使用布局创建简单的复合控件 124
4.7.4创建定制的视图 124
4.7.5使用定制的控件 137
4.8 Adapter简介 137
4.8.1部分原生Adapter简介 138
4.8.2定制ArrayAdapter 138
4.8.3使用Adapter绑定数据到视图 139
第5章 Intent和Broadcast Receiver 145
5.1 Intent简介 145
5.1.1使用Intent来启动Activity 146
5.1.2 Linkify简介 153
5.1.3使用Intent广播事件 155
5.1.4 Local Broadcast Manager 159
5.1.5 Pending Intent简介 160
5.2创建Intent Filter和Broadcast Receiver 161
5.2.1使用Intent Filter为隐式Intent提供服务 161
5.2.2使用Intent Filter作为插件和扩展 170
5.2.3监听本地Broadcast Intent 173
5.2.4使用Broadcast Intent监控设备的状态变化 174
5.2.5在运行时管理Manifest Receiver 176
第6章 使用Intemet资源 177
6.1下载和分析Internet资源 177
6.1.1连接Internet资源 178
6.1.2使用XML Pull Parser分析 XML 179
6.1.3创建一个地震查看器 180
6.2使用Download Manager 186
6.2.1下载文件 186
6.2.2自定义Download Manager Notification 187
6.2.3指定下载位置 188
6.2.4取消和删除下载 189
6.2.5查询Download Manager 189
6.3使用Internet服务 192
6.4连接到Google App Engine 192
6.5下载数据而不会耗尽电量的最佳实践 194
第7章 文件、保存状态和首选项 195
7.1保存简单的应用程序数据 195
7.2创建并保存Shared Preference 196
7.3检索Shared Preference 197
7.4为地震查看器创建一个设置Activity 197
7.5首选项框架和Preference Activity概述 205
7.5.1在XML中定义一个 Preference Screen布局 206
7.5.2 Preference Fragment简介 208
7.5.3使用Preference Header定义 Preference Fragment的层次结构 208
7.5.4 Preference Activity简介 209
7.5.5向后兼容性与Preference Screen 210
7.5.6找到并使用Preference Screen 设置的Shared Preference 210
7.5.7 Shared Preference Change Listener简介 211
7.6为地震查看器创建一个标准的 Preference Activity 211
7.7持久化应用程序实例的状态 215
7.7.1使用Shared Preference保存 Activity 状态 215
7.7.2使用生命周期处理程序保存和 还原Activity实例 215
7.7.3使用生命周期处理程序保存和还原Fragment实例状态 216
7.8将静态文件作为资源添加 218
7.9在文件系统下工作 218
7.9.1文件管理工具 218
7.9.2使用特定于应用程序的文件夹存储文件 219
7.9.3创建私有的应用程序文件 219
7.9.4使用应用程序文件缓存 220
7.9.5存储公共可读的文件 220
第8章 数据库和Content Provider 223
8.1 Android数据库简介 223
8.1.1 SQLite数据库简介 224
8.1.2 Content Provider简介 224
8.2 SQLite简介 224
8.3 Content Value和Cursor 225
8.4使用SQLite数据库 225
8.4.1 SQLiteOpenHelper简介 226
8.4.2在不使用SQLiteOpenHelper的情况下打开和创建数据库 228
8.4.3 Android数据库设计注意事项 228
8.4.4查询数据库 228
8.4.5从Cursor中提取值 229
8.4.6添加、更新和删除行 230
8.5创建Content Provider 232
8.5.1注册Content Provider 233
8.5.2发布Content Provider的URI地址 233
8.5.3创建Content Provide的数据库 234
8.5.4实现Content Provider查询 235
8.5.5 Content Provider事务 236
8.5.6在Content Provider中存储文件 239
8.5.7一个Content Provider的实现框架 240
8.6 使用Content Provider 244
8.6.1 Content Resolver简介 244
8.6.2查询Content Provider 244
8.6.3使用Cursor Loader异步查询内容 247
8.6.4添加、删除和更新内容 249
8.6.5访问Content Provider中存储的文件 251
8.6.6创建一个To-Do List数据库和 Content Provider 253
8.7将搜索功能添加到应用程序中 260
8.7.1使Content Provider可搜索 261
8.7.2为应用程序创建一个搜索 Activity 261
8.7.3将搜索Activity设置为应用程序的默认搜索Provider 263
8.7.4使用搜索视图微件 266
8.7.5由Content Provider支持搜索建议 267
8.7.6在快速搜索框中显示搜索结果 270
8.8创建可搜索的地震Content Provider 270
8.8.1创建Content Provider 270
8.8.2使用地震Content Provider 276
8.8.3搜索EarthquakeContent Provider 279
8.9本地Android Content Provider 285
8.9.1使用Media StoreContent Provider 285
8.9.2使用Contacts Contract Content Provider 286
8.9.3使用Calendar Content Provider 293
第9章 在后台操作 297
9.1 Service简介 298
9.1.1创建和控制Service 298
9.1.2将Service绑定到Activity 302
9.1.3地震监控Service示例 304
9.1.4创建前台Service 308
9.2使用后台线程 309
9.2.1使用Async Task 运行异步任务 310
9.2.2 Intent Service简介 312
9.2.3 Loader简介 313
9.2.4手动创建线程和GUI线程同步 313
9.3使用Alarm 315
9.3.1创建、设置和取消Alarm 316
9.3.2设置重复Alarm 317
9.3.3使用重复Alarm调度网络刷新 318
9.4使用Intent Service简化Earthquake更新Service 320
第10章 扩展用户体验 323
10.1操作栏简介 324
10.1.1自定义操作栏 325
10.1.2自定义操作栏来控制应用程序的导航行为 328
10.1.3操作栏操作简介 333
10.2向地震监控程序添加一个操作栏 333
10.3创建并使用菜单和操作栏操作项 339
10.3.1 Android菜单系统简介 340
10.3.2创建菜单 341
10.3.3指定操作栏的操作 342
10.3.4菜单项选项 343
10.3.5添加操作View和操作提供程序 344
10.3.6在Fragment中添加菜单项 345
10.3.7使用XML定义菜单层次结构 345
10.3.8动态更新菜单项 347
10.3.9处理菜单选择 347
10.3.10子菜单和上下文菜单简介 348
10.4更新地震监控程序 351
10.5全屏显示 353
10.6对话框简介 355
10.6.1创建一个对话框 356
10.6.2使用AlertDialog类 356
10.6.3使用专门的输入对话框 357
10.6.4通过Dialog Fragment管理和显示对话框 358
10.6.5通过Activity事件处理程序管理和显示对话框 360
10.6.6将Activity用作对话框 361
10.7创建Toast 361
10.7.1自定义Toast 362
10.7.2在工作线程中使用Toast 364
10.8 Notification简介 365
10.8.1 Notification Manager简介 366
10.8.2创建Notification 366
10.8.3设置和自定义通知托盘UI 369
10.8.4配置持续和连续的 Notification 373
10.8.5触发、更新和取消 Notification 374
10.9向地震监控程序中添加 Notification和对话框 376
第11章 高级用户体验 381
11.1为每个屏幕尺寸和分辨率做设计 382
11.1.1分辨率无关 382
11.1.2为不同的屏幕大小提供支持和优化 383
11.1.3创建可缩放的图形资源 386
11.1.4创建优化的、自适应的、动态的设计 390
11.1.5反复测试 390
11.2确保可访问性 391
11.2.1为非触屏设备提供导航 391
11.2.2为每个View提供文本描述 391
11.3 Android Text-to-Speech简介 392
11.4使用语音识别 394
11.4.1使用语音识别进行语音输入 395
11.4.2使用语音识别进行搜索 396
11.5控制设备振动 396
11.6使用动画 397
11.6.1补间View动画 397
11.6.2创建和使用逐帧动画 400
11.6.3插值属性动画 400
11.7强化View 404
11.7.1高级Canvas绘图 404
11.7.2硬件加速 419
11.7.3 Surface View简介 420
11.7.4创建交互式控件 423
11.8 高级Drawable资源 428
11.9复制、粘贴和剪贴板 431
11.9.1向剪贴板中复制数据 431
11.9.2粘贴剪贴板数据 431
第12章 硬件传感器 433
12.1使用传感器和传感器管理器 433
12.1.1受支持的Android传感器 434
12.1.2虚拟传感器简介 435
12.1.3查找传感器 435
12.1.4监视传感器 436
12.1.5解释传感器值 438
12.2监视设备的移动和方向 439
12.2.1确定设备的自然方向 440
12.2.2加速计简介 441
12.2.3检测加速度变化 442
12.2.4创建一个重力计 443
12.2.5确定设备方向 446
12.2.6创建一个指南针和人工地平仪 450
12.2.7陀螺仪传感器简介 453
12.3环境传感器简介 454
12.3.1使用气压计传感器 454
12.3.2创建气象站 455
第13章 地图、地理编码和基于位置的服务 461
13.1使用基于位置的服务 461
13.2在模拟器中使用基于位置的服务 462
13.2.1更新模拟器位置提供器中的位置 463
13.2.2配置模拟器来测试基于位置的服务 463
13.3选择一个位置提供器 464
13.3.1查找位置提供器 464
13.3.2通过指定条件查找位置提供器 464
13.3.3确定位置提供器的能力 465
13.4确定当前位置 466
13.4.1位置的隐私性 466
13.4.2找出上一次确定的位置 466
13.4.3 Where Am I示例 466
13.4.4刷新当前位置 469
13.4.5在Where Am I中跟踪位置 472
13.4.6请求单独一次位置更新 473
13.5位置更新的最佳实践 474
13.6使用近距离提醒 477
13.7使用地理编码器 478
13.7.1反向地理编码 479
13.7.2前向地理编码 480
13.7.3对“Where Am I”示例进行地理编码 481
13.8创建基于地图的Activity 482
13.8.1 Map View和MapActivity简介 482
13.8.2获得地图的API key 483
13.8.3创建一个基于地图的 Activity 483
13.8.4地图和Fragment 485
13.8.5配置和使用Map View 486
13.8.6使用MapController 486
13.8.7对“Wheer Am I”示例使用地图 487
13.8.8创建和使用覆盖(Overlay) 490
13.8.9 MyLocationOverlay简介 497
13.8.10 ItemizedOverlay和 OverlayItemn简介 498
13.8.11将视图固定到地图和地图的某个位置上 500
13.9对Earthquake示例添加地图功能 501
第14章 个性化主屏幕 507
14.1主屏幕Widget简介 507
14.2创建App Widgets 509
14.2.1创建Widget的XML布局资源 509
14.2.2定义Widget设置 511
14.2.3创建Widget Broadcast Receiver 并将其添加到应用程序的 manifest文件中 512
14.2.4 App WidgetManager和 Remote View简介 513
14.2.5刷新 Widget 518
14.2.6创建并使用 Widget配置 Activity 521
14.3创建地震Widget 522
14.4 Collection View Widget简介 528
14.4.1创建Collection View Widget的布局 529
14.4.2创建Remote ViewsService 530
14.4.3创建一个 RemoteViews-Factory 531
14.4.4使用Remote Views Service 填充Collection View Widget 533
14.4.5向Collection View Widget中的项添加交互性 534
14.4.6将Collection View Widget 绑定到Content Provider 535
14.4.7刷新Collection View Widget 537
14.4.8创建Earthquake Collection View Widget 537
14.5 Live Folder简介 543
14.5.1创建Live Folder 544
14.5.2创建 Earthquake Live Folder 548
14.6使用快速搜索框显示应用程序搜索结果 551
14.6.1在快速搜索框中显示搜索结果 551
14.6.2将Earthquake示例的搜索结果添加到快速搜索框中 552
14.7创建Live Wallpaper 553
14.7.1创建Live Wallpaper定义资源 553
14.7.2创建Wallpaper Service 554
14.7.3创建Wallpaper Service引擎 555
第15章 音频、视频以及摄像头的使用 557
15.1播放音频和视频 558
15.1.1 Media Player简介 559
15.1.2准备音频播放 559
15.1.3准备视频播放 560
15.1.4控制Media Player的播放 564
15.1.5管理媒体播放输出 566
15.1.6响应音量控制 566
15.1.7响应Media播放控件 567
15.1.8请求和管理音频焦点 569
15.1.9当音频输出改变时暂停播放 571
15.1.10 Remote Control Client简介 572
15.2操作原始音频 574
15.2.1使用AudioRecord录制声音 574
15.2.2使用AudioTrack播放音频 575
15.3创建一个Sound Pool 577
15.4使用音效 578
15.5使用摄像头拍摄照片 579
15.5.1使用Intent拍摄照片 579
15.5.2直接控制摄像头 581
15.5.3读取并写入JPEG EXIF图像详细信息 588
15.6录制视频 589
15.6.1使用Intent录制视频 589
15.6.2使用MediaRecorder录制视频 590
15.7使用媒体效果 593
15.8向媒体库中添加新媒体 594
15.8.1使用媒体扫描仪插入媒体 594
15.8.2手动插入媒体 595
第16章 蓝牙、NFC、网络和Wi-Fi 597
16.1使用蓝牙 597
16.1.1管理本地蓝牙设备适配器 598
16.1.2可发现性和远程设备发现 600
16.1.3蓝牙通信 604
16.2管理网络和Internet连接 609
16.2.1 Connectivity Manager简介 609
16.2.2支持用户首选项以进行后台数据传输 609
16.2.3查找和监视网络连接 611
16.3管理Wi-Fi 612
16.3.1监视Wi-Fi连接 613
16.3.2监视活动的Wi-Fi连接的详细信息 613
16.3.3扫描热点 613
16.3.4管理Wi-Fi配置 614
16.3.5创建Wi-Fi网络配置 615
16.4使用Wi-Fi Direct传输数据 615
16.4.1初始化Wi-Fi Direct框架 615
16.4.2启用Wi-Fi Direct并监视其状态 617
16.4.3发现对等设备 618
16.4.4连接对等设备 618
16.4.5在对等设备之间传输数据 620
16.5近场通信 621
16.5.1读取NFC标签 622
16.5.2使用前台分派系统 623
16.5.3 Android Beam简介 625
第17章 电话服务和SMS 629
17.1电话服务的硬件支持 629
17.1.1将电话功能指定为必需的硬件功能 629
17.1.2检查电话硬件 630
17.2使用电话服务 630
17.2.1启动电话呼叫 630
17.2.2替换本机拨号程序 631
17.2.3访问电话服务的属性及状态 632
17.2.4使用PhoneStateListener监视电话状态的变化 635
17.2.5使用Intent Receiver监视传入的电话呼叫 639
17.3 SMS和MMS简介 640
17.3.1在应用程序中使用SMS和 MMS 640
17.3.2使用Intent从应用程序中发送SMS和MMS 640
17.3.3使用SMS Manager发送 SMS消息 641
17.3.4监听传入的SMS消息 644
17.3.5紧急响应程序SMS示例 646
17.3.6自动紧急响应程序 654
17.4 SIP和VOIP简介 662
第18章 Android高级开发 663
18.1 Android的安全性 664
18.1.1 Linux内核安全 664
18.1.2权限简介 664
18.2 Cloud to Device Messaging简介 666
18.2.1 C2DM的局限性 667
18.2.2注册使用C2DM 667
18.2.3在C2DM服务器上注册设备 667
18.2.4向设备发送C2DM消息 670
18.2.5接收C2DM消息 672
18.3使用License Verification Library实现版权保护 673
18.3.1安装License Verification Library 673
18.3.2获得License Verification 公钥 673
18.3.3配置License Validation Policy 674
18.3.4执行许可验证检查 674
18.4应用程序内收费 675
18.4.1应用程序内收费的局限性 676
18.4.2安装IAB库 676
18.4.3获得公钥和定义可购买的物品 676
18.4.4开始IAB交易 677
18.4.5处理IAB购买请求的响应 678
18.5使用Wake Lock 679
18.6使用AIDL支持Service的 IPC 680
18.7处理不同硬件和软件的可用性 686
18.7.1指定硬件的要求 686
18.7.2确认硬件可用性 687
18.7.3构建向后兼容的应用程序 687
18.8利用STRICT模式优化UI性能 689
第19章 推广和发布应用程序并从中获利 691
19.1签名和发布应用程序 691
19.2发布应用程序 693
19.2.1 Google Play简介 693
19.2.2开始使用Google Play 694
19.2.3发布应用程序 695
19.2.4开发者控制台上的应用程序报告 697
19.2.5查看应用程序错误报告 697
19.3如何通过应用程序赚钱 698
19.4应用程序销售、推广和分发的策略 699
19.4.1应用程序的起步策略 699
19.4.2在Google Play上推广 700
19.4.3国际化 700
19.5分析数据和跟踪推荐人 701
19.5.1使用移动应用程序的Google Analytics 702
19.5.2使用Google Analytics追踪推荐 703