第 1章 開始啟程——你的第 一行
Android代碼 1
1.1 了解全貌,Android王國簡介 2
1.1.1 Android系統(tǒng)架構(gòu) 2
1.1.2 Android已發(fā)布的版本 3
1.1.3 Android應(yīng)用開發(fā)特色 4
1.2 手把手帶你搭建開發(fā)環(huán)境 5
1.2.1 準(zhǔn)備所需要的工具 5
1.2.2 搭建開發(fā)環(huán)境 5
1.3 創(chuàng)建你的第 一個(gè)Android項(xiàng)目 9
1.3.1 創(chuàng)建HelloWorld項(xiàng)目 9
1.3.2 啟動(dòng)模擬器 11
1.3.3 運(yùn)行HelloWorld 14
1.3.4 分析你的第 一個(gè)Android程序 15
1.3.5 詳解項(xiàng)目中的資源 20
1.3.6 詳解build.gradle文件 22
1.4 前行必備:掌握日志工具的使用 25
1.4.1 使用Android的日志工具Log 25
1.4.2 為什么使用Log而不使用println() 26
1.5 小結(jié)與點(diǎn)評 28
第 2章 探究新語言,快速入門Kotlin
編程 30
2.1 Kotlin語言簡介 31
2.2 如何運(yùn)行Kotlin代碼 32
2.3 編程之本:變量和函數(shù) 35
2.3.1 變量 35
2.3.2 函數(shù) 37
2.4 程序的邏輯控制 41
2.4.1 if條件語句 41
2.4.2 when條件語句 42
2.4.3 循環(huán)語句 45
2.5 面向?qū)ο缶幊獭?8
2.5.1 類與對象 49
2.5.2 繼承與構(gòu)造函數(shù) 50
2.5.3 接口 55
2.5.4 數(shù)據(jù)類與單例類 58
2.6 Lambda編程 61
2.6.1 集合的創(chuàng)建與遍歷 61
2.6.2 集合的函數(shù)式API 65
2.6.3 Java函數(shù)式API的使用 69
2.7 空指針檢查 71
2.7.1 可空類型系統(tǒng) 72
2.7.2 判空輔助工具 73
2.8 Kotlin中的小魔術(shù) 77
2.8.1 字符串內(nèi)嵌表達(dá)式 77
2.8.2 函數(shù)的參數(shù)默認(rèn)值 78
2.9 小結(jié)與點(diǎn)評 81
第3章 先從看得到的入手,探究
Activity 82
3.1 Activity是什么 82
3.2 Activity的基本用法 82
3.2.1 手動(dòng)創(chuàng)建Activity 83
3.2.2 創(chuàng)建和加載布局 85
3.2.3 在AndroidManifest文件中
注冊 88
3.2.4 在Activity中使用Toast 90
3.2.5 在Activity中使用Menu 92
3.2.6 銷毀一個(gè)Activity 96
3.3 使用Intent在Activity之間穿梭 96
3.3.1 使用顯式Intent 96
3.3.2 使用隱式Intent 99
3.3.3 更多隱式Intent的用法 101
3.3.4 向下一個(gè)Activity傳遞數(shù)據(jù) 105
3.3.5 返回?cái)?shù)據(jù)給上一個(gè)Activity 106
3.4 Activity的生命周期 108
3.4.1 返回棧 108
3.4.2 Activity狀態(tài) 109
3.4.3 Activity的生存期 110
3.4.4 體驗(yàn)Activity的生命周期 111
3.4.5 Activity被回收了怎么辦 117
3.5 Activity的啟動(dòng)模式 118
3.5.1 standard 119
3.5.2 singleTop 120
3.5.3 singleTask 122
3.5.4 singleInstance 123
3.6 Activity的最佳實(shí)踐 126
3.6.1 知曉當(dāng)前是在哪一個(gè)Activity 126
3.6.2 隨時(shí)隨地退出程序 127
3.6.3 啟動(dòng)Activity的最佳寫法 129
3.7 Kotlin課堂:標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法 130
3.7.1 標(biāo)準(zhǔn)函數(shù)with、run和apply 130
3.7.2 定義靜態(tài)方法 133
3.8 小結(jié)與點(diǎn)評 137
第4章 軟件也要拼臉蛋,UI開發(fā)的
點(diǎn)點(diǎn)滴滴 138
4.1 該如何編寫程序界面 138
4.2 常用控件的使用方法 139
4.2.1 TextView 139
4.2.2 Button 142
4.2.3 EditText 144
4.2.4 ImageView 149
4.2.5 ProgressBar 151
4.2.6 AlertDialog 154
4.3 詳解3種基本布局 156
4.3.1 LinearLayout 156
4.3.2 RelativeLayout 163
4.3.3 FrameLayout 166
4.4 系統(tǒng)控件不夠用?創(chuàng)建自定義控件 169
4.4.1 引入布局 169
4.4.2 創(chuàng)建自定義控件 172
4.5 最常用和最難用的控件:ListView 174
4.5.1 ListView的簡單用法 174
4.5.2 定制ListView的界面 176
4.5.3 提升ListView的運(yùn)行效率 179
4.5.4 ListView的點(diǎn)擊事件 180
4.6 更強(qiáng)大的滾動(dòng)控件:RecyclerView 182
4.6.1 RecyclerView的基本用法 183
4.6.2 實(shí)現(xiàn)橫向滾動(dòng)和瀑布流布局 186
4.6.3 RecyclerView的點(diǎn)擊事件 191
4.7 編寫界面的最佳實(shí)踐 193
4.7.1 制作9-Patch圖片 193
4.7.2 編寫精美的聊天界面 196
4.8 Kotlin課堂:延遲初始化和密封類 201
4.8.1 對變量延遲初始化 201
4.8.2 使用密封類優(yōu)化代碼 204
4.9 小結(jié)與點(diǎn)評 206
第5章 手機(jī)平板要兼顧,探究
Fragment 207
5.1 Fragment是什么 207
5.2 Fragment的使用方式 209
5.2.1 Fragment的簡單用法 210
5.2.2 動(dòng)態(tài)添加Fragment 212
5.2.3 在Fragment中實(shí)現(xiàn)返回棧 215
5.2.4 Fragment和Activity之間的
交互 216
5.3 Fragment的生命周期 217
5.3.1 Fragment的狀態(tài)和回調(diào) 217
5.3.2 體驗(yàn)Fragment的生命周期 219
5.4 動(dòng)態(tài)加載布局的技巧 221
5.4.1 使用限定符 221
5.4.2 使用最小寬度限定符 224
5.5 Fragment的最佳實(shí)踐:一個(gè)簡易
版的新聞應(yīng)用 225
5.6 Kotlin課堂:擴(kuò)展函數(shù)和運(yùn)算符
重載 234
5.6.1 大有用途的擴(kuò)展函數(shù) 234
5.6.2 有趣的運(yùn)算符重載 236
5.7 小結(jié)與點(diǎn)評 240
第6章 全局大喇叭,詳解廣播機(jī)制 242
6.1 廣播機(jī)制簡介 242
6.2 接收系統(tǒng)廣播 243
6.2.1 動(dòng)態(tài)注冊監(jiān)聽時(shí)間變化 243
6.2.2 靜態(tài)注冊實(shí)現(xiàn)開機(jī)啟動(dòng) 245
6.3 發(fā)送自定義廣播 249
6.3.1 發(fā)送標(biāo)準(zhǔn)廣播 249
6.3.2 發(fā)送有序廣播 252
6.4 廣播的最佳實(shí)踐:實(shí)現(xiàn)強(qiáng)制下線功能 255
6.5 Kotlin課堂:高階函數(shù)詳解 261
6.5.1 定義高階函數(shù) 261
6.5.2 內(nèi)聯(lián)函數(shù)的作用 265
6.5.3 noinline與crossinline 268
6.6 Git時(shí)間:初識版本控制工具 271
6.6.1 安裝Git 271
6.6.2 創(chuàng)建代碼倉庫 272
6.6.3 提交本地代碼 274
6.7 小結(jié)與點(diǎn)評 274
第7章 數(shù)據(jù)存儲全方案,詳解
持久化技術(shù) 275
7.1 持久化技術(shù)簡介 275
7.2 文件存儲 276
7.2.1 將數(shù)據(jù)存儲到文件中 276
7.2.2 從文件中讀取數(shù)據(jù) 279
7.3 SharedPreferences存儲 281
7.3.1 將數(shù)據(jù)存儲到SharedPre-
ferences中 282
7.3.2 從SharedPreferences中讀取
數(shù)據(jù) 284
7.3.3 實(shí)現(xiàn)記住密碼功能 285
7.4 SQLite數(shù)據(jù)庫存儲 288
7.4.1 創(chuàng)建數(shù)據(jù)庫 289
7.4.2 升級數(shù)據(jù)庫 295
7.4.3 添加數(shù)據(jù) 297
7.4.4 更新數(shù)據(jù) 300
7.4.5 刪除數(shù)據(jù) 302
7.4.6 查詢數(shù)據(jù) 304
7.4.7 使用SQL操作數(shù)據(jù)庫 307
7.5 SQLite數(shù)據(jù)庫的最佳實(shí)踐 307
7.5.1 使用事務(wù) 308
7.5.2 升級數(shù)據(jù)庫的最佳寫法 309
7.6 Kotlin課堂:高階函數(shù)的應(yīng)用 312
7.6.1 簡化SharedPreferences的用法 312
7.6.2 簡化ContentValues的用法 314
7.7 小結(jié)與點(diǎn)評 317
第8章 跨程序共享數(shù)據(jù),探究ContentProvider 318
8.1 ContentProvider簡介 318
8.2 運(yùn)行時(shí)權(quán)限 319
8.2.1 Android權(quán)限機(jī)制詳解 319
8.2.2 在程序運(yùn)行時(shí)申請權(quán)限 322
8.3 訪問其他程序中的數(shù)據(jù) 326
8.3.1 ContentResolver的基本用法 326
8.3.2 讀取系統(tǒng)聯(lián)系人 329
8.4 創(chuàng)建自己的ContentProvider 332
8.4.1 創(chuàng)建ContentProvider的步驟 332
8.4.2 實(shí)現(xiàn)跨程序數(shù)據(jù)共享 336
8.5 Kotlin課堂:泛型和委托 345
8.5.1 泛型的基本用法 345
8.5.2 類委托和委托屬性 347
8.5.3 實(shí)現(xiàn)一個(gè)自己的lazy函數(shù) 350
8.6 小結(jié)與點(diǎn)評 352
第9章 豐富你的程序,運(yùn)用手機(jī)
多媒體 353
9.1 將程序運(yùn)行到手機(jī)上 353
9.2 使用通知 355
9.2.1 創(chuàng)建通知渠道 355
9.2.2 通知的基本用法 357
9.2.3 通知的進(jìn)階技巧 362
9.3 調(diào)用攝像頭和相冊 367
9.3.1 調(diào)用攝像頭拍照 367
9.3.2 從相冊中選擇圖片 371
9.4 播放多媒體文件 374
9.4.1 播放音頻 374
9.4.2 播放視頻 377
9.5 Kotlin課堂:使用infix函數(shù)構(gòu)建
更可讀的語法 381
9.6 Git時(shí)間:版本控制工具進(jìn)階 383
9.6.1 忽略文件 384
9.6.2 查看修改內(nèi)容 385
9.6.3 撤銷未提交的修改 387
9.6.4 查看提交記錄 388
9.7 小結(jié)與點(diǎn)評 389
第 10章 后臺默默的勞動(dòng)者,探究
Service 390
10.1 Service是什么 390
10.2 Android多線程編程 391
10.2.1 線程的基本用法 391
10.2.2 在子線程中更新UI 392
10.2.3 解析異步消息處理機(jī)制 395
10.2.4 使用AsyncTask 396
10.3 Service的基本用法 399
10.3.1 定義一個(gè)Service 399
10.3.2 啟動(dòng)和停止Service 401
10.3.3 Activity和Service進(jìn)行
通信 404
10.4 Service的生命周期 408
10.5 Service的更多技巧 408
10.5.1 使用前臺Service 409
10.5.2 使用IntentService 411
10.6 Kotlin課堂:泛型的高級特性 415
10.6.1 對泛型進(jìn)行實(shí)化 415
10.6.2 泛型實(shí)化的應(yīng)用 417
10.6.3 泛型的協(xié)變 418
10.6.3 泛型的逆變 422
10.7 小結(jié)與點(diǎn)評 425
第 11章 看看精彩的世界,使用網(wǎng)絡(luò)
技術(shù) 427
11.1 WebView的用法 427
11.2 使用HTTP訪問網(wǎng)絡(luò) 429
11.2.1 使用HttpURLConnection 430
11.2.2 使用OkHttp 433
11.3 解析XML格式數(shù)據(jù) 436
11.3.1 Pull解析方式 438
11.3.2 SAX解析方式 441
11.4 解析JSON格式數(shù)據(jù) 444
11.4.1 使用JSONObject 445
11.4.2 使用GSON 446
11.5 網(wǎng)絡(luò)請求回調(diào)的實(shí)現(xiàn)方式 448
11.6 最好用的網(wǎng)絡(luò)庫:Retrofit 451
11.6.1 Retrofit的基本用法 452
11.6.2 處理復(fù)雜的接口地址類型 456
11.6.3 Retrofit構(gòu)建器的最佳寫法 459
11.7 Kotlin課堂:使用協(xié)程編寫高效的
并發(fā)程序 461
11.7.1 協(xié)程的基本用法 461
11.7.2 更多的作用域構(gòu)建器 467
11.7.3 使用協(xié)程簡化回調(diào)的寫法 471
11.8 小結(jié)與點(diǎn)評 474
第 12章 最佳的UI體驗(yàn),Material
Design實(shí)戰(zhàn) 475
12.1 什么是Material Design 475
12.2 Toolbar 476
12.3 滑動(dòng)菜單 483
12.3.1 DrawerLayout 483
12.3.2 NavigationView 486
12.4 懸浮按鈕和可交互提示 491
12.4.1 FloatingActionButton 491
12.4.2 Snackbar 494
12.4.3 CoordinatorLayout 496
12.5 卡片式布局 498
12.5.1 MaterialCardView 498
12.5.2 AppBarLayout 504
12.6 下拉刷新 507
12.7 可折疊式標(biāo)題欄 510
12.7.1 CollapsingToolbarLayout 510
12.7.2 充分利用系統(tǒng)狀態(tài)欄空間 519
12.8 Kotlin課堂:編寫好用的工具方法 522
12.8.1 求N個(gè)數(shù)的最大最小值 522
12.8.2 簡化Toast的用法 524
12.8.3 簡化Snackbar的用法 526
12.9 Git時(shí)間:版本控制工具的高級
用法 528
12.9.1 分支的用法 528
12.9.2 與遠(yuǎn)程版本庫協(xié)作 530
12.10 小結(jié)與點(diǎn)評 532
第 13章 高級程序開發(fā)組件,探究
Jetpack 533
13.1 Jetpack簡介 533
13.2 ViewModel 534
13.2.1 ViewModel的基本用法 536
13.2.2 向ViewModel傳遞參數(shù) 539
13.3 Lifecycles 541
13.4 LiveData 545
13.4.1 LiveData的基本用法 545
13.4.2 map和switchMap 549
13.5 Room 554
13.5.1 使用Room進(jìn)行増刪改查 555
13.5.2 Room的數(shù)據(jù)庫升級 562
13.6 WorkManager 565
13.6.1 WorkManager的基本用法 566
13.6.2 使用WorkManager處理
復(fù)雜的任務(wù) 568
13.7 Kotlin課堂:使用DSL構(gòu)建專有的
語法結(jié)構(gòu) 571
13.8 小結(jié)與點(diǎn)評 577
第 14章 繼續(xù)進(jìn)階,你還應(yīng)該掌握的
高級技巧 579
14.1 全局獲取Context的技巧 579
14.2 使用Intent傳遞對象 582
14.2.1 Serializable方式 582
14.2.2 Parcelable方式 583
14.3 定制自己的日志工具 584
14.4 調(diào)試Android程序 586
14.5 深色主題 589
14.6 Kotlin課堂:Java與Kotlin代碼
之間的轉(zhuǎn)換 596
14.7 總結(jié) 600
第 15章 進(jìn)入實(shí)戰(zhàn),開發(fā)一個(gè)天氣
預(yù)報(bào)App 601
15.1 功能需求及技術(shù)可行性分析 601
15.2 Git時(shí)間:將代碼托管到GitHub上 605
15.3 搭建MVVM項(xiàng)目架構(gòu) 612
15.4 搜索全球城市數(shù)據(jù) 615
15.4.1 實(shí)現(xiàn)邏輯層代碼 615
15.4.2 實(shí)現(xiàn)UI層代碼 620
15.5 顯示天氣信息 626
15.5.1 實(shí)現(xiàn)邏輯層代碼 626
15.5.2 實(shí)現(xiàn)UI層代碼 631
15.5.3 記錄選中的城市 645
15.6 手動(dòng)刷新天氣和切換城市 647
15.6.1 手動(dòng)刷新天氣 648
15.6.2 切換城市 650
15.7 制作App的圖標(biāo) 654
15.8 生成正式簽名的APK文件 659
15.8.1 使用Android Studio生成 660
15.8.2 使用Gradle生成 663
15.9 你還可以做的事情 666
第 16章 編寫并發(fā)布一個(gè)開源庫,PermissionX 669
16.1 開發(fā)前的準(zhǔn)備工作 669
16.2 實(shí)現(xiàn)PermissionX開源庫 673
16.3 對開源庫進(jìn)行測試 678
16.4 將開源庫發(fā)布到j(luò)center倉庫 681
16.5 體驗(yàn)我們的成果 688
16.6 結(jié)束語 691