第1章Android开发初体验 1
1.1 Android开发基础 2
1.2创建Android项目 2
1.3 Android Studio使用导航 6
1.4用户界面设计 6
1.4.1视图层级结构 10
1.4.2组件属性 10
1.4.3创建字符串资源 11
1.4.4预览布局 12
1.5从布局XML到视图对象 13
1.6组件的实际应用 16
1.6.1引用组件 17
1.6.2设置监听器 17
1.7创建提示消息 19
1.8使用模拟器运行应用 21
1.9深入学习:Android编译过程 23
1.10关于挑战练习 25
1.11挑战练习:定制toast消息 25
第2章Android与MVC设计模式 26
2.1创建新类 26
2.2 Android与MVC设计模式 29
2.3更新视图层 31
2.4更新控制器层 33
2.5在物理设备上运行应用 37
2.5.1连接设备 37
2.5.2配置设备用于应用开发 37
2.6添加图标资源 38
2.6.1向项目中添加资源 39
2.6.2在XML文件中引用资源 41
2.7挑战练习:为TextView添加监听器 42
2.8挑战练习:添加后退按钮 42
2.9挑战练习:从按钮到图标按钮 42
第3章activity的生命周期 45
3.1日志跟踪理解activity生命周期 46
3.1.1输出日志信息 46
3.1.2使用LogCat 48
3.1.3 activity生命周期实例解析 50
3.2设备旋转与activity生命周期 52
3.3保存数据以应对设备旋转 56
3.4再探activity生命周期 58
3.5深入学习:activity内存清理现状 59
3.6深入学习:日志记录的级别与方法 60
3.7挑战练习:禁止一题多答 61
3.8挑战练习:评分 61
第4章Android应用的调试 62
4.1异常与栈跟踪 63
4.1.1诊断应用异常 64
4.1.2 记录栈跟踪日志 65
4.1.3设置断点 66
4.1.4使用异常断点 68
4.2 Android特有的调试工具 70
4.2.1使用Android Lint 70
4.2.2 R类的问题 71
4.3挑战练习:探索布局检查器 72
4.4挑战练习:探索内存分配跟踪 72
第5章 第二个activity 74
5.1创建第二个activity 75
5.1.1创建新的activity 75
5.1.2创建新的activity子类 78
5.1.3在manifest配置文件中声明activity 78
5.1.4为QuizActivity添加CHEAT按钮 79
5.2启动activity 81
5.3 activity间的数据传递 83
5.3.1使用intent extra 83
5.3.2从子activity获取返回结果 86
5.4 activity的使用与管理 91
5.5挑战练习:堵住漏洞 93
第6章Android SDK版本与兼容 94
6.1 Android SDK版本 94
6.2 Android编程与兼容性问题 95
6.2.1比较合理的版本 95
6.2.2 SDK最低版本 96
6.2.3 SDK目标版本 97
6.2.4 SDK编译版本 97
6.2.5安全添加新版本API中的代码 97
6.3使用Android开发者文档 100
6.4挑战练习:报告编译版本 101
6.5挑战练习:限制作弊次数 102
第7章U I fragment与fragment管理器 103
7.1 UI设计的灵活性需求 104
7.2引入fragment 104
7.3着手开发CriminalIntent 105
7.3.1创建新项目 107
7.3.2两类fragment 108
7.3.3在Android Studio中增加依赖关系 108
7.3.4创建Crime类 111
7.4托管UI fragment 112
7.4.1 fragment的生命周期 112
7.4.2托管的两种方式 113
7.4.3定义容器视图 113
7.5创建UI fragment 115
7.5.1定义CrimeFragment的布局 115
7.5.2创建CrimeFragment类 117
7.6向FragmentManager添加UI fragment 122
7.6.1 fragment事务 123
7.6.2 FragmentManager与fragment生命周期 125
7.7采用fragment的应用架构 126
7.8深入学习:fragment与支持库 127
7.9深入学习:为什么优先使用支持库版fragment 128
第8章 使用RecyclerView显示列表 129
8.1升级CriminalIntent应用的模型层 130
8.2使用抽象activity托管fragment 132
8.2.1通用型fragment托管布局 133
8.2.2抽象activity类 133
8.3 RecyclerView、 ViewHolder和Adapter 137
8.3.1 ViewHolder和Adapter 138
8.3.2使用RecyclerView 141
8.3.3 列表项视图 142
8.3.4实现ViewHolder和Adapter 143
8.4绑定列表项 145
8.5响应点击 147
8.6深入学习:ListView和G ridView 148
8.7深入学习:单例 148
8.8挑战练习:RecyclerView ViewType 149
第9章 使用布局与组件创建用户界面 150
9.1使用图形布局工具 151
9.2引入ConstraintLayout 151
9.2.1使用ConstraintLayout 152
9.2.2约束编辑器 153
9.2.3腾出空间 155
9.2.4添加组件 157
9.2.5约束的XML形式 159
9.2.6编辑属性 160
9.2.7动态设置列表项 162
9.3深入学习布局属性 163
9.3.1 dp、 sp以及屏幕像素密度 163
9.3.2边距与内边距 165
9.3.3样式、主题及主题属性 166
9.3.4 Android应用的设计原则 166
9.4图形布局工具使用小结 167
9.5挑战练习:日期格式化 167
第10章 使用fragment argument 168
10.1从fragment中启动activity 168
10.1.1附加extra信息 169
10.1.2获取extra信息 170
10.1.3使用Crime数据更新CrimeFragment视图 171
10.1.4直接获取extra信息的缺点 172
10.2 fragment argument 172
10.2.1附加argument给fragment 173
10.2.2获取argument 174
10.3刷新显示列表项 174
10.4通过fragment获取返回结果 176
10.5深入学习:为何要用fragment argument 177
10.6挑战练习:实现高效的RecyclerView刷新 178
10.7挑战练习:优化CrimeLab的表现 178
第11章 使用ViewPager 179
11.1创建CrimePagerActivity 180
11.1.1 ViewPager与PagerAdapter 181
11.1.2整合并配置使用CrimePagerActivity 182
11.2 FragmentStatePagerAdapter与FragmentPagerAdapter 184
11.3深入学习:ViewPager的工作原理 186
11.4深入学习:以代码的方式创建视图 187
11.5挑战练习:恢复CrimeFragment的边距 187
11.6挑战练习:添加Jump to First按钮和Jump to Last按钮 188
第12章 对话框 189
12.1创建DialogFragment 190
12.1.1显示DialogFragment 192
12.1.2设置对话框的显示内容 194
12.2 fragment间的数据传递 196
12.2.1传递数据给DatePickerFragment 197
12.2.2返回数据给CrimeFragment 199
12.3挑战练习:更多对话框 205
12.4挑战练习:实现响应式DialogFragment 205
第13章 工具栏 207
13.1 AppCompat 207
13.2工具栏菜单 209
13.2.1在XML文件中定义菜单 210
13.2.2创建菜单 214
13.2.3响应菜单项选择 217
13.3实现层级式导航 218
13.4可选菜单项 219
13.4.1切换菜单项标题 220
13.4.2“还有个问题” 222
13.5深入学习:工具栏与操作栏 224
13.6挑战练习:删除crime记录 224
13.7挑战练习:复数字符串资源 224
13.8挑战练习:用于RecyclerView的空视图 225
第14章SQLite数据库 226
14.1定义schema 226
14.2创建初始数据库 227
14.2.1使用Android Device Monitor查看文件 230
14.2.2处理数据库相关问题 231
14.3修改CrimeLab类 232
14.4写入数据库 233
14.4.1使用ContentValues 233
14.4.2插入和更新记录 234
14.5读取数据库 235
14.5.1使用CursorWrapper 236
14.5.2创建模型层对象 238
14.6深入学习:数据库高级主题介绍 241
14.7深入学习:应用上下文 241
14.8挑战练习:删除crime记录 242
第15章 隐式intent 243
15.1添加按钮组件 244
15.2添加嫌疑人信息至模型层 244
15.3使用格式化字符串 246
15.4使用隐式intent 248
15.4.1隐式intent的组成 248
15.4.2发送消息 249
15.4.3获取联系人信息 252
15.4.4检查可响应任务的activity 254
15.5挑战练习:ShareCompat 256
15.6挑战练习:又一个隐式intent 256
第16章 使用intent拍照 258
16.1布置照片 258
16.2文件存储 260
16.2.1使用FileProvider 261
16.2.2指定照片存放位置 262
16.3使用相机intent 263
16.4缩放和显示位图 265
16.5功能声明 268
16.6挑战练习:优化照片显示 269
16.7挑战练习:优化缩略图加载 269
第17章 双版面主从用户界面 270
17.1增加布局灵活性 271
17.1.1修改SingleFragment-Activity 272
17.1.2创建包含两个fragment容器的布局 272
17.1.3使用别名资源 274
17.1.4创建平板设备专用可选资源 275
17.2 activity: fragment的托管者 276
17.3深入学习:设备屏幕尺寸的确定 284
17.4挑战练习:添加滑动删除功能 285
第18章 应用本地化 286
18.1资源本地化 286
18.1.1默认资源 289
18.1.2检查资源本地化完成情况 291
18.1.3区域修饰符 292
18.2配置修饰符 294
18.2.1可用资源优先级排定 295
18.2.2多重配置修饰符 296
18.2.3寻找最匹配的资源 297
18.3测试备选资源 298
18.4挑战练习:日期本地化 298
第19章Android辅助功能 299
19.1 TalkBack 299
19.1.1点击浏览 301
19.1.2线性浏览 301
19.2实现非文字型元素可读 303
19.2.1添加内容描述 303
19.2.2实现组件可聚焦 305
19.3提升辅助体验 305
19.4深入学习:使用辅助功能扫描器 309
19.5挑战练习:优化列表项 311
19.6挑战练习:补全上下文信息 311
19.7挑战练习:事件主动通知 311
第20章 数据绑定与M VV M 313
20.1为何要用MVVM架构 314
20.2创建BeatBox应用 314
20.3导入assets 319
20.4处理assets 321
20.5使用assets 323
20.6绑定数据 325
20.6.1创建视图模型 327
20.6.2绑定至视图模型 328
20.6.3绑定数据观察 330
20.7访问assets 332
20.8深入学习:数据绑定再探 333
20.8.1 lambda表达式 333
20.8.2更多语法糖 333
20.8.3 BindingAdapter 333
20.9深入学习:为何使用assets 334
20.10深入学习:什么是non-assets 334
第21章 音频播放与单元测试 335
21.1创建SoundPool 335
21.2加载音频文件 336
21.3播放音频 337
21.4添加测试依赖 338
21.5创建测试类 339
21.6实现测试类 341
21.7编写测试方法 342
21.8数据绑定回调 346
21.9释放音频 346
21.10设备旋转和对象保存 347
21.10.1保留fragment 348
21.10.2设备旋转和已保留的fragment 349
21.11深入学习:是否保留fragment 351
21.12深入学习:Espresso与整合测试 351
21.13深入学习:虚拟对象与测试 352
21.14挑战练习:播放进度控制 353
第22章 样式与主题 354
22.1颜色资源 354
22.2样式 355
22.3主题 357
22.4添加主题颜色 359
22.5覆盖主题属性 361
22.6修改按钮属性 364
22.7深入学习:样式继承拾遗 367
22.8深入学习:引用主题属性 367
第23章XML drawable 368
23.1统一按钮样式 368
23.2 shape drawable 369
23.3 state list drawable 371
23.4 layer list drawable 372
23.5深入学习:为什么要用XML drawable 373
23.6深入学习:使用mipmap图像 374
23.7深入学习:使用9-patch图像 375
23.8挑战练习:按钮主题 379
第24章 深入学习intent和任务 380
24.1创建NerdLauncher项目 380
24.2解析隐式intent 382
24.3在运行时创建显式intent 386
24.4任务与回退栈 388
24.4.1在任务间切换 389
24.4.2启动新任务 389
24.5使用NerdLauncher应用作为设备主屏幕 392
24.6挑战练习:应用图标 393
24.7深入学习:进程与任务 393
24.8深入学习:并发文档 395
第25章HTTP与后台任务 398
25.1创建PhotoGallery应用 399
25.2网络连接基本 401
25.3使用AsyncTask在后台线程上运行代码 403
25.4线程与主线程 405
25.5从Flickr获取JSON数据 407
25.6从AsyncTask回到主线程 413
25.7清理AsyncTask 416
25.8深入学习:AsyncTask再探 416
25.9深入学习:AsyncTask的替代方案 417
25.10挑战练习:Gson 418
25.11挑战练习:分页 418
25.12挑战练习:动态调整网格列 418
第26章Looper、 Handler和HandlerTh read 420
26.1配置RecyclerView以显示图片 420
26.2批量下载缩略图 422
26.3与主线程通信 423
26.4创建并启动后台线程 424
26.5 Message与message handler 426
26.5.1剖析Message 426
26.5.2剖析Handler 427
26.5.3使用handler 428
26.5.4传递handler 431
26.6深入学习:AsyncTask与线程 436
26.7深入学习:解决图片下载问题 436
26.8深入学习:StrictMode 437
26.9挑战练习:预加载以及缓存 438
第27章 搜索 439
27.1搜索Flickr网站 439
27.2使用Sea rchView 443
27.3使用shared preferences实现轻量级数据存储 447
27.4优化应用 451
27.5挑战练习:深度优化PhotoGalle应用 451
第28章 后台服务 452
28.1创建IntentService 452
28.2服务的作用 454
28.3查找最新返回结果 456
28.4使用AlarmManager延迟运行服务 458
28.4.1合理控制服务启动的频度 460
28.4.2 PendingIntent 461
28.4.3使用PendingIntent管理定时器 461
28.5控制定时器 462
28.6通知信息 464
28.7挑战练习:可穿戴设备上的通知 466
28.8深入学习:服务之细节 467
28.8.1服务的能与不能 467
28.8.2服务的生命周期 467
28.8.3 non-sticky服务 467
28.8.4 sticky服务 468
28.8.5绑定服务 468
28.9深入学习:JobScheduler和JobSe rvice 469
28.10挑战练习:在Lollipop设备上使用JobService 472
28.11深入学习:sync adapter 472
第29章broadcast intent 474
29.1普通intent和broadcast intent 474
29.2接收系统broadcast:重启后唤醒 475
29.2.1创建并登记standalone receiver 475
29.2.2使用receiver 477
29.3过滤前台通知消息 479
29.3.1发送broadcast intent 479
29.3.2创建并登记动态receiver 480
29.3.3使用私有权限限制broadcast 482
29.3.4使用有序broadcast收发数据 484
29.4 receiver与长时运行任务 488
29.5深入学习:本地事件 488
29.5.1使用EventBus 489
29.5.2使用RxJava 490
29.6深入学习:探测fragment的状态 490
第30章 网页浏览 492
30.1最后一段Flickr数据 492
30.2简单方式:隐式intent 494
30.3较难方式:使用WebView 496
30.4处理WebView的设备旋转问题 502
30.5深入学习:注入JavaScript对象 502
30.6深入学习:WebView升级 503
30.7挑战练习:使用后退键浏览历史网页 504
30.8挑战练习:非HTTP链接支持 504
第31章 定制视图与触摸事件 505
31.1创建DragAndDraw项目 505
31.2创建定制视图 507
31.3处理触摸事件 509
31.4 onDraw(…)方法内的图形绘制 513
31.5挑战练习:设备旋转问题 515
31.6挑战练习:旋转矩形框 515
第32章 属性动画 516
32.1建立场景 516
32.2简单属性动画 519
32.2.1视图属性转换 521
32.2.2使用不同的interpolator 523
32.2.3色彩渐变 523
32.3播放多个动画 525
32.4深入学习:其他动画API 527
32.4.1传统动画工具 527
32.4.2转场 527
32.5挑战练习 527
第33章 地理位置和Play服务 528
33.1地理位置和定位类库 528
33.2创建Locatr项目 529
33.3 Play服务定位和模拟器 530
33.4创建Locatr应用 532
33.5配置Google Play服务 534
33.6使用Google Play服务 536
33.7基于地理位置的Flickr搜索 538
33.8获取定位数据 539
33.9获取运行时权限 542
33.10寻找并显示图片 546
33.11挑战练习:权限使用理由 548
33.12挑战练习:进度指示器 549
第34章 使用地图 550
34.1导入Play地图服务库 550
34.2 Android上的地图服务 550
34.3获取Maps API key 550
34.4创建地图 552
34.5获取更多地理位置数据 553
34.6使用地图 556
34.7深入学习:团队开发和API key 560
第35章material design 562
35.1 material surface 562
35.1.1 elevation和Z值 564
35.1.2 state list animator 565
35.2动画工具 566
35.2.1 circular reveal 567
35.2.2 shared element transition 568
35.3新的视图组件 571
35.3.1 card 571
35.3.2 floating action button 572
35.3.3 snackbar 573
35.4深入学习material design 574
第36章 编后语 575
36.1终极挑战 575
36.2关于我们 575
36.3致谢 576