温故而知新!这篇文章可以满足你80%日常工作!面试真题解析
前言
程序員這個行業,日新月異,技術體系更新速度快,新技術新框架層出不窮,所有的技術都像是一個無底洞,當你學得越多就會發現不懂的越多,不懂的越多,需要學習的就更多。
因此,一旦選擇了這個行業,就意味著你必須不斷學習才能跟得上大家的腳步,而要想成為一名優秀的程序員,更是需要通過正確的方法,設定正確的目標來進行不斷地學習。
作為一名常年在各種技術群里吹水卻又無比熱心腸的老司機,看到有人提問時,總是會蹦出來幫忙解決問題,因此,群里的很多小伙伴經常會找我詢問應該怎么樣學習一門技術,和大家也都非常親切了。
只要需要幫助的地方就會有我的身影,所以,為了幫助部分同學解決一些學習上的困惑,今天我就來分享和探討下我的一些學習經驗,大家如果有什么意見或建議,歡迎在評論中留言哈。
組件化
1.1 組件化初衷
- APP版本不斷的迭代,新功能的不斷增加,業務也會變的越來越復雜,維護成本高。
- 業務耦合度高,代碼越來越臃腫,團隊內部多人協作開發困難。
- Android項目在編譯代碼的時候電腦會非常卡,又因為單一工程下代碼耦合嚴重,每修改一處代碼后都要重新編譯打包測試,導致非常耗時。
- 方便單元測試,改動單獨一個業務模塊,不需要著重于關注其他模塊被影響。
1.2 什么是組件化
組件化就是將一個app分成多個Module,如下圖,每個Module都是一個組件(也可以是一個基礎庫供組件依賴),開發的過程中我們可以單獨調試部分組件,組件間不需要互相依賴,但可以相互調用,最終發布的時候所有組件以lib的形式被主app工程依賴并打包成一個apk。
1.3 組件化優勢
- 組件化就是將通用模塊獨立出來,統一管理,以提高復用,將頁面拆分為粒度更小的組件,組件內部除了包含UI實現,還包含數據層和邏輯層。
- 每個工程都可以獨立編譯、加快編譯速度,獨立打包。
- 每個工程內部的修改,不會影響其他工程。
- 業務庫工程可以快速拆分出來,集成到其他App中。
- 迭代頻繁的業務模塊采用組件方式,業務線研發可以互不干擾、提升協作效率,并控制產品質量,加強穩定性。
- 并行開發,團隊成員只關注自己的開發的小模塊,降低耦合性,后期維護方便等。
2 組件化通信
2.1 組件化通信
組件化互相不直接依賴,如果組件A想調用組件B的方法是不行的。很多開發者因為組件化之間通信比較復雜 則放棄了組件化的使用
組件通信有以下幾種方式:
####### 1.本地廣播
本地廣播,也就是LoacalBroadcastRecevier。更多是用在同一個應用內的不同系統規定的組件進行通信,好處在于:發送的廣播只會在自己的APP內傳播,不會泄漏給其他的APP,其他APP無法向自己的APP發送廣播,不用被其他APP干擾。本地廣播好比對講通信,成本低,效率高,但有個缺點就是兩者通信機制全部委托與系統負責,我們無法干預傳輸途中的任何步驟,不可控制,一般在組件化通信過程中采用比例不高。
2.進程間的AIDL
進程間的AIDL。這個粒度在于進程,而我們組件化通信過程往往是在線程中,況且AIDL通信也是屬于系統級通信,底層以Binder機制,雖說Android提供模板供我們實現,但往往使用者不好理解,交互比較復雜,往往也不適用應用于組件化通信過程中。
3.匿名的內存共享
匿名的內存共享。比如用Sharedpreferences,在處于多線程場景下,往往會線程不安全,這種更多是存儲一一些變化很少的信息,比如說組件里的配置信息等等
4.Intent Bundle傳遞
Intent Bundle傳遞。包括顯性和隱性傳遞,顯性傳遞需要明確包名路徑,組件與組件往往是需要互相依賴,這背離組件化中SOP(關注點分離原則),如果走隱性的話,不僅包名路徑不能重復,需要定義一套規則,只有一個包名路徑出錯,排查起來也稍顯麻煩,這個方式往往在組件間內部傳遞會比較合適,組件外與其他組件打交道則使用場景不多。
2.2 目前主流做法之一就是引入第三者,比如圖中的Base Module。
3 ARouter組件通信框架
3.1 ARouter 簡介
是ARouter是阿里巴巴開源的Android平臺中對頁面、服務提供路由功能的中間件,提倡的是簡單且夠用。主要用作組件化通信
Intent intent = new Intent(mContext, XxxActivity.class);intent.putExtra("key","value");startActivity(intent);Intent intent = new Intent(mContext, XxxActivity.class);intent.putExtra("key","value");startActivityForResult(intent, 666);上面一段代碼,在Android開發中,最常見也是最常用的功能就是頁面的跳轉,我們經常需要面對從瀏覽器或者其他App跳轉到自己App中頁面的需求,不過就算是簡簡單單的頁面跳轉,隨著時間的推移,也會遇到一些問題:
集中式的URL管理:談到集中式的管理,總是比較蛋疼,多人協同開發的時候,大家都去AndroidManifest.xml中定義各種IntentFilter,使用隱式Intent,最終發現AndroidManifest.xml中充斥著各種Schame,各種Path,需要經常解決Path重疊覆蓋、過多的Activity被導出,引發安全風險等問題
可配置性較差:Manifest限制于xml格式,書寫麻煩,配置復雜,可以自定義的東西也較少
跳轉過程中無法插手:直接通過Intent的方式跳轉,跳轉過程開發者無法干預,一些面向切面的事情難以實施,比方說登錄、埋點這種非常通用的邏輯,在每個子頁面中判斷又很不合理,畢竟activity已經實例化了
跨模塊無法顯式依賴:在App小有規模的時候,我們會對App做水平拆分,按照業務拆分成多個子模塊,之間完全解耦,通過打包流程控制App功能,這樣方便應對大團隊多人協作,互相邏輯不干擾,這時候只能依賴隱式Intent跳轉,書寫麻煩,成功與否難以控制。
為了解決以上問題,我們需要一款能夠解耦、簡單、功能多、定制性較強、支持攔截邏輯的路由組件:我們選擇了Alibaba的ARouter,偷個懶,直接貼ARouter的中文介紹文檔:
3.2 ARouter 優勢
從 ARouter Github 了解到它的優勢:
支持直接解析標準URL進行跳轉,并自動注入參數到目標頁面中 支持多模塊工程使用 支持添加多個攔截器,自定義攔截順序 支持依賴注入,可單獨作為依賴注入框架使用 支持InstantRun 支持MultiDex(Google方案) 映射關系按組分類、多級管理,按需初始化 支持用戶指定全局降級與局部降級策略 頁面、攔截器、服務等組件均自動注冊到框架 支持多種方式配置轉場動畫 支持獲取Fragment 完全支持Kotlin以及混編 典型的應用:
從外部URL映射到內部頁面,以及參數傳遞與解析 跨模塊頁面跳轉,模塊間解耦 攔截跳轉過程,處理登陸、埋點等邏輯
跨模塊API調用,通過控制反轉來做組件解耦
三、典型應用場景
總結
最后為了幫助大家深刻理解Android相關知識點的原理以及面試相關知識,這里放上相關的我搜集整理的14套騰訊、字節跳動、阿里、百度等2021面試真題解析,我把技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包知識脈絡 + 諸多細節。
網上學習 Android的資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術提升。希望這份系統化的技術體系對大家有一個方向參考。
的技術提升。希望這份系統化的技術體系對大家有一個方向參考。
[外鏈圖片轉存中…(img-AYNRCNAN-1621242753120)]
總結
以上是生活随笔為你收集整理的温故而知新!这篇文章可以满足你80%日常工作!面试真题解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阳痿早泄不孕不育腰疼
- 下一篇: 漫谈MySQL权限安全,威力加强版