本書是Android的進(jìn)階學(xué)習(xí)指南,主要為Android初中級(jí)開(kāi)發(fā)者進(jìn)階所需的知識(shí),高級(jí)開(kāi)發(fā)者也可以從本書中發(fā)現(xiàn)很多共鳴點(diǎn)。本書從8個(gè)方面對(duì)50個(gè)知識(shí)點(diǎn)進(jìn)行分類講解,包括基礎(chǔ)篇、系統(tǒng)架構(gòu)篇、經(jīng)驗(yàn)總結(jié)篇、新技術(shù)篇、性能優(yōu)化篇、移動(dòng)安全篇、工具篇、測(cè)試篇。熟練掌握這些知識(shí)點(diǎn)后,應(yīng)該就能夠應(yīng)付實(shí)際項(xiàng)目開(kāi)發(fā)中的絕大部分問(wèn)題了。 本書的主要目的在于給讀者一個(gè)完整的Android中高級(jí)開(kāi)發(fā)者知識(shí)圖譜。筆者希望通過(guò)本書的系統(tǒng)講解,能夠幫助讀者在面試和工作中收獲自己滿意的成績(jī)。
本書從基礎(chǔ)、架構(gòu)、安全、性能優(yōu)化、新技術(shù)、測(cè)試等角度,通過(guò)簡(jiǎn)單的代碼示例詳盡地展示了 Android 開(kāi)發(fā)技巧
本書作者技術(shù)基礎(chǔ)深厚扎實(shí),是新技術(shù)的探索和追逐者,他對(duì)于技術(shù)發(fā)自內(nèi)心地?zé)釔?ài), 是業(yè)界非常的 Android 架構(gòu)師
本書是作者在一線互聯(lián)網(wǎng)企業(yè)工作多年的經(jīng)驗(yàn)沉淀,從不同角度對(duì) Android 新技術(shù)拋磚引玉,由淺入深,將實(shí)戰(zhàn)中的案例抽象成原型,通俗易懂
本書對(duì)于技術(shù)的解讀樸實(shí)風(fēng)趣,深入淺出,是 Android 工程師的進(jìn)階寶典,騰訊、華為、阿里、百度、平安科技等一線移動(dòng)開(kāi)發(fā)工程師聯(lián)袂推薦
顧浩鑫,網(wǎng)絡(luò) ID:ASCE1885,平安金融科技移動(dòng)研發(fā)工程師,目前主要從事 Android & React Native 相關(guān)研發(fā)工作,畢業(yè)于華中科技大學(xué)圖像識(shí)別與人工智能研究所,曾先后就職于華為、百度、平安科技。
第1篇基礎(chǔ)篇
第1章Android觸摸事件傳遞機(jī)制
1.1觸摸事件的類型
1.2事件傳遞的三個(gè)階段
1.3View的事件傳遞機(jī)制
1.4ViewGroup的事件傳遞機(jī)制
第2章Android View的繪制流程
2.1繪制的整體流程
2.2MeasureSpec
2.3Measure
2.4Layout
2.5Draw
第3章Android 動(dòng)畫機(jī)制
3.1逐幀動(dòng)畫(Frame Animation)
3.1.1XML 資源文件方式
3.1.2代碼方式
3.2補(bǔ)間動(dòng)畫(Tween Animation)
3.2.1插值器 Interpolator
3.2.2AlphaAnimation
3.2.3ScaleAnimation
3.2.4TranslateAnimation
3.2.5RotateAnimation
3.2.6自定義補(bǔ)間動(dòng)畫
3.3屬性動(dòng)畫(Property Animation)
3.3.1Evaluator
3.3.2AnimatorSet
3.3.3ValueAnimator
3.3.4ObjectAnimator
3.4過(guò)渡動(dòng)畫(Transition Animation)
第4章Support Annotation Library 使用詳解
4.1Nullness 注解
4.2資源類型注解
4.3類型定義注解
4.4線程注解
4.5RGB 顏色值注解
4.6值范圍注解
4.7權(quán)限注解
4.8重寫函數(shù)注解
4.9返回值注解
4.10@VisibleForTesting
4.11@Keep
第5章Percent Support Library使用詳解
第6章Design Support Library使用詳解
6.1Snackbar
6.2TextInputLayout
6.3TabLayout
6.4NavigationView
6.4.1導(dǎo)航菜單
6.4.2導(dǎo)航頭部
6.5FloatingActionButton
6.5.1使用浮動(dòng)操作按鈕
6.5.2其他選項(xiàng)
6.5.3點(diǎn)擊事件
6.6CoordinatorLayout
6.7CollapsingToolbarLayout
6.8BottomSheetBehavior
第7章Android Studio中的NDK開(kāi)發(fā)
7.1ABI的基本概念
7.2引入預(yù)編譯的二進(jìn)制 C/C 函數(shù)庫(kù)
7.3直接從 C/C 源碼編譯
7.3.1配置 ndk.dir 變量
7.3.2在 Gradle 中配置 NDK 模塊
7.3.3添加 C/C 文件到指定的目錄
7.4使用 .so 文件的注意事項(xiàng)
7.4.1使用高平臺(tái)版本編譯的 .so 文件運(yùn)行在低版本的設(shè)備上
7.4.2混合使用不同的C 運(yùn)行時(shí)編譯的 .so 文件
7.4.3沒(méi)有為每個(gè)支持的 CPU 架構(gòu)提供對(duì)應(yīng)的 .so 文件
7.4.4將 .so 文件放在錯(cuò)誤的地方
7.4.5只提供 armeabi 架構(gòu)的 .so 文件而忽略其他 ABIs 的
第8章Gradle 必知必會(huì)
8.1共享變量的定義
8.2通用配置
8.3aar 函數(shù)庫(kù)的引用
8.4簽名和混淆的配置
第9章通過(guò)Gradle打包函數(shù)庫(kù)到JCenter和Maven Central
9.1Maven Central 和 JCenter
9.1.1Maven Central
9.1.2JCenter
9.2Android Studio 獲取函數(shù)庫(kù)的原理
9.3上傳函數(shù)庫(kù)到 JCenter
9.3.1步驟一:在 Bintray 網(wǎng)站上注冊(cè)一個(gè)賬號(hào)
9.3.2步驟二:創(chuàng)建一個(gè) Sonatype 賬號(hào)
9.3.3步驟三:在 Bintray 網(wǎng)站使能自動(dòng)簽名
9.3.4步驟四:生成 POM 相關(guān)的信息
9.3.5步驟五:上傳函數(shù)庫(kù)到 Bintray
9.3.6步驟六: Bintray 用戶倉(cāng)庫(kù)到 JCenter
9.3.7步驟七:同步函數(shù)庫(kù)到 Maven Central
第10章Builder模式詳解
10.1經(jīng)典的 Builder 模式
10.2Builder 模式的變種
10.3變種 Builder 模式的自動(dòng)化生成
10.4開(kāi)源函數(shù)庫(kù)的例子
第11章注解在 Android 中的應(yīng)用
11.1注解的定義
11.2標(biāo)準(zhǔn)注解
11.2.1編譯相關(guān)注解
11.2.2資源相關(guān)注解
11.2.3元注解
11.3運(yùn)行時(shí)注解
11.4編譯時(shí)注解
11.4.1定義注解處理器
11.4.2注冊(cè)注解處理器
11.4.3android-apt插件
第12章ANR產(chǎn)生的原因及其定位分析
12.1ANR 產(chǎn)生的原因
12.2典型的 ANR 問(wèn)題場(chǎng)景
12.3ANR 的定位和分析
12.3.1Logcat 日志信息
12.3.2traces.txt 日志信息
12.4ANR的避免和檢測(cè)
12.4.1StrictMode
12.4.2BlockCanary
第13章Android異步處理技術(shù)
13.1Thread
13.2HandlerThread
13.3AsyncQueryHandler
13.4IntentService
13.5Executor Framework
13.6AsyncTask
13.7Loader
13.8總結(jié)
第14章Android數(shù)據(jù)序列化方案研究
14.1Serializable
14.2Parcelable
14.3SQLiteDatabase
14.4SharedPreferences
14.5JSON
14.6Protocol Buffers及Nano-Proto-Buffers
14.7FlatBuffers
第15章Android WebView Java 和 JavaScript 交互詳解
15.1Java 調(diào)用 JavaScript
15.2JavaScript 調(diào)用 Java
第2篇系統(tǒng)架構(gòu)篇
第16章MVP模式及其在Android中的實(shí)踐
16.1MVP 的基本概念
16.2MVP 與 MVC 的區(qū)別
16.3MVP 的開(kāi)源實(shí)現(xiàn)
16.3.1Android-Architecture
16.3.2TODO-MVP
16.3.3TODO-MVP-Loaders
16.3.4TODO-MVP-Clean
16.3.5TODO-Databinding
16.3.6其他開(kāi)源參考實(shí)現(xiàn)
16.4MVP 的好處
16.5MVP 存在的問(wèn)題
第17章MVVM模式及Android DataBinding實(shí)戰(zhàn)
17.1Data Binding 表達(dá)式
17.2數(shù)據(jù)對(duì)象
17.3數(shù)據(jù)綁定
17.4事件綁定
第18章觀察者模式的拓展:事件總線
18.1為何要使用
18.2原理
18.3開(kāi)源實(shí)現(xiàn)
18.3.1EventBus
18.3.2otto
18.4與觀察者模式及 Android 廣播的區(qū)別
第19章書寫簡(jiǎn)潔規(guī)范的代碼
19.1Java 編碼規(guī)范
19.1.1源代碼文件的定義
19.1.2源代碼文件的結(jié)構(gòu)
19.1.3遵循的格式
19.1.4命名約定
19.1.5Javadoc
19.2Android 命名規(guī)范
19.2.1布局文件的命名
19.2.2資源文件的命名
19.2.3類的命名
19.3CheckStyle 的使用
第20章基于開(kāi)源項(xiàng)目搭建屬于自己的技術(shù)堆棧
20.1APP 的整體架構(gòu)
20.2技術(shù)選型的考量點(diǎn)
20.3日志記錄能力
20.4JSON 解析能力
20.4.1gson
20.4.2jackson
20.4.3Fastjson
20.4.4LoganSquare
20.5數(shù)據(jù)庫(kù)操作能力
20.5.1ActiveAndroid
20.5.2ormlite
20.5.3greenDAO
20.5.4Realm
20.6網(wǎng)絡(luò)通信能力
20.6.1android-async-http
20.6.2OkHttp
20.6.3Volley
20.6.4Retrofit
20.7圖片緩存和顯示能力
20.7.1BitmapFun
20.7.2Picasso
20.7.3Glide
20.7.4Fresco
20.7.5Android-Universal-Image-Loader
第3篇經(jīng)驗(yàn)總結(jié)篇
第21章64K方法數(shù)限制原理與解決方案
21.164K 限制的原因
21.2使用 MultiDex 解決 64K 限制的問(wèn)題
21.2.1Android 5.0 之前的版本
21.2.2Android 5.0 及之后的版本
21.3如何避免出現(xiàn) 64K 限制
21.4配置 MultiDex
21.5MultiDex Support Library 的局限性
21.6在開(kāi)發(fā)階段優(yōu)化 MultiDex 的構(gòu)建
第22章Android 插件框架機(jī)制研究與實(shí)踐
22.1基本概念
22.1.1宿主和插件
22.1.2ClassLoader 機(jī)制
22.2開(kāi)源框架
22.2.1android-pluginmgr
22.2.2dynamic-load-apk
22.2.3DynamicAPK
22.2.4DroidPlugin
22.2.5Small
第23章推送機(jī)制實(shí)現(xiàn)原理詳解
23.1推送的開(kāi)源實(shí)現(xiàn)方案
23.1.1基于 XMPP 協(xié)議
23.1.2基于 MQTT 協(xié)議
23.2推送的第三方平臺(tái)
23.3自己實(shí)現(xiàn)推送功能
23.3.1長(zhǎng)連接的建立(TCPConnectThread)
23.3.2數(shù)據(jù)的發(fā)送(TCPSendThread)
23.3.3數(shù)據(jù)的接收(TCPReceiveThread)
23.3.4心跳包的實(shí)現(xiàn)(TCPHeartBeatThread)
第24章APP 瘦身經(jīng)驗(yàn)總結(jié)
24.1APP 為什么變胖了
24.2從 APK 文件的結(jié)構(gòu)說(shuō)起
24.3優(yōu)化圖片資源占用的空間
24.3.1無(wú)損壓縮 [ImageOptim]
24.3.2有損壓縮 [ImageAlpha]
24.3.3有損壓縮 [TinyPNG]
24.3.4PNG/JPEG 轉(zhuǎn)換為 WebP
24.3.5盡量使用 NinePatch 格式的 PNG 圖
24.4使用 Lint 刪除無(wú)用資源
24.5利用 Android Gradle 配置
24.5.1minifyEnable
24.5.2shrinkResources
24.5.3resConfigs
24.5.4ndk.abiFilters
24.6重構(gòu)和優(yōu)化代碼
24.7資源混淆
24.8插件化
第25章Android Crash 日志收集原理與實(shí)踐
25.1Java 層 Crash 捕獲機(jī)制
25.1.1基本原理
25.1.2線程信息
25.1.3SharedPreference 信息
25.1.4系統(tǒng)設(shè)置
21.1.5Logcat 中的日志記錄
25.1.6自定義 Log 文件中的內(nèi)容
25.1.7MemInfo 信息
25.2Native 層 Crash 捕獲機(jī)制
25.3Crash 的上報(bào)
第4篇新技術(shù)篇
第26章函數(shù)式編程思想及其在Android中的應(yīng)用
26.1代碼的簡(jiǎn)化
26.2Operators 簡(jiǎn)介
第27章依賴注入及其在Android中的應(yīng)用
27.1基本概念
27.1.1構(gòu)造函數(shù)注入
27.1.2Setter 函數(shù)注入
27.1.3接口注入
27.2為何需要框架
27.3開(kāi)源框架的選擇
27.3.1ButterKnife
27.3.2RoboGuice
27.3.3Dagger
27.3.4Dagger2
27.3.5框架的對(duì)比
第28章Android世界的Swift:Kotlin在Android中的應(yīng)用
28.1選擇 Kotlin 的原因
28.2Kotlin 的安裝和配置
28.3Kotlin 語(yǔ)言的特性
28.3.1可表達(dá)性
28.3.2空類型安全
28.3.3擴(kuò)展函數(shù)
28.4Kotlin 的 Gradle 配置
28.5將 Java 類轉(zhuǎn)換成 Kotlin 類
28.6相關(guān)資料
第29章React Native For Android入門指南
29.1環(huán)境配置
29.1.1Homebrew
29.1.2nvm
29.1.3Node.js
29.1.4watchman
29.1.5flow
29.2Android 開(kāi)發(fā)環(huán)境的要求
29.3React Native 工程配置
29.3.1安裝react-native
29.3.2生成工程
29.4Android Studio 工程概覽
29.5React Native 依賴庫(kù)修改為本地
1.1觸摸事件的類型
觸摸事件對(duì)應(yīng)的是MotionEvent類,事件的類型主要有如下三種。yyACTION_DOWN:用戶手指的按下操作,一個(gè)按下操作標(biāo)志著一次觸摸事件的開(kāi)始。yyACTION_MOVE:用戶手指按壓屏幕后,在松開(kāi)之前,如果移動(dòng)的距離超過(guò)一定的閾值,那么會(huì)被判定為ACTION_MOVE操作,一般情況下,手指的輕微移動(dòng)都會(huì)觸發(fā)一系列的移動(dòng)事件。
yyACTION_UP:用戶手指離開(kāi)屏幕的操作,一次抬起操作標(biāo)志著一次觸摸事件的結(jié)束。在一次屏幕觸摸操作中,ACTION_DOWN和ACTION_UP這兩個(gè)事件是必需的,而ACTION_MOVE視情況而定,如果用戶僅僅是點(diǎn)擊了一下屏幕,那么可能只會(huì)監(jiān)測(cè)到按下和抬起的動(dòng)作。
1.2事件傳遞的三個(gè)階段
在了解了觸摸事件的三種主要類型之后,在講解Activity、View、ViewGroup的事件傳遞的具體實(shí)現(xiàn)之前,我們需要來(lái)了解本章開(kāi)頭說(shuō)的事件傳遞的三個(gè)階段。y分發(fā)(Dispatch):事件的分發(fā)對(duì)應(yīng)著dispatchTouchEvent方法,在Android系統(tǒng)中,所有的觸摸事件都是通過(guò)這個(gè)方法來(lái)分發(fā)的,方法原型如下。ublicbooleandispatchTouchEvent(MotionEventev)在這個(gè)方法中,根據(jù)當(dāng)前視圖的具體實(shí)現(xiàn)邏輯,來(lái)決定是直接消費(fèi)這個(gè)事件還是將事件繼續(xù)分發(fā)給子視圖處理,方法返回值為true表示事件被當(dāng)前視圖消費(fèi)掉,不再繼續(xù)分發(fā)事件;方法返回值為super.dispatchTouchEvent表示繼續(xù)分發(fā)該事件。如果當(dāng)前視圖是ViewGroup及其子類,則會(huì)調(diào)用onInterceptTouchEvent方法判定是否攔截該事件。yy攔截(Intercept):事件的攔截對(duì)應(yīng)著onInterceptTouchEvent方法,這個(gè)方法只在ViewGroup及其子類中才存在,在View和Activity中是不存在的。方法的原型如下。
publicbooleanonInterceptTouchEvent(MotionEventev)同理,這個(gè)方法也是通過(guò)返回的布爾值來(lái)決定是否攔截對(duì)應(yīng)的事件,根據(jù)具體的實(shí)現(xiàn)邏輯,返回true表示攔截這個(gè)事件,不繼續(xù)分發(fā)給子視圖,同時(shí)交由自身的onTouchEvent方法進(jìn)行消費(fèi);返回false或者super.onInterceptTouchEvent表示不對(duì)事件進(jìn)行攔截,需要繼續(xù)傳遞給子視圖。
yy消費(fèi)(Consume):事件的消費(fèi)對(duì)應(yīng)著onTouchEvent方法,方法原型如下。publicbooleanonTouchEvent(MotionEventevent)該方法返回值為true表示當(dāng)前視圖可以處理對(duì)應(yīng)的事件,事件將不會(huì)向上傳遞給父視圖;返回值為false表示當(dāng)前視圖不處理這個(gè)事件,事件會(huì)被傳遞給父視圖的onTouchEvent方法進(jìn)行處理。
在Android系統(tǒng)中,擁有事件傳遞處理能力的類有以下三種。yyActivity:擁有dispatchTouchEvent和onTouchEvent兩個(gè)方法。
yyViewGroup:擁有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三個(gè)方法。yyView:擁有dispatchTouchEvent和onTouchEvent兩個(gè)方法。本章接下來(lái)將分別介紹View和ViewGroup的事件傳遞機(jī)制,Activity相關(guān)的內(nèi)容穿插其中,將不再單獨(dú)介紹。
1.3View的事件傳遞機(jī)制
雖然ViewGroup是View的子類,但是這里所說(shuō)的View專指除ViewGroup外的View控件,例如TextView、Button、CheckBox等,View控件本身已經(jīng)是最小的單位,不能再作為其他View的容器。View控件擁有dispatchTouchEvent和onTouchEvent兩個(gè)方法。為了清楚地演示,我們首先來(lái)定義一個(gè)繼承TextView的類MyTextView,如下所示。我們將每個(gè)事件的觸發(fā)都打印了日志,以方便了解事件傳遞的流程。
同時(shí)定義一個(gè)MainActivity用來(lái)展示MyTextView,在這個(gè)Activity中,我們?yōu)镸yTextView設(shè)置了點(diǎn)擊(onClick)和觸摸(onTouch)監(jiān)聽(tīng),方便跟蹤了解事件傳遞的流程,代碼如下。
運(yùn)行上面的代碼,點(diǎn)擊MyTextView,在Logcat中將打印出如下日志。
從上面的代碼和運(yùn)行日志可以看出,dispatchTouchEvent、onTouchEvent這兩個(gè)方法的返回值可能存在以下三種情況。
yy直接返回false。
yy直接返回true。
yy返回父類的同名方法,例如super.dispatchTouchEvent。不同的返回值會(huì)導(dǎo)致事件傳遞流程相差甚遠(yuǎn),通過(guò)不斷修改這些方法的返回值并查看日志記錄,我們最終可以得到屏幕按下操作ACTION_DOWN事件的處理流程如圖1-1所示,ACTION_UP的流程與圖1-1類似,只不過(guò)事件類型不同而已,我們將不再一一列舉。
從上面的流程圖可以得出以下結(jié)論。
……
mark209102741
qqqqq
vvvvVB不巴巴爸爸巴巴爸爸
好
書不過(guò)。包裝能不能專業(yè)點(diǎn)書的角落邊上全都碰壞了
特別好特別好
涵蓋的知識(shí)點(diǎn)很多,但是排版過(guò)于寬松,內(nèi)容過(guò)于粗略,知識(shí)點(diǎn)講解級(jí)不詳細(xì),因此并不推薦購(gòu)買
進(jìn)階還是可以的
整體感覺(jué)不錯(cuò)。
很好書是正版的
里面印刷有白頁(yè),感覺(jué)正版就是這質(zhì)量?
好,這書不錯(cuò)。
不錯(cuò)!不錯(cuò)!不錯(cuò)!
送貨快。包裝好。沒(méi)有質(zhì)量問(wèn)題。
好
很好,很不錯(cuò),值得購(gòu)買
圖沒(méi)啥區(qū)別,我就不曬了。其實(shí)怎么說(shuō)了,我以前不評(píng)論,但是因?yàn)槲抑翱丛u(píng)論,好像都說(shuō)的不太好,代碼少啦,網(wǎng)上找的啦。其實(shí)本身你怎么可能在網(wǎng)上找不到書里的內(nèi)容?如果你愿意完全可以不要買書,但書上的內(nèi)容我感覺(jué)調(diào)理更清晰。至于有些人說(shuō)關(guān)于代碼不詳細(xì)的問(wèn)題,我特別要說(shuō)明一下,這本書是給有基礎(chǔ)的人看的。不是給初學(xué)者,不是給初學(xué)者,不是給初學(xué)者,重要的事情說(shuō)三遍。如果是剛學(xué)我建議買那個(gè)入門到精通,我就用的那個(gè)。還有一個(gè)就是買黑馬的視頻,淘寶有,兩三塊錢吧。
內(nèi)容豐富翔實(shí)
寫的還不錯(cuò)
東西不錯(cuò),就是最后的快遞態(tài)度很差,打電話一直不接,中間還夾著幾次正在通話中,然后打過(guò)去通了還是不接,好不容易接了電話,說(shuō)了兩句話就直接掛了,無(wú)語(yǔ)
聽(tīng)說(shuō)這本書很好,剛收到,看了后再追評(píng)
非常的喜歡
還不錯(cuò),有些方面平時(shí)沒(méi)留意,受益了
太簡(jiǎn)單了,簡(jiǎn)單東西簡(jiǎn)單描述,還不入看百度百科詳細(xì),比較復(fù)雜點(diǎn)的,一兩行文字帶過(guò),估計(jì)作者不懂
所講內(nèi)容都是蜻蜓點(diǎn)水,沒(méi)什么代碼,感覺(jué)像是東抄西搬的,沒(méi)有真正結(jié)合實(shí)際項(xiàng)目
涵蓋面廣泛 羅列了各種流行框架 但是不是很詳細(xì)
書很快就收到了,先給個(gè)好評(píng)吧,看了兩個(gè)章節(jié),本書覆蓋的知識(shí)點(diǎn)很全面,但是介紹不是很詳細(xì),項(xiàng)目開(kāi)發(fā)中用到可能還需要再去深入研究吧