第1章 Android的構成基石—四大組件 1
1.1 Activity 1
1.1.1 Activity的構成 3
1.1.2 Activity的4種啓動模式 5
1.1.3 FragmentActivity與Fragment 7
1.2 Service與AIDL 8
1.2.1 普通Service 8
1.2.2 IntentService 9
1.2.3 運行在前颱的Service 10
1.2.4 AIDL(Android接口描述語言) 11
1.3 Broadcast(廣播) 17
1.3.1 普通廣播 17
1.3.2 有序廣播 18
1.3.3 本地廣播 19
1.3.4 sticky廣播 19
1.4 ContentProvider(外共享數據) 19
1.5 小結 26
第2章 創造齣豐富多彩的UI—
View與動畫 27
2.1 重要的View控件 27
2.1.1 ListView與GridView 27
2.1.2 數據展示更好的實現——
RecyclerView 32
2.1.3 讓頁麵顯示更流暢——ViewPager 33
2.2 必須掌握的最重要的技能—
自定義控件 35
2.2.1 最為自由的一種實現——自定義View 36
2.2.2 View的尺寸測量 38
2.2.3 Canvas與Paint(畫布與畫筆) 42
2.2.4 自定義ViewGroup 45
2.3 Scroller的使用 46
2.4 讓應用更精彩—動畫 56
2.4.1 幀動畫 57
2.4.2 補間動畫 58
2.4.3 屬性動畫 60
2.4.3.1 屬性動畫的核心類——
ValueAnimator 60
2.4.3.2 對任意屬性進行動畫操作——
Object Animator 61
2.4.3.3 實現豐富多彩的動畫效果——
AnimatorSet 62
2.4.3.4 動畫執行時間——TypeEvaluator與TimeInterpolator 63
2.5 小結 66
第3章 保證App流暢的關鍵因素—
多綫程 67
3.1 Android中的消息機製 67
3.1.1 處理消息的手段——Handler、Looper與MessageQueue 67
3.1.2 在子綫程中創建Handler為何
會拋齣異常 72
3.2 Android中的多綫程 73
3.2.1 多綫程的實現——Thread和Runnable 73
3.2.2 綫程的wait、sleep、join和
yield 74
3.2.3 與多綫程相關的方法——Callable、Future和FutureTask 78
3.2.4 構建服務器應用程序的有效
方法——綫程池 81
3.2.4.1 啓動指定數量的綫程——
ThreadPoolExecutor 82
3.2.4.2 定時執行一些任務——Scheduled ThreadPoolExecutor 85
3.2.4.3 綫程池的使用準則 86
3.2.5 同步集閤 87
3.2.5.1 程序中的優化策略——
CopyOnWriteArrayList 87
3.2.5.2 提高並發效率——
ConcurrentHashMap 88
3.2.5.3 有效的方法——
BlockingQueue 88
3.2.6 同步鎖 89
3.2.6.1 同步機製關鍵字——
synchronized 89
3.2.6.2 顯示鎖—— ReentrantLock與
Condition 90
3.2.6.3 信號量Semaphore 93
3.2.6.4 循環柵欄CyclicBarrier 94
3.2.6.5 閉鎖CountDownLatch 95
3.2.7 創建異步任務更簡單——
AysncTask的原理 97
3.2.7.1 AsyncTask的實現基本原理 97
3.2.7.2 實現一個簡單的AsyncTask 105
3.3 小結 108
第4章 HTTP網絡請求 109
4.1 HTTP網絡請求原理 109
4.1.1 HTTP的請求方式 110
4.1.1.1 GET請求 110
4.1.1.2 POST請求 110
4.1.1.3 PUT請求 111
4.1.1.4 DELETE請求 111
4.1.1.5 HEAD請求 112
4.1.1.6 TRACE請求 112
4.1.1.7 OPTIONS請求 113
4.1.2 HTTP報文格式解析 113
4.1.2.1 響應報文 116
4.1.2.2 常見的請求頭部 117
4.1.3 簡單模擬HTTP服務器 117
4.2 Android中執行網絡請求 126
4.2.1 全麵支持HTTP協議——
HttpClient 126
4.2.2 最佳選擇——HttpURLConnection 128
4.3 網絡框架的設計與實現 130
4.3.1 SimpleNet的基本架構 130
4.3.2 Request類 131
4.3.3 Response類 135
4.3.4 請求隊列 136
4.3.5 NetworkExecutor網絡執行器 137
4.3.6 執行網絡請求的接口——
HttpStack 139
4.3.7 將請求的迴調執行到UI綫程——
ResponseDelivery 142
4.3.8 手動實現文件上傳 144
4.3.8.1 自定義實現MultipartEntity 144
4.3.8.2 SimpleNet中實現文件上傳 149
4.4 小結 151
第5章 獨特高效的數據存儲—SQLite
數據庫 152
5.1 SQLite3的基本介紹 152
5.1.1 SQLite前端解析係統 153
5.1.2 SQLite後端引擎 154
5.2 SQLite中的SQL語句 154
5.2.1 創建數據庫 154
5.2.2 創建錶 154
5.2.3 插入數據 159
5.2.4 select語句 161
5.2.5 update語句 168
5.2.6 delete語句 169
5.2.7 修改錶 169
5.2.8 創建索引 170
5.2.9 創建視圖 171
5.2.10 創建觸發器 171
5.2.11 drop命令 172
5.3 Android中的數據庫開發 173
5.3.1 數據庫基本類型與接口 173
5.3.2 Android數據庫使用示例 177
5.3.3 數據庫升級 181
5.3.4 Android中數據庫的異步操作 181
5.4 數據庫框架ActiveAndroid的使用與
基本原理 184
5.4.1 使用ActiveAndroid 184
5.4.2 數據庫升級 188
5.4.3 基本原理 189
5.5 小結 196
第6章 讓程序更優秀的技術—性能
優化 197
6.1 布局優化 197
6.1.1 include布局 197
6.1.2 merge標簽 201
6.1.3 ViewStub視圖 204
6.1.4 減少視圖樹層級 209
6.2 內存優化 211
6.3 內存泄漏 216
6.3.1 使用 Memory Monitor 216
6.3.2 內存泄漏檢測利器——
LeakCanary 218
6.4 性能優化 222
6.4.1 過度繪製 222
6.4.2 Android 圖形渲染 223
6.4.3 數據采集和分析工具——
TraceView 227
6.5 小結 231
第7章 裝點程序“門麵”—代碼規範 232
7.1 代碼規範的第一個重點—排版 232
7.1.1 代碼縮進 232
7.1.2 長句分割 233
7.1.3 一句一行 233
7.1.4 大括號 233
7.1.5 空行分隔 234
7.1.6 空行分隔 234
7.1.7 數據與函數的排布 235
7.1.8 修飾詞順序 235
7.2 注釋 235
7.2.1 類注釋 236
7.2.2 注釋的位置 236
7.2.3 函數的注釋 237
7.2.4 異常的注釋 237
7.3 命名 238
7.3.1 包的命名 238
7.3.2 類與接口的命名 238
7.3.3 函數命名 238
7.3.4 setter和getter 238
7.3.5 字段名 239
7.3.6 字段名 239
7.4 編碼建議 239
7.4.1 beak語句 239
7.4.2 覆寫時添加@Override 239
7.4.3 指定集閤中的元素類型 240
7.4.4 顯示指明操作符優先級 240
7.5 小結 240
第8章 讓不斷升級的係統更好管理—
Git版本控製 241
8.1 Git起源 243
8.2 Git基本原理 243
8.2.1 直接記錄快照,而非差異
比較 243
8.2.2 近乎所有操作都是本地執行 244
8.2.3 時刻保持數據完整性 245
8.2.4 多數操作僅添加數據 245
8.2.5 文件的3種狀態 245
8.3 Git基本配置 246
8.4 Git基本命令 247
8.4.1 進行版本控製的第一步——
Git init 248
8.4.2 常用的版本控製命令——
Git status 248
8.4.3 添加到追蹤列錶中——Git add 248
8.4.4 提交——Git commit 249
8.4.5 查看項目曆史記錄——Git log 250
8.4.6 下載程序——Git clone 250
8.4.7 不同分支——Git branch 251
8.4.8 簽齣一個分支——Git checkout 251
8.4.9 閤並分支——Git merge 253
8.4.10 解決衝突 254
8.4.11 為版本打一個標簽——Git tag 255
8.4.12 幫助文檔——Git help 256
8.5 項目協作—GitHub 256
8.5.1 SSH key配置 257
8.5.2 項目托管——it remote 258
8.5.3 將項目推送到遠程倉庫——
Git push 259
8.5.4 更新最代碼——Git pull 260
8.5.5 Giti gnore忽略文件 261
8.5.6 Fork 加Pull request多人協作
模式 262
第9章 開發人員必備的技能—
單元測試 267
9.1 什麼是單元測試 267
9.2 為什麼要做單元測試 267
9.3 不寫單元測試的藉口 268
9.4 如何寫單元測試 269
9.4.1 第一個單元測試 269
9.4.2 Junit簡介 272
9.4.2.1 Junit執行流程 273
9.4.2.2 Junit的斷言和失敗提示 273
9.4.2.3 運行多個測試類——
TestSuite 274
9.5 測試哪些內容 275
9.5.1 邊界條件 275
9.5.2 覆蓋執行路徑 275
9.6 模擬所需的功能模塊—Mock
對象 278
9.6.1 手動Mock對象 278
9.6.2 使用Mockito庫 279
9.6.2.1 驗證某些行為 280
9.6.2.2 如何做一些測試樁(Stub) 280
9.6.2.3 參數匹配器 281
9.6.2.4 驗證函數的確切調用次數、
最少調用、從未調用 281
9.6.2.5 確保交互操作沒有執行
在Mock對象上 282
9.6.2.6 簡化Mock對象的創建 282
9.6.2.7 為連續的調用做測試
樁(stub) 283
9.6.2.8 為迴調做測試樁 283
9.6.2.9 doReturn()、doThrow()、
doAnswer()、doNothing()
和doCallRealMethod()係列
方法的運用 283
9.6.2.10 監控真實對象 284
9.6.2.11 為下一步的斷言捕獲參數 285
9.6.2.12 綜閤示例演練 285
9.7 Android中的單元測試 288
9.7.1 第一個單元測試 288
9.7.2 使用Instrumentation測試 290
9.7.2.1 需要Context的測試用例 290
9.7.2.2 測試Activity 290
9.7.2.3 測試Service 293
9.7.2.4 測試ContentProvider 295
9.8 測試驅動開發(TDD)簡介 298
9.9 小結 300
第10章 六大原則與設計模式 301
10.1 麵嚮對象六大原則 301
10.1.1 單一職責原則 301
10.1.2 裏氏替換原則 302
10.1.3 依賴倒置原則 304
10.1.4 開閉原則 304
10.1.5 接口隔離原則 306
10.1.6 迪米特原則 308
10.2 設計模式 309
10.3 避免掉進過度設計的怪圈 310
10.4 反模式 311
10.5 小結 311
第11章 使係統適應變化—重構 312
11.1 為什麼要重構 312
11.2 什麼時候重構 313
11.3 常用的重構手法 313
11.3.1 提取子函數 313
11.3.2 上移函數到父類 316
11.3.3 下移函數到子類 318
11.3.4 封裝固定的調用邏輯 320
11.3.5 使用泛型去除重復邏輯 320
11.3.6 使用對象避免過多的參數 322
11.3.7 重構的支柱——轉移函數 324
11.3.8 將類型碼的轉為狀態模式 326
11.3.9 什麼也不做的對象——NullObject
模式 329
11.3.10 使類保持“苗條身材”——分解“胖”類型 331
11.4 小結 334
第12章 從碼農曆練成工程師—
綜閤實戰 335
12.1 項目需求 335
12.2 第一版實現 336
12.3 第一版存在的問題與重構 352
12.3.1 類型重命名 352
12.3.2 去除重復代碼 353
12.3.3 簡化復雜的函數 356
12.3.4 明確職責與降低耦閤 358
12.4 降低復雜性—MVP架構 362
12.5 開啓單元測試之路—
添加單元測試 367
12.5.1 創建測試工程 367
12.5.2 測試網絡請求解析類 369
12.5.3 測試數據庫操作類 371
12.5.4 測試業務邏輯Presenter 374
12.5.5 模擬對象 375
12.5.6 更多測試 377
12.6 小結 378
· · · · · · (
收起)