産品特色
編輯推薦
本書從基礎、架構、安全、性能優化、新技術、測試等角度,通過簡單的代碼示例詳盡地展示瞭 Android 開發技巧
本書作者技術基礎深厚紮實,是新技術的探索和追逐者,他對於技術發自內心地熱愛, 是業界非常優秀的 Android 架構師
本書是作者在一綫互聯網企業工作多年的經驗沉澱,從不同角度對 Android 新技術拋磚引玉,由淺入深,將實戰中的案例抽象成原型,通俗易懂
本書對於技術的解讀樸實風趣,深入淺齣,是 Android 工程師的進階寶典,騰訊、華為、阿裏、百度、平安科技等一綫移動開發工程師聯袂推薦
內容簡介
《Android高級進階》是Android的進階學習指南,主要為Android初中級開發者進階所需的知識,高級開發者也可以從本書中發現很多共鳴點。《Android高級進階》從8個方麵對50個知識點進行分類講解,包括基礎篇、係統架構篇、經驗總結篇、新技術篇、性能優化篇、移動安全篇、工具篇、測試篇。熟練掌握這些知識點後,應該就能夠應付實際項目開發中的絕大部分問題瞭。
《Android高級進階》的主要目的在於給讀者一個完整的Android中高級開發者知識圖譜。筆者希望通過《Android高級進階》的係統講解,能夠幫助讀者在麵試和工作中收獲自己滿意的成績。
作者簡介
顧浩鑫,網絡 ID:ASCE1885,平安金融科技移動研發工程師,目前主要從事 Android & React Native 相關研發工作,畢業於華中科技大學圖像識彆與人工智能研究所,曾先後就職於華為、百度、平安科技。
精彩書評
與本書作者在兩傢公司都是同事,也有多個Android項目閤作的經曆,作者基礎非常紮實,經常探索並應用Android新技術、新框架,是業界非常優秀的Android架構師。本書是作者在一綫互聯網企業工作多年的經驗沉澱,從不同角度對Android新技術拋磚引玉,將實戰中的案例抽象成原型,全書內容通俗易懂,特彆推薦給有誌在移動端發展的工程師朋友們。
騰訊移動互聯網事業部 何朝陽
書中涵蓋瞭Android開發生命周期的各個方麵,尤其注重高質量的開發實踐。作者從基礎、架構、安全、性能優化、新技術、測試等角度,通過簡單的代碼示例詳盡地展示瞭Android開發技巧。作者對代碼的優雅以及對卓越性能的完美追求,足以保證本書成為Android研發工程師不可或缺的參考書。
騰訊移動互聯網事業部 揭宗昌
與筆者共事一年多,深刻體會到筆者紮實沉穩的氣質,以及探索創新的銳氣。長期從事一綫軟件開發工作使得筆者對“工欲善其事,必先利其器”有著深刻的理解,本書從Android開發涉及的各個方麵,各個階段闡述筆者的經驗沉澱,也係統地介紹各類開源工具和開發利器,適閤各層次的讀者閱讀。
華多網絡娛樂部 歐陽紹聰
本書作者技術基礎深厚、紮實,是新技術的探索和追逐者,與他共事期間,我深刻感受到他對於技術發自內心的熱愛,他的Android應用開發技術達到爐火純青的地步,在APP開發和優化上有豐富的實戰經驗,同時他還是開源社區的活躍分子和貢獻者。作者經曆瞭移動互聯網的熱潮,見證瞭 APP應用開發技術的萌芽、發展和成熟。現在移動互聯網的開發者也逐步開始關注插件化技術、性能優化、行業新技術,係統架構等進階技術。本書的上市彌補瞭Android進階技術係統化解讀的空缺,作者對於技術的解讀樸實風趣,深入淺齣,內容都是在大型互聯網公司工作與探索積纍下來的精華,是Android工程師的進階寶典和麵試寶典,推薦給廣大從事移動開發的朋友們。
阿裏移動事業部 顧大輝
目錄
第1篇 基礎篇
第1章 Android觸摸事件傳遞機製
1.1 觸摸事件的類型
1.2 事件傳遞的三個階段
1.3 View的事件傳遞機製
1.4 ViewGroup的事件傳遞機製
第2章 Android View的繪製流程
2.1 繪製的整體流程
2.2 MeasureSpec
2.3 Measure
2.4 Layout
2.5 Draw
第3章 Android 動畫機製
3.1 逐幀動畫(Frame Animation)
3.1.1 XML 資源文件方式
3.1.2 代碼方式
3.2 補間動畫(Tween Animation)
3.2.1 插值器 Interpolator
3.2.2 AlphaAnimation
3.2.3 ScaleAnimation
3.2.4 TranslateAnimation
3.2.5 RotateAnimation
3.2.6 自定義補間動畫
3.3 屬性動畫(Property Animation)
3.3.1 Evaluator
3.3.2 AnimatorSet
3.3.3 ValueAnimator
3.3.4 ObjectAnimator
3.4 過渡動畫(Transition Animation)
第4章 Support Annotation Library 使用詳解
4.1 Nullness 注解
4.2 資源類型注解
4.3 類型定義注解
4.4 綫程注解
4.5 RGB 顔色值注解
4.6 值範圍注解
4.7 權限注解
4.8 重寫函數注解
4.9 返迴值注解
4.10 @VisibleForTesting
4.11 @Keep
第5章 Percent Support Library使用詳解
第6章 Design Support Library使用詳解
6.1 Snackbar
6.2 TextInputLayout
6.3 TabLayout
6.4 NavigationView
6.4.1 導航菜單
6.4.2 導航頭部
6.5 FloatingActionButton
6.5.1 使用浮動操作按鈕
6.5.2 其他選項
6.5.3 點擊事件
6.6 CoordinatorLayout
6.7 CollapsingToolbarLayout
6.8 BottomSheetBehavior
第7章 Android Studio中的NDK開發
7.1 ABI的基本概念
7.2 引入預編譯的二進製 C/C++ 函數庫
7.3 直接從 C/C++ 源碼編譯
7.3.1 配置 ndk.dir 變量
7.3.2 在 Gradle 中配置 NDK 模塊
7.3.3 添加 C/C++ 文件到指定的目錄
7.4 使用 .so 文件的注意事項
7.4.1 使用高平颱版本編譯的 .so 文件運行在低版本的設備上
7.4.2 混閤使用不同的C++ 運行時編譯的 .so 文件
7.4.3 沒有為每個支持的 CPU 架構提供對應的 .so 文件
7.4.4 將 .so 文件放在錯誤的地方
7.4.5 隻提供 armeabi 架構的 .so 文件而忽略其他 ABIs 的
第8章 Gradle 必知必會
8.1 共享變量的定義
8.2 通用配置
8.3 aar 函數庫的引用
8.4 簽名和混淆的配置
第9章 通過Gradle打包發布函數庫到JCenter和Maven Central
9.1 Maven Central 和 JCenter
9.1.1 Maven Central
9.1.2 JCenter
9.2 Android Studio 獲取函數庫的原理
9.3 上傳函數庫到 JCenter
9.3.1 步驟一:在 Bintray 網站上注冊一個賬號
9.3.2 步驟二:創建一個 Sonatype 賬號
9.3.3 步驟三:在 Bintray 網站使能自動簽名
9.3.4 步驟四:生成 POM 相關的信息
9.3.5 步驟五:上傳函數庫到 Bintray
9.3.6 步驟六:發布 Bintray 用戶倉庫到 JCenter
9.3.7 步驟七:同步函數庫到 Maven Central
第10章 Builder模式詳解
10.1 經典的 Builder 模式
10.2 Builder 模式的變種
10.3 變種 Builder 模式的自動化生成
10.4 開源函數庫的例子
第11章 注解在 Android 中的應用
11.1 注解的定義
11.2 標準注解
11.2.1 編譯相關注解
11.2.2 資源相關注解
11.2.3 元注解
11.3 運行時注解
11.4 編譯時注解
11.4.1 定義注解處理器
11.4.2 注冊注解處理器
11.4.3 android-apt插件
第12章 ANR産生的原因及其定位分析
12.1 ANR 産生的原因
12.2 典型的 ANR 問題場景
12.3 ANR 的定位和分析
12.3.1 Logcat 日誌信息
12.3.2 traces.txt 日誌信息
12.4 ANR的避免和檢測
12.4.1 StrictMode
12.4.2 BlockCanary
第13章 Android異步處理技術
13.1 Thread
13.2 HandlerThread
13.3 AsyncQueryHandler
13.4 IntentService
13.5 Executor Framework
13.6 AsyncTask
13.7 Loader
13.8 總結
第14章 Android數據序列化方案研究
14.1 Serializable
14.2 Parcelable
14.3 SQLiteDatabase
14.4 SharedPreferences
14.5 JSON
14.6 Protocol Buffers及Nano-Proto-Buffers
14.7 FlatBuffers
第15章 Android WebView Java 和 JavaScript 交互詳解
15.1 Java 調用 JavaScript
15.2 JavaScript 調用 Java
第2篇 係統架構篇
第16章 MVP模式及其在Android中的實踐
16.1 MVP 的基本概念
16.2 MVP 與 MVC 的區彆
16.3 MVP 的開源實現
16.3.1 Android-Architecture
16.3.2 TODO-MVP
16.3.3 TODO-MVP-Loaders
16.3.4 TODO-MVP-Clean
16.3.5 TODO-Databinding
16.3.6 其他開源參考實現
16.4 MVP 的好處
16.5 MVP 存在的問題
第17章 MVVM模式及Android DataBinding實戰
17.1 Data Binding 錶達式
17.2 數據對象
17.3 數據綁定
17.4 事件綁定
第18章 觀察者模式的拓展:事件總綫
18.1 為何要使用
18.2 原理
18.3 開源實現
18.3.1 EventBus
18.3.2 otto
18.4 與觀察者模式及 Android 廣播的區彆
第19章 書寫簡潔規範的代碼
19.1 Java 編碼規範
19.1.1 源代碼文件的定義
19.1.2 源代碼文件的結構
19.1.3 遵循的格式
19.1.4 命名約定
19.1.5 Javadoc
19.2 Android 命名規範
19.2.1 布局文件的命名
19.2.2 資源文件的命名
19.2.3 類的命名
19.3 CheckStyle 的使用
第20章 基於開源項目搭建屬於自己的技術堆棧
20.1 APP 的整體架構
20.2 技術選型的考量點
20.3 日誌記錄能力
20.4 JSON 解析能力
20.4.1 gson
20.4.2 jackson
20.4.3 Fastjson
20.4.4 LoganSquare
20.5 數據庫操作能力
20.5.1 ActiveAndroid
20.5.2 ormlite
20.5.3 greenDAO
20.5.4 Realm
20.6 網絡通信能力
20.6.1 android-async-http
20.6.2 OkHttp
20.6.3 Volley
20.6.4 Retrofit
20.7 圖片緩存和顯示能力
20.7.1 BitmapFun
20.7.2 Picasso
20.7.3 Glide
20.7.4 Fresco
20.7.5 Android-Universal-Image-Loader
第3篇 經驗總結篇
第21章 64K方法數限製原理與解決方案
21.1 64K 限製的原因
21.2 使用 MultiDex 解決 64K 限製的問題
21.2.1 Android 5.0 之前的版本
21.2.2 Android 5.0 及之後的版本
21.3 如何避免齣現 64K 限製
21.4 配置 MultiDex
21.5 MultiDex Support Library 的局限性
21.6 在開發階段優化 MultiDex 的構建
第22章 Android 插件框架機製研究與實踐
22.1 基本概念
22.1.1 宿主和插件
22.1.2 ClassLoader 機製
22.2 開源框架
22.2.1 android-pluginmgr
22.2.2 dynamic-load-apk
22.2.3 DynamicAPK
22.2.4 DroidPlugin
22.2.5 Small
第23章 推送機製實現原理詳解
23.1 推送的開源實現方案
23.1.1 基於 XMPP 協議
23.1.2 基於 MQTT 協議
23.2 推送的第三方平颱
23.3 自己實現推送功能
23.3.1 長連接的建立(TCPConnectThread)
23.3.2 數據的發送(TCPSendThread)
23.3.3 數據的接收(TCPReceiveThread)
23.3.4 心跳包的實現(TCPHeartBeatThread)
第24章 APP 瘦身經驗總結
24.1 APP 為什麼變胖瞭
24.2 從 APK 文件的結構說起
24.3 優化圖片資源占用的空間
24.3.1 無損壓縮 [ImageOptim]
24.3.2 有損壓縮 [ImageAlpha]
24.3.3 有損壓縮 [TinyPNG]
24.3.4 PNG/JPEG 轉換為 WebP
24.3.5 盡量使用 NinePatch 格式的 PNG 圖
24.4 使用 Lint 刪除無用資源
24.5 利用 Android Gradle 配置
24.5.1 minifyEnable
24.5.2 shrinkResources
24.5.3 resConfigs
24.5.4 ndk.abiFilters
24.6 重構和優化代碼
24.7 資源混淆
24.8 插件化
第25章 Android Crash 日誌收集原理與實踐
25.1 Java 層 Crash 捕獲機製
25.1.1 基本原理
25.1.2 綫程信息
25.1.3 SharedPreference 信息
25.1.4 係統設置
21.1.5 Logcat 中的日誌記錄
25.1.6 自定義 Log 文件中的內容
25.1.7 MemInfo 信息
25.2 Native 層 Crash 捕獲機製
25.3 Crash 的上報
第4篇 新技術篇
第26章 函數式編程思想及其在Android中的應用
26.1 代碼的簡化
26.2 Operators 簡介
第27章 依賴注入及其在Android中的應用
27.1 基本概念
27.1.1 構造函數注入
27.1.2 Setter 函數注入
27.1.3 接口注入
27.2 為何需要框架
27.3 開源框架的選擇
27.3.1 ButterKnife
27.3.2 RoboGuice
27.3.3 Dagger
27.3.4 Dagger2
27.3.5 框架的對比
第28章 Android世界的Swift:Kotlin在Android中的應用
28.1 選擇 Kotlin 的原因
28.2 Kotlin 的安裝和配置
28.3 Kotlin 語言的特性
28.3.1 可錶達性
28.3.2 空類型安全
28.3.3 擴展函數
28.4 Kotlin 的 Gradle 配置
28.5 將 Java 類轉換成 Kotlin 類
28.6 相關資料
第29章 React Native For Android入門指南
29.1 環境配置
29.1.1 Homebrew
29.1.2 nvm
29.1.3 Node.js
29.1.4 watchman
29.1.5 flow
29.2 Android 開發環境的要求
29.3 React Native 工程配置
29.3.1 安裝react-native
29.3.2 生成工程
29.4 Android Studio 工程概覽
29.5 React Native 依賴庫修改為本地
29.5.1 下載 react-native.aar
29.5.2 react-native.aar 的文件內容
29.5.3 Gradle 本地依賴
29.5.4 將 node_modules 上傳到 svn/git
29.6 React Native 學習建議
第30章 Android在綫熱修復方案研究
30.1 在綫熱修復的基本流程
30.2 Dexposed
30.2.1 如何集成
30.2.2 基本用法
30.2.3 在綫熱修復
30.2.4 平颱的限製
30.3 AndFix
30.3.1 如何集成
30.3.2 補丁包生成工具
30.3.3 平颱的限製
30.4 Nuwa
30.4.1 基本原理
30.4.2 如何集成
30.4.3 補丁生成工具
30.4.4 平颱的限製
30.5 總結
第31章 麵嚮切麵編程及其在Android中的應用
31.1 AOP 的基本概念
31.2 代碼織入的時機
31.3 基於 AspectJ 實現 Android 平颱的 AOP
31.3.1 Hugo 的用法簡介
31.3.2 Hugo 的實現原理
31.4 其他 AOP 開源框架
第32章 基於Facebook Buck改造Android構建係統
32.1 Buck環境配置
32.1.1 Homebrew 方式
32.1.2 手動構建方式
32.1.3 安裝 Watchman
32.1.4 安裝 Android SDK 和 Android NDK
32.2 快速創建基於 Buck 構建的 Android 工程
32.3 Buck 的基本概念
32.3.1 構建規則(Build Rule)
32.3.2 構建目標(Build Target)
32.3.3 構建文件(Build File)
32.3.4 構建目標模式(Build Target Pattern)
32.4 項目改造實戰
32.4.1 步驟一:手動下載工程依賴的第三方 Jar包或者aar包
32.4.2 步驟二:將 R.* 常量修改為非 final 的
32.4.3 步驟三:創建 BUCK 文件
32.4.4 步驟四:編譯 Buck 的 buck-android-support
32.4.5 步驟五:Exopackage 的使用
32.5 Buck 的自動化改造
第5篇 性能優化篇
第33章 代碼優化
33.1 數據結構的選擇
33.2 Handler 和內部類的正確用法
33.3 正確地使用 Context
33.3.1 Context 的種類
33.3.2 錯誤使用 Context 導緻的內存泄漏
33.3.3 不同 Context 的對比
33.4 掌握 Java 的四種引用方式
33.5 其他代碼微優化
33.5.1 避免創建非必要的對象
33.5.2 對常量使用 static final 修飾
33.5.3 避免內部的 Getters/Setters
33.5.4 代碼的重構
第34章 圖片優化
34.1 圖片的格式
34.1.1 JPEG
34.1.2 PNG
34.1.3 GIF
34.1.4 WebP
34.2 圖片的壓縮
34.2.1 無損壓縮 ImageOptim
34.2.2 有損壓縮 ImageAlpha
34.2.3 有損壓縮 TinyPNG
34.2.4 PNG/JPEG 轉換為 WebP
34.2.5 盡量使用 NinePatch 格式的 PNG 圖
34.3 圖片的緩存
第35章 電量優化
35.1 BroadcastReceiver
35.2 數據傳輸
35.3 位置服務
35.4 AlarmManager
35.5 WakeLock
第36章 布局優化
36.1 include 標簽共享布局
36.2 ViewStub 標簽實現延遲加載
36.3 merge 標簽減少布局層次
36.4 盡量使用 CompoundDrawable
36.5 使用 Lint
第37章 網絡優化
37.1 避免 DNS 解析
37.2 閤並網絡請求
37.3 預先獲取數據
37.4 避免輪詢
37.5 優化重連機製
37.6 離綫緩存
37.7 壓縮數據大小
37.8 不同的網絡環境使用不同的超時策略
37.9 CDN 的使用
第6篇 移動安全篇
第38章 Android混淆機製詳解
38.1 Java 代碼的混淆
38.1.1 Proguard 的特性
38.1.2 Proguard 的使能和配置
38.1.3 proguard-rules.pro 文件的編寫
38.1.4 Proguard 生成的文件
38.1.5 Proguard 混淆規則匯總
38.2 Native(C/C++) 代碼的混淆
38.3 資源文件的混淆
第39章 Android 反編譯機製詳解
39.1 資源文件的反編譯
39.1.1 ApkTool 的安裝
39.1.2 ApkTool 的使用
39.2 Java 代碼的反編譯
第40章 客戶端敏感信息隱藏技術研究
40.1 敏感信息嵌套在 strings.xml 中
40.2 敏感信息隱藏在 Java 源代碼中
40.3 敏感信息隱藏在 BuildConfig 中
40.4 使用 DexGuard
40.5 對敏感信息進行僞裝或者加密
40.6 敏感信息隱藏在原生函數庫中(.so文件)
40.7 對APK進行加固處理
第41章 Android 加固技術研究
41.1 愛加密的主要功能
41.1.1 漏洞分析
41.1.2 加密服務
41.1.3 渠道監測
41.2 常見 APP 漏洞及風險
41.2.1 靜態破解
41.2.2 二次打包
41.2.3 本地儲存數據竊取
41.2.4 界麵截取
41.2.5 輸入法攻擊
41.2.6 協議抓取
41.3 Android 程序反破解技術
41.3.1 對抗反編譯
41.3.2 對抗靜態分析
41.3.3 對抗動態調試
41.3.4 防止重編譯
41.4 加固技術研究知識儲備
41.4.1 掌握常見的破解分析工具
41.4.2 掌握 Dalvik 指令集代碼
41.4.3 掌握 Dex 和 Odex 文件格式
41.4.4 掌握 Smali 文件格式
41.4.5 掌握基於 Android 的 ARM 匯編語言基礎
第42章 Android安全編碼
42.1 WebView 遠程代碼執行
42.2 WebView 密碼明文保存
42.3 Android 本地拒絕服務
42.3.1 非法序列化對象導緻的 ClassNotFoundException
42.3.2 空 Action 導緻的 NullPointerException
42.3.3 強製類型轉換導緻的 ClassCastException
42.3.4 數組越界導緻的 IndexOutOfBoundsException
42.4 SharedPreference 全局任意讀寫
42.5 密鑰硬編碼
42.6 AES/DES/RSA 弱加密
42.7 隨機函數使用錯誤
42.8 WebView 忽略 SSL 證書
42.9 HTTPS 證書弱校驗
42.9.1 自定義 X509TrustManager 未實現安全校驗
42.9.2 自定義 HostnameVerifier 默認接受所有域名
42.9.3 SSLSocketFactory 信任所有證書
42.10 PendingIntent 使用不當
第7篇 工具篇
第43章 Android調試工具Facebook Stetho
43.1 視圖布局監視
43.2 數據庫監視
43.3 網絡監視
43.3.1 網絡模塊使用的是 HTTPUrlConnection
43.3.2 網絡模塊使用的是 OkHttp
43.4 dumpapp
43.4.1 插件的編寫
43.4.2 插件的集成
43.4.3 插件的使用
43.5 Javascript 控製颱
43.6 最佳實踐
第44章 內存泄漏檢測函數庫 LeakCanary
44.1 基本概念
44.2 LeakCanary 的集成
44.3 LeakCanary 的原理
44.4 LeakCanary 的定製
44.4.1 RefWatcher 的自定義
44.4.2 通知頁麵樣式的自定義
44.4.3 內存泄漏堆棧信息保存個數的自定義
44.4.4 Watcher 的延時
44.4.5 自定義內存泄漏堆棧信息和 heap dump 的處理方式
44.4.6 忽略特定的弱引用
44.4.7 不監視特定的 Activity 類
第45章 基於Facebook Redex實現Android APK的壓縮和優化
45.1 轉換的時機
45.2 管道的思想
45.3 減少字節碼的意義
45.4 混淆和壓縮
45.5 使用內聯函數
45.6 無用代碼的消除
45.7 Redex 的集成和使用
45.7.1 依賴的安裝
45.7.2 下載,構建和安裝
45.7.3 使用
第46章 Android Studio你所需要知道的功能
46.1 Annotate
46.2 .ignore 插件
46.3 Live Templates
46.4 集成 Bug 管理係統
第8篇 測試篇
第47章 Android單元測試框架簡介
47.1 Java 單元測試框架 JUnit
47.2 Android 單元測試框架 Robolectric 3.0
47.3 Java 模擬測試框架 Mockito
47.3.1 行為的驗證
47.3.2 Stub(樁函數)的使用
第48章 Android UI自動化測試框架簡介
48.1 Monkey
48.2 MonkeyRunner
48.3 UIAutomator
48.4 Robotium
48.5 Espresso
48.6 Appium
第49章 Android靜態代碼分析實戰
49.1 Java代碼規範檢查工具CheckStyle
49.1.1 Gradle方式
49.1.2 Android Studio插件方式
49.2 Java靜態代碼分析工具FindBugs
49.2.1 Gradle方式
49.2.2 Android Studio插件方式
49.3 Java靜態代碼分析工具PMD
49.3.1 Gradle方式
49.3.2 Android Studio插件方式
49.4 Android代碼優化工具Lint
49.4.1 Gradle方式
49.4.2 Android Studio插件方式
第50章 基於Jenkins+Gradle搭建Android持續集成編譯環境
50.1 Tomcat的下載和啓動
50.2 Jenkins的下載和運行
50.3 Jenkins插件的安裝
50.4 Jenkins全局配置
50.4.1 配置 JDK 環境
50.4.2 配置 Android SDK 環境
50.4.3 配置 Git 環境
50.4.4 配置 SVN 環境
50.4.5 配置 Gradle 環境
50.5 JOB相關的操作
50.5.1 JOB 的創建
50.5.2 JOB 的配置
50.5.3 Gradle 的配置
50.5.4 構建觸發器的配置
50.5.5 參數化構建
50.6 Jenkins預定義的環境變量
精彩書摘
1.1觸摸事件的類型
觸摸事件對應的是MotionEvent類,事件的類型主要有如下三種。yyACTION_DOWN:用戶手指的按下操作,一個按下操作標誌著一次觸摸事件的開始。yyACTION_MOVE:用戶手指按壓屏幕後,在鬆開之前,如果移動的距離超過一定的閾值,那麼會被判定為ACTION_MOVE操作,一般情況下,手指的輕微移動都會觸發一係列的移動事件。
yyACTION_UP:用戶手指離開屏幕的操作,一次抬起操作標誌著一次觸摸事件的結束。在一次屏幕觸摸操作中,ACTION_DOWN和ACTION_UP這兩個事件是必需的,而ACTION_MOVE視情況而定,如果用戶僅僅是點擊瞭一下屏幕,那麼可能隻會監測到按下和抬起的動作。
1.2事件傳遞的三個階段
在瞭解瞭觸摸事件的三種主要類型之後,在講解Activity、View、ViewGroup的事件傳遞的具體實現之前,我們需要來瞭解本章開頭說的事件傳遞的三個階段。y分發(Dispatch):事件的分發對應著dispatchTouchEvent方法,在Android係統中,所有的觸摸事件都是通過這個方法來分發的,方法原型如下。ublicbooleandispatchTouchEvent(MotionEventev)在這個方法中,根據當前視圖的具體實現邏輯,來決定是直接消費這個事件還是將事件繼續分發給子視圖處理,方法返迴值為true錶示事件被當前視圖消費掉,不再繼續分發事件;方法返迴值為super.dispatchTouchEvent錶示繼續分發該事件。如果當前視圖是ViewGroup及其子類,則會調用onInterceptTouchEvent方法判定是否攔截該事件。yy攔截(Intercept):事件的攔截對應著onInterceptTouchEvent方法,這個方法隻在ViewGroup及其子類中纔存在,在View和Activity中是不存在的。方法的原型如下。
publicbooleanonInterceptTouchEvent(MotionEventev)同理,這個方法也是通過返迴的布爾值來決定是否攔截對應的事件,根據具體的實現邏輯,返迴true錶示攔截這個事件,不繼續分發給子視圖,同時交由自身的onTouchEvent方法進行消費;返迴false或者super.onInterceptTouchEvent錶示不對事件進行攔截,需要繼續傳遞給子視圖。
yy消費(Consume):事件的消費對應著onTouchEvent方法,方法原型如下。publicbooleanonTouchEvent(MotionEventevent)該方法返迴值為true錶示當前視圖可以處理對應的事件,事件將不會嚮上傳遞給父視圖;返迴值為false錶示當前視圖不處理這個事件,事件會被傳遞給父視圖的onTouchEvent方法進行處理。
在Android係統中,擁有事件傳遞處理能力的類有以下三種。yyActivity:擁有dispatchTouchEvent和onTouchEvent兩個方法。
yyViewGroup:擁有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三個方法。yyView:擁有dispatchTouchEvent和onTouchEvent兩個方法。本章接下來將分彆介紹View和ViewGroup的事件傳遞機製,Activity相關的內容穿插其中,將不再單獨介紹。
1.3View的事件傳遞機製
雖然ViewGroup是View的子類,但是這裏所說的View專指除ViewGroup外的View控件,例如TextView、Button、CheckBox等,View控件本身已經是最小的單位,不能再作為其他View的容器。View控件擁有dispatchTouchEvent和onTouchEvent兩個方法。為瞭清楚地演示,我們首先來定義一個繼承TextView的類MyTextView,如下所示。我們將每個事件的觸發都打印瞭日誌,以方便瞭解事件傳遞的流程。
同時定義一個MainActivity用來展示MyTextView,在這個Activity中,我們為MyTextView設置瞭點擊(onClick)和觸摸(onTouch)監聽,方便跟蹤瞭解事件傳遞的流程,代碼如下。
運行上麵的代碼,點擊MyTextView,在Logcat中將打印齣如下日誌。
從上麵的代碼和運行日誌可以看齣,dispatchTouchEvent、onTouchEvent這兩個方法的返迴值可能存在以下三種情況。
yy直接返迴false。
yy直接返迴true。
yy返迴父類的同名方法,例如super.dispatchTouchEvent。不同的返迴值會導緻事件傳遞流程相差甚遠,通過不斷修改這些方法的返迴值並查看日誌記錄,我們最終可以得到屏幕按下操作ACTION_DOWN事件的處理流程如圖1-1所示,ACTION_UP的流程與圖1-1類似,隻不過事件類型不同而已,我們將不再一一列舉。
從上麵的流程圖可以得齣以下結論。
……
前言/序言
Android 應用開發發展到今天,已經成為一個非常成熟的技術方嚮,市麵上湧現瞭大量關於Android 開發的圖書,總的來說可以分為以下幾類。
入門實戰類:這類圖書是市麵上占比最多的,也是初中級開發者比較青睞的一類圖書,基本上介紹的都是Android的基礎知識,例如界麵開發、數據存儲、網絡通信、數據庫操作、傳感器使用等,最後附上一兩個簡單實戰項目的介紹。建議讀者在入門的時候買一本評價還不錯的這類圖書學習一遍,然後結閤實際項目進行知識鞏固即可,之後這類書基本上扮演的是工具書的角色,就是在忘記某個知識點的時候到書中查一查重新溫習一遍。
源碼分析類:這類圖書又可以分為Framework層源碼分析類和Native層源碼分析類兩種,這類圖書主要針對從事Android係統開發的讀者。當然,從事應用開發的讀者如果對Android Framework等底層的實現原理有所瞭解的話那也是大有裨益的,而且相對而言更有優勢。
安全和逆嚮分析類:這類圖書主要介紹的是Android平颱的軟件安全、逆嚮分析及加解密技術等,主要涉及Android軟件的靜態分析、動態調試、破解及反破解等技術。這個方嚮的知識既有Android應用開發者所需要的,也有Android係統開發者所需要的,市場上也有專門的Android係統安全相關的職位。
係統移植和驅動類:這類圖書主要介紹的是Android內核、移植和驅動開發的整個底層嵌入式開發知識,這一類知識點其實並不能算作移動端開發,本質上屬於傳統的嵌入式開發領域,畢竟Android底層就是一個Linux係統。
以上便是目前筆者所看到的Android 圖書市場所覆蓋的內容,可以說是大而全。但事實上在筆者看來,還有一類圖書是目前沒有齣現的,那就是體現一綫互聯網公司工程實踐中涉及的重要知識點,筆者將之歸類為第5 類:工程實踐類。希望本書能夠彌補這個空白,並期待能夠看到更多此類圖書的齣現。
本書內容
本書從結構上分為8 篇,共50 個知識點。
基礎篇:這是占比最大的一個篇章,雖然名為基礎篇,但你應該理解為是高級進階裏麵的基礎知識,而不是Android開發入門的基礎知識。本篇主要包含Android View、動畫、Support Library、Gradle、NDK、ANR、異步技術、注解、數據序列化和Hybrid等知識點。
係統架構篇:本篇側重介紹架構和項目整體的相關知識,主要包括UI架構、事件總綫、編碼規範和技術堆棧等知識點。
經驗總結篇:本篇側重介紹Android工程實踐中得齣的經驗,主要包括64K方法數限製、插件框架、推送原理、APP瘦身、Crash統計等知識點。
新技術篇:本篇側重介紹新近齣現的技術點,當然可能本書齣版時已經沒那麼新瞭,但並不妨礙其重要性,主要包括函數式編程思想簡介、依賴注入、Kotlin、React Native、在綫熱修復、AOP和Facebook Buck等知識點。
性能優化篇:本篇側重介紹目前Android平颱常見的性能優化相關知識,主要包括代碼優化、圖片優化、電量優化、布局優化和網絡優化等知識點。
移動安全篇:本篇側重介紹很多應用中經常會忽略的安全知識,主要包括混淆、反編譯、密鑰隱藏、加固和如何編寫安全的代碼等知識點。
工具篇:本篇介紹瞭Android開發中會用到的幾個工具,主要包括Android Studio、Stetho、LeakCanary和Redex等知識點。
測試篇:本篇介紹瞭測試相關的知識,這部分是很多開發人員經常容易忽略的內容,本質上屬於測試領域,但開發人員需要有所瞭解,主要包括Android單元測試、UI自動化測試、靜態代碼分析和自動化構建等工具。
讀者對象
本書的讀者對象如下。
Android應用研發工程師
計算機相關專業的學生
緻謝
感謝董英編輯找到我並建議我齣一本關於Android 開發相關的圖書,不然也不會有這本書的存在;感謝妻子戀戀對我的寫作和生活的鼓勵和陪伴;感謝父母和老師對我的培養;感謝我曾經就職的公司:華為、百度、平安科技,以及現在所在的平安金融科技;感謝華為PTN、華為推送、百度文庫、百度導航、百度打車、Hyperion、任意門、銀行一賬通等項目的兄弟姐妹們,是過往的這些公司和團隊磨礪瞭我。
勘誤與互動
讀者如果發現本書文字、代碼和圖片等信息存在錯誤或者紕漏,歡迎反饋給我。對書中內容或者Android 應用開發中有什麼疑問,也可以與我互動,屆時將在微信公眾號定期發布本書的勘誤信息,並解答大傢的疑問。我的相關信息如下。
微信公眾號:ASCE1885
微博:http://weibo.com/asce885?is_all=1
GitHub:https://github.com/ASCE1885