日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

温故而知新!这篇文章可以满足你80%日常工作!面试真题解析

發(fā)布時(shí)間:2023/11/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 温故而知新!这篇文章可以满足你80%日常工作!面试真题解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

程序員這個(gè)行業(yè),日新月異,技術(shù)體系更新速度快,新技術(shù)新框架層出不窮,所有的技術(shù)都像是一個(gè)無(wú)底洞,當(dāng)你學(xué)得越多就會(huì)發(fā)現(xiàn)不懂的越多,不懂的越多,需要學(xué)習(xí)的就更多。

因此,一旦選擇了這個(gè)行業(yè),就意味著你必須不斷學(xué)習(xí)才能跟得上大家的腳步,而要想成為一名優(yōu)秀的程序員,更是需要通過(guò)正確的方法,設(shè)定正確的目標(biāo)來(lái)進(jìn)行不斷地學(xué)習(xí)。

作為一名常年在各種技術(shù)群里吹水卻又無(wú)比熱心腸的老司機(jī),看到有人提問(wèn)時(shí),總是會(huì)蹦出來(lái)幫忙解決問(wèn)題,因此,群里的很多小伙伴經(jīng)常會(huì)找我詢問(wèn)應(yīng)該怎么樣學(xué)習(xí)一門技術(shù),和大家也都非常親切了。

只要需要幫助的地方就會(huì)有我的身影,所以,為了幫助部分同學(xué)解決一些學(xué)習(xí)上的困惑,今天我就來(lái)分享和探討下我的一些學(xué)習(xí)經(jīng)驗(yàn),大家如果有什么意見(jiàn)或建議,歡迎在評(píng)論中留言哈。

組件化

1.1 組件化初衷

  • APP版本不斷的迭代,新功能的不斷增加,業(yè)務(wù)也會(huì)變的越來(lái)越復(fù)雜,維護(hù)成本高。
  • 業(yè)務(wù)耦合度高,代碼越來(lái)越臃腫,團(tuán)隊(duì)內(nèi)部多人協(xié)作開(kāi)發(fā)困難。
  • Android項(xiàng)目在編譯代碼的時(shí)候電腦會(huì)非常卡,又因?yàn)閱我还こ滔麓a耦合嚴(yán)重,每修改一處代碼后都要重新編譯打包測(cè)試,導(dǎo)致非常耗時(shí)。
  • 方便單元測(cè)試,改動(dòng)單獨(dú)一個(gè)業(yè)務(wù)模塊,不需要著重于關(guān)注其他模塊被影響。

1.2 什么是組件化

組件化就是將一個(gè)app分成多個(gè)Module,如下圖,每個(gè)Module都是一個(gè)組件(也可以是一個(gè)基礎(chǔ)庫(kù)供組件依賴),開(kāi)發(fā)的過(guò)程中我們可以單獨(dú)調(diào)試部分組件,組件間不需要互相依賴,但可以相互調(diào)用,最終發(fā)布的時(shí)候所有組件以lib的形式被主app工程依賴并打包成一個(gè)apk。

1.3 組件化優(yōu)勢(shì)

  • 組件化就是將通用模塊獨(dú)立出來(lái),統(tǒng)一管理,以提高復(fù)用,將頁(yè)面拆分為粒度更小的組件,組件內(nèi)部除了包含UI實(shí)現(xiàn),還包含數(shù)據(jù)層和邏輯層。
  • 每個(gè)工程都可以獨(dú)立編譯、加快編譯速度,獨(dú)立打包。
  • 每個(gè)工程內(nèi)部的修改,不會(huì)影響其他工程。
  • 業(yè)務(wù)庫(kù)工程可以快速拆分出來(lái),集成到其他App中。
  • 迭代頻繁的業(yè)務(wù)模塊采用組件方式,業(yè)務(wù)線研發(fā)可以互不干擾、提升協(xié)作效率,并控制產(chǎn)品質(zhì)量,加強(qiáng)穩(wěn)定性。
  • 并行開(kāi)發(fā),團(tuán)隊(duì)成員只關(guān)注自己的開(kāi)發(fā)的小模塊,降低耦合性,后期維護(hù)方便等。

2 組件化通信

2.1 組件化通信

組件化互相不直接依賴,如果組件A想調(diào)用組件B的方法是不行的。很多開(kāi)發(fā)者因?yàn)榻M件化之間通信比較復(fù)雜 則放棄了組件化的使用

組件通信有以下幾種方式:

####### 1.本地廣播

本地廣播,也就是LoacalBroadcastRecevier。更多是用在同一個(gè)應(yīng)用內(nèi)的不同系統(tǒng)規(guī)定的組件進(jìn)行通信,好處在于:發(fā)送的廣播只會(huì)在自己的APP內(nèi)傳播,不會(huì)泄漏給其他的APP,其他APP無(wú)法向自己的APP發(fā)送廣播,不用被其他APP干擾。本地廣播好比對(duì)講通信,成本低,效率高,但有個(gè)缺點(diǎn)就是兩者通信機(jī)制全部委托與系統(tǒng)負(fù)責(zé),我們無(wú)法干預(yù)傳輸途中的任何步驟,不可控制,一般在組件化通信過(guò)程中采用比例不高。

2.進(jìn)程間的AIDL

進(jìn)程間的AIDL。這個(gè)粒度在于進(jìn)程,而我們組件化通信過(guò)程往往是在線程中,況且AIDL通信也是屬于系統(tǒng)級(jí)通信,底層以Binder機(jī)制,雖說(shuō)Android提供模板供我們實(shí)現(xiàn),但往往使用者不好理解,交互比較復(fù)雜,往往也不適用應(yīng)用于組件化通信過(guò)程中。

3.匿名的內(nèi)存共享

匿名的內(nèi)存共享。比如用Sharedpreferences,在處于多線程場(chǎng)景下,往往會(huì)線程不安全,這種更多是存儲(chǔ)一一些變化很少的信息,比如說(shuō)組件里的配置信息等等

4.Intent Bundle傳遞

Intent Bundle傳遞。包括顯性和隱性傳遞,顯性傳遞需要明確包名路徑,組件與組件往往是需要互相依賴,這背離組件化中SOP(關(guān)注點(diǎn)分離原則),如果走隱性的話,不僅包名路徑不能重復(fù),需要定義一套規(guī)則,只有一個(gè)包名路徑出錯(cuò),排查起來(lái)也稍顯麻煩,這個(gè)方式往往在組件間內(nèi)部傳遞會(huì)比較合適,組件外與其他組件打交道則使用場(chǎng)景不多。

2.2 目前主流做法之一就是引入第三者,比如圖中的Base Module。

3 ARouter組件通信框架

3.1 ARouter 簡(jiǎn)介

是ARouter是阿里巴巴開(kāi)源的Android平臺(tái)中對(duì)頁(yè)面、服務(wù)提供路由功能的中間件,提倡的是簡(jiǎn)單且夠用。主要用作組件化通信

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開(kāi)發(fā)中,最常見(jiàn)也是最常用的功能就是頁(yè)面的跳轉(zhuǎn),我們經(jīng)常需要面對(duì)從瀏覽器或者其他App跳轉(zhuǎn)到自己App中頁(yè)面的需求,不過(guò)就算是簡(jiǎn)簡(jiǎn)單單的頁(yè)面跳轉(zhuǎn),隨著時(shí)間的推移,也會(huì)遇到一些問(wèn)題:

  • 集中式的URL管理:談到集中式的管理,總是比較蛋疼,多人協(xié)同開(kāi)發(fā)的時(shí)候,大家都去AndroidManifest.xml中定義各種IntentFilter,使用隱式Intent,最終發(fā)現(xiàn)AndroidManifest.xml中充斥著各種Schame,各種Path,需要經(jīng)常解決Path重疊覆蓋、過(guò)多的Activity被導(dǎo)出,引發(fā)安全風(fēng)險(xiǎn)等問(wèn)題

  • 可配置性較差:Manifest限制于xml格式,書寫麻煩,配置復(fù)雜,可以自定義的東西也較少

  • 跳轉(zhuǎn)過(guò)程中無(wú)法插手:直接通過(guò)Intent的方式跳轉(zhuǎn),跳轉(zhuǎn)過(guò)程開(kāi)發(fā)者無(wú)法干預(yù),一些面向切面的事情難以實(shí)施,比方說(shuō)登錄、埋點(diǎn)這種非常通用的邏輯,在每個(gè)子頁(yè)面中判斷又很不合理,畢竟activity已經(jīng)實(shí)例化了

  • 跨模塊無(wú)法顯式依賴:在App小有規(guī)模的時(shí)候,我們會(huì)對(duì)App做水平拆分,按照業(yè)務(wù)拆分成多個(gè)子模塊,之間完全解耦,通過(guò)打包流程控制App功能,這樣方便應(yīng)對(duì)大團(tuán)隊(duì)多人協(xié)作,互相邏輯不干擾,這時(shí)候只能依賴隱式Intent跳轉(zhuǎn),書寫麻煩,成功與否難以控制。

  • 為了解決以上問(wèn)題,我們需要一款能夠解耦、簡(jiǎn)單、功能多、定制性較強(qiáng)、支持?jǐn)r截邏輯的路由組件:我們選擇了Alibaba的ARouter,偷個(gè)懶,直接貼ARouter的中文介紹文檔:

    3.2 ARouter 優(yōu)勢(shì)

    從 ARouter Github 了解到它的優(yōu)勢(shì):

    支持直接解析標(biāo)準(zhǔn)URL進(jìn)行跳轉(zhuǎn),并自動(dòng)注入?yún)?shù)到目標(biāo)頁(yè)面中 支持多模塊工程使用 支持添加多個(gè)攔截器,自定義攔截順序 支持依賴注入,可單獨(dú)作為依賴注入框架使用 支持InstantRun 支持MultiDex(Google方案) 映射關(guān)系按組分類、多級(jí)管理,按需初始化 支持用戶指定全局降級(jí)與局部降級(jí)策略 頁(yè)面、攔截器、服務(wù)等組件均自動(dòng)注冊(cè)到框架 支持多種方式配置轉(zhuǎn)場(chǎng)動(dòng)畫 支持獲取Fragment 完全支持Kotlin以及混編 典型的應(yīng)用:

    從外部URL映射到內(nèi)部頁(yè)面,以及參數(shù)傳遞與解析 跨模塊頁(yè)面跳轉(zhuǎn),模塊間解耦 攔截跳轉(zhuǎn)過(guò)程,處理登陸、埋點(diǎn)等邏輯

    跨模塊API調(diào)用,通過(guò)控制反轉(zhuǎn)來(lái)做組件解耦

    三、典型應(yīng)用場(chǎng)景

  • 從外部URL映射到內(nèi)部頁(yè)面,以及參數(shù)傳遞與解析
  • 跨模塊頁(yè)面跳轉(zhuǎn),模塊間解耦
  • 攔截跳轉(zhuǎn)過(guò)程,處理登陸、埋點(diǎn)等邏輯
  • 跨模塊API調(diào)用,模塊間解耦(注冊(cè)ARouter服務(wù)的形式,通過(guò)接口互相調(diào)用)
  • 總結(jié)

    最后為了幫助大家深刻理解Android相關(guān)知識(shí)點(diǎn)的原理以及面試相關(guān)知識(shí),這里放上相關(guān)的我搜集整理的14套騰訊、字節(jié)跳動(dòng)、阿里、百度等2021面試真題解析,我把技術(shù)點(diǎn)整理成了視頻和PDF(實(shí)際上比預(yù)期多花了不少精力),包知識(shí)脈絡(luò) + 諸多細(xì)節(jié)。



    網(wǎng)上學(xué)習(xí) Android的資料一大堆,但如果學(xué)到的知識(shí)不成體系,遇到問(wèn)題時(shí)只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。希望這份系統(tǒng)化的技術(shù)體系對(duì)大家有一個(gè)方向參考。

    的技術(shù)提升。希望這份系統(tǒng)化的技術(shù)體系對(duì)大家有一個(gè)方向參考。

    [外鏈圖片轉(zhuǎn)存中…(img-AYNRCNAN-1621242753120)]

    總結(jié)

    以上是生活随笔為你收集整理的温故而知新!这篇文章可以满足你80%日常工作!面试真题解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。