第1章 Android開發初體驗1
1.1 應用開發基礎1
1.2 創建Android項目2
1.3 Android Studio使用導航6
1.4 用戶界面設計7
1.4.1 視圖層級結構10
1.4.2 組件屬性11
1.4.3 創建字符串資源12
1.4.4 預覽界面布局12
1.5 從布局XML到視圖對像13
1.6 組件的實際應用17
1.6.1 引用組件18
1.6.2 設置監聽器18
1.7 創建提示消息20
1.8 使用模擬器運行應用23
1.9 深入學習:Android編譯過程25
第2章 Android與MVC設計模式29
2.1 創建新類29
2.2 Android與MVC設計模式32
2.3 更新視圖層34
2.4 更新控制層36
2.5 在設備上運行應用40
2.5.1 連接設備40
2.5.2 配置設備用於應用開發41
2.6 添加圖標資源42
2.6.1 向項目中添加資源43
2.6.2 在XML文件中引用資源45
2.7 關於挑戰練習46
2.8 挑戰練習:為TextView添加監聽器46
2.9 挑戰練習:添加後退按鈕46
2.10 挑戰練習:從按鈕到圖標按鈕47
第3章 Activity的生命周期49
3.1 日志跟蹤理解Activity生命周期50
3.1.1 輸出日志信息50
3.1.2 使用LogCat52
3.2 設備旋轉與Activity生命周期55
3.3 設備旋轉前保存數據59
3.4 再探Activity生命周期61
3.5 深入學習:測試onSaveInstance-State(Bundle)方法62
3.6 深入學習:日志記錄的級別與方法64
第4章 Android應用的調試65
4.1 異常與棧跟蹤66
4.1.1 診斷應用異常67
4.1.2 記錄棧跟蹤日志68
4.1.3 設置斷點69
4.1.4 使用異常斷點72
4.2 Android特有的調試工具73
4.2.1 使用Android Lint73
4.2.2 R類的問題75
第5章 第二個activity76
5.1 創建第二個activity77
5.1.1 創建新的activity78
5.1.2 創建新的activity子類81
5.1.3 在manifest配置文件中聲明activity81
5.1.4 為QuizActivity添加Cheat按鈕82
5.2 啟動activity84
5.3 activity間的數據傳遞86
5.3.1 使用intent extra86
5.3.2 從子activity獲取返回結果89
5.4 activity的使用與管理94
5.5 挑戰練習97
第6章 Android SDK版本與兼容98
6.1 Android SDK版本98
6.2 Android編程與兼容性問題99
6.2.1 比較合理的版本99
6.2.2 SDK版本101
6.2.3 SDK目標版本101
6.2.4 SDK編譯版本101
6.2.5 安全添加新版本API中的代碼101
6.3 使用Android開發者文檔104
6.4 挑戰練習:報告編譯版本106
第7章 UI fragment與fragment管理器107
7.1 UI設計的靈活性需求108
7.2 fragment的引入108
7.3 著手開發CriminalIntent109
7.3.1 創建新項目112
7.3.2 fragment與支持庫113
7.3.3 在Android Studio中增加依賴關繫114
7.3.4 創建Crime類117
7.4 托管UI fragment118
7.4.1 fragment的生命周期118
7.4.2 托管的兩種方式119
7.4.3 定義容器視圖119
7.5 創建UI fragment120
7.5.1 定義CrimeFragment的布局121
7.5.2 創建CrimeFragment類122
7.6 添加UI fragment到Fragment-Manager125
7.6.1 fragment事務126
7.6.2 FragmentManager與fragment生命周期129
7.7 采用fragment的應用架構130
7.8 深入學習:為什麼應優先使用支持庫版fragment131
7.9 深入學習:使用操作繫統內置版fragment131
第8章 使用布局與組件創建用戶界面132
8.1 升級Crime類132
8.2 更新布局133
8.3 生成並使用組件135
8.4 深入探討XML布局屬性136
8.4.1 樣式、主題及主題屬性136
8.4.2 dp、sp以及屏幕像素密度137
8.4.3 Android開發設計原則138
8.4.4 布局參數139
8.4.5 邊距與內邊距139
8.5 使用圖形布局工具140
8.5.1 創建水平模式布局141
8.5.2 添加新組件142
8.5.3 在屬性視圖中編輯組件屬性143
8.5.4 在框架視圖中重新組織組件144
8.5.5 更新子組件的布局參數145
8.5.6 android:layout_weight屬性的工作原理146
8.5.7 圖形布局工具使用總結147
8.5.8 組件ID與多種布局148
8.6 挑戰練習:日期格式化148
第9章 使用RecyclerView顯示列表149
9.1 升級CriminalIntent應用的模型層150
9.2 使用抽像activity托管fragment153
9.2.1 通用的fragment托管布局153
9.2.2 抽像activity類154
9.3 RecyclerView、Adapter和ViewHolder158
9.3.1 ViewHolder和Adapter159
9.3.2 使用RecyclerView161
9.3.3 實現Adapter和ViewHolder163
9.4 定制列表項166
9.4.1 創建列表項布局166
9.4.2 使用定制列表項視圖168
9.5 響應點擊170
9.6 深入學習:ListView和GridView171
9.7 深入學習:單例171
第10章 使用fragmentargument173
10.1 從fragment中啟動activity173
10.1.1 附加extra信息174
10.1.2 獲取extra信息175
10.1.3 使用Crime數據更新CrimeFragment視圖176
10.1.4 直接獲取extra信息的缺點177
10.2 fragment argument177
10.2.1 附加argument給fragment178
10.2.2 獲取argument179
10.3 刷新顯示列表項180
10.4 通過fragment獲取返回結果182
10.5 挑戰練習:實現高效的RecyclerView刷新183
10.6 深入學習:為何要用fragment argument183
第11章 使用ViewPager185
11.1 創建CrimePagerActivity186
11.1.1 ViewPager與PagerAdapter187
11.1.2 整合並配置使用CrimePagerActivity188
11.2 FragmentStatePagerAdapter與FragmentPagerAdapter190
11.3 深入學習:ViewPager的工作原理192
11.4 深入學習:以代碼的方式創建布局193
第12章 對話框194
12.1 使用AppCompat兼容庫195
12.2 創建DialogFragment196
12.2.1 顯示DialogFragment198
12.2.2 設置對話框的顯示內容199
12.3 fragment間的數據傳遞202
12.3.1 傳遞數據給DatePicker- Fragment203
12.3.2 返回數據給Crime-Fragment204
12.4 挑戰練習:更多對話框211
12.5 挑戰練習:按設備類型展現DialogFragment212
第13章 工具欄213
13.1 AppCompat213
13.2 工具欄菜單216
13.2.1 在XML文件中定義菜單217
13.2.2 創建菜單221
13.2.3 響應菜單項選擇223
13.3 實現層級式導航225
13.4 可選菜單項226
13.4.1 切換菜單項標題227
13.4.2 “還有個問題”229
13.5 深入學習:工具欄與操作欄231
13.6 挑戰練習:刪除crime記錄231
13.7 挑戰練習:優化字符串資源顯示231
13.8 挑戰練習:用於RecyclerView的空視圖232
第14章 SQLite數據庫233
14.1 定義Schema233
14.2 創建初始數據庫234
14.3 修改CrimeLab類238
14.4 寫入數據庫239
14.4.1 使用ContentValues239
14.4.2 插入和更新記錄240
14.5 讀取數據庫242
14.5.1 使用CursorWrapper243
14.5.2 創建模型層對像244
14.6 深入學習:數據庫高級主題介紹247
14.7 深入學習:應用上下文248
14.8 挑戰練習:刪除Crime記錄248
第15章 隱式intent249
15.1 添加按鈕組件250
15.2 添加嫌疑人信息至模型層252
15.3 使用格式化字符串254
15.4 使用隱式intent255
15.4.1 隱式intent的組成255
15.4.2 發送消息256
15.4.3 獲取聯繫人信息259
15.4.4 檢查可響應任務的activity263
15.5 挑戰練習:ShareCompat265
15.6 挑戰練習:又一個隱式intent265
第16章 使用intent拍照266
16.1 布置照片266
16.2 外部存儲269
16.3 使用相機intent272
16.3.1 外部存儲使用權限272
16.3.2 觸發拍照273
16.4 縮放和顯示位圖274
16.5 功能聲明277
16.6 深入學習:使用include標簽278
16.7 挑戰練習:優化照片顯示278
16.8 挑戰練習:優化縮略圖加載279
第17章 Master-Detail用戶界面280
17.1 增加布局靈活性281
17.1.1 修改SingleFragment- Activity282
17.1.2 創建包含兩個fragment容器的布局283
17.1.3 使用別名資源284
17.1.4 創建平板設備專用可選資源285
17.2 Activity:fragment的托管者286
17.3 深入學習:設備屏幕尺寸的確定295
第18章 Assets297
18.1 為何使用assets297
18.2 創建BeatBox應用298
18.3 導入assets301
18.4 處理assets303
18.5 使用Assets305
18.6 訪問Assets308
18.7 深入學習:什麼是non-assets308
第19章 使用SoundPool播放音頻309
19.1 創建SoundPool309
19.2 加載音頻文件310
19.3 播放音頻311
19.4 釋放音頻313
19.5 設備旋轉和對像保存314
19.5.1 保留fragment315
19.5.2 旋轉和已保留fragment316
19.6 深入學習:是否要保留318
19.7 深入學習:設備旋轉處理再探318
第20章 樣式與主題321
20.1 顏色資源321
20.2 樣式322
20.3 主題324
20.4 添加主題顏色327
20.5 覆蓋主題屬性328
20.6 修改按鈕屬性332
20.7 深入學習:樣式繼承拾遺334
20.8 深入學習:引用主題屬性335
20.9 挑戰練習:創建多版本主題335
第21章 XML drawable336
21.1 統一按鈕樣式337
21.2 shape drawable338
21.3 state list drawable340
21.4 layer list drawable341
21.5 深入學習:為什麼要用XML drawable342
21.6 深入學習:使用9-patch圖像343
21.7 深入學習:使用Mipmap圖像347
第22章 深入學習intent和任務348
22.1 創建NerdLauncher項目348
22.2 解析隱式intent351
22.3 在運行時創建顯式intent355
22.4 任務與後退棧357
22.4.1 在任務間切換357
22.4.2 啟動新任務358
22.5 使用NerdLauncher應用作為設備主屏幕361
22.6 挑戰練習:應用圖標362
22.7 深入學習:進程與任務362
22.8 深入學習:並發文檔364
第23章 HTTP與後臺任務367
23.1 創建PhotoGallery應用368
23.2 網絡連接基本371
23.3 使用AsyncTask在後臺線程上運行代碼373
23.4 線程與主線程374
23.5 從Flickr獲取JSON數據376
23.6 從AsyncTask回到主線程383
23.7 清理AsyncTask386
23.8 深入學習:AsyncTask再探387
23.9 深入學習:AsyncTask的替代方案388
23.10 挑戰練習:Gson388
23.11 挑戰練習:分頁388
23.12 挑戰練習:動態調整網格列389
第24章 Looper、Handler和HandlerThread390
24.1 配置RecyclerView以顯示圖片390
24.2 批量下載縮略圖393
24.3 與主線程通信393
24.4 創建並啟動後臺線程394
24.5 Message與message handler396
24.5.1 消息的剖析397
24.5.2 Handler的剖析397
24.5.3 使用handler398
24.5.4 傳遞handler402
24.6 深入學習:AsyncTask與線程407
24.7 挑戰練習:預加載以及緩存407
24.8 深入學習:解決圖片下載問題408
第25章 搜索409
25.1 搜索Flickr網站410
25.2 使用SearchView414
25.3 使用shared preferences實現輕量級數據存儲419
25.4 優化應用422
25.5 挑戰練習:深度優化PhotoGallery應用423
第26章 後臺服務424
26.1 創建IntentService424
26.2 服務的作用427
26.3 查找返回結果428
26.4 使用AlarmManager延遲運行服務430
26.4.1 合理控制服務啟動的頻度432
26.4.2 PendingIntent433
26.4.3 使用PendingIntent管理定時器434
26.5 控制定時器434
26.6 通知信息437
26.7 挑戰練習:可穿戴設備上的通知439
26.8 深入學習:服務細節內容440
26.8.1 服務的能與不能440
26.8.2 服務的生命周期440
26.8.3 non-sticky服務440
26.8.4 sticky服務441
26.8.5 綁定服務441
26.9 深入學習:JobScheduler和JobService442
26.10 深入學習:Sync Adapter445
26.11 挑戰練習:在Lollipop設備上使用JobService446
第27章 broadcast intent447
27.1 一般intent和broadcast intent447
27.2 接收繫統broadcast:重啟後喚醒448
27.2.1 standalone receiver448
27.2.2 使用receiver450
27.3 過濾前臺通知消息452
27.3.1 發送broadcast intent452
27.3.2 動態broadcast receiver453
27.3.3 使用私有權限455
27.3.4 使用有序broadcast458
27.4 receiver與長時運行任務462
27.5 深入學習:本地事件462
27.5.1 使用EventBus463
27.5.2 使用Rxjava463
27.6 深入學習:檢測fragment的狀態464
第28章 網頁瀏覽466
28.1 後一段Flickr數據466
28.2 簡單方式:隱式intent469
28.3 較難方式:使用WebView470
28.4 處理WebView的設備旋轉問題476
28.5 深入學習:注入JavaScript對像477
28.6 深入學習:KitKat的WebView478
28.7 挑戰練習:使用後退鍵瀏覽歷史網頁478
28.8 挑戰練習:非HTTP鏈接支持479
第29章 定制視圖與觸摸事件480
29.1 創建DragAndDraw項目480
29.1.1 創建DragAndDraw-Activity481
29.1.2 創建DragAndDraw-Fragment481
29.2 創建定制視圖482
29.3 處理觸摸事件484
29.4 onDraw(...)方法內的圖形繪制488
29.5 挑戰練習:設備旋轉問題490
29.6 挑戰練習:旋轉矩形框490
第30章 屬性動畫492
30.1 建立場景492
30.2 簡單屬性動畫495
30.2.1 視圖屬性轉換498
30.2.2 使用不同的interpolator500
30.2.3 色彩漸變500
30.3 播放多個動畫502
30.4 深入學習:其他動畫API504
30.4.1 傳統動畫工具504
30.4.2 轉場504
30.5 挑戰練習504
第31章 地理位置和Play服務505
31.1 地理位置和定位類庫505
31.2 創建Locatr項目506
31.3 Play服務和模擬器507
31.4 創建Locatr應用510
31.5 配置Google Play服務512
31.6 使用Google Play服務514
31.7 基於地理位置的Flickr搜索516
31.8 獲取定位數據517
31.9 尋找並顯示圖片519
31.10 挑戰練習:進度指示器521
第32章 使用地圖522
32.1 導入Play地圖服務庫522
32.2 Android上的地圖服務522
32.3 地圖API設置523
32.4 創建地圖525
32.5 獲取更多地理位置數據526
32.6 使用地圖529
32.7 深入學習:團隊開發和API key534
第33章 material design536
33.1 material surface536
33.1.1 elevation和Z值538
33.1.2 state list animator539
33.2 動畫工具540
33.2.1 circular reveal541
33.2.2 shared element transition542
33.3 新的視圖組件545
33.3.1 card545
33.3.2 floating action button547
33.3.3 snackbar548
33.4 深入學習material design549
第34章 編後語550
34.1 終極挑戰550
34.2 關於我們551
34.3 致謝551