https://blog.csdn.net/huangqili1314/article/details/72792682
基礎(chǔ)知識(shí) – 四大組件(生命周期茸时,使用場景,如何啟動(dòng))
- 啟動(dòng)模式
1.Standard
image.png
2.SingleTop 棧頂復(fù)用模式
說明:分兩種處理情況:須要?jiǎng)?chuàng)建的Activity已經(jīng)處于棧頂時(shí),此時(shí)會(huì)直接復(fù)用棧頂?shù)腁ctivity。不會(huì)再創(chuàng)建新的Activity;若須要?jiǎng)?chuàng)建的Activity不處于棧頂砰左,此時(shí)會(huì)又一次創(chuàng)建一個(gè)新的Activity入棧,同Standard模式一樣场航。
生命周期:若情況一中棧頂?shù)腁ctivity被直接復(fù)用時(shí)缠导,它的onCreate、onStart不會(huì)被系統(tǒng)調(diào)用溉痢,由于它并沒有發(fā)生改變僻造。可是一個(gè)新的方法onNewIntent會(huì)被回調(diào)(Activity被正常創(chuàng)建時(shí)不會(huì)回調(diào)此方法)孩饼。
image.png
3. SingleTask 棧內(nèi)復(fù)用模式
說明:若須要?jiǎng)?chuàng)建的Activity已經(jīng)處于棧中時(shí)髓削,此時(shí)不會(huì)創(chuàng)建新的Activity,而是將存在棧中的Activity上面的其他Activity所有銷毀镀娶,使它成為棧頂立膛。
生命周期:同SingleTop 模式中的情況一同樣。僅僅會(huì)又一次回調(diào)Activity中的 onNewIntent方法
image.png
4. SingleInstance 單實(shí)例模式
說明: SingleInstance比較特殊梯码,是全局單例模式宝泵,是一種加強(qiáng)的SingleTask模式。它除了具有它所有特性外轩娶,還加強(qiáng)了一點(diǎn):具有此模式的Activity僅僅能單獨(dú)位于一個(gè)任務(wù)棧中儿奶。
java基礎(chǔ) – 數(shù)據(jù)結(jié)構(gòu),基本數(shù)據(jù)類型
一鳄抒、Java常用數(shù)據(jù)結(jié)構(gòu):
- ArrayList:元素單個(gè)闯捎,效率高,多用于查詢许溅;
2.Vector:元素單個(gè)瓤鼻,線程安全,多用于查詢闹司;
3.LinkedList:元素單個(gè)娱仔,多用于插入和刪除沐飘;
4.HashMap:元素成對游桩,非同步的牲迫,并且允許null,即null value和null key借卧; - HashTable:元素成對盹憎,線程安全,元素不可為空铐刘;
** 二陪每、Vector、ArrayList和LinkedList**
大多數(shù)情況下镰吵,從性能上來說ArrayList最好檩禾,但是當(dāng)集合內(nèi)的元素需要頻繁插入、刪除時(shí)LinkedList會(huì)有比較好的表現(xiàn)疤祭,此外LinkedList提供額外的get盼产,remove,insert方法在LinkedList的首部或尾部勺馆,但是它們?nèi)齻€(gè)性能都比不上數(shù)組戏售,另外只有Vector是線程同步的,所以:
如果能用數(shù)組的時(shí)候(元素類型固定草穆,數(shù)組長度固定)灌灾,請盡量使用數(shù)組來代替List;
如果沒有頻繁的刪除插入操作悲柱,又不用考慮多線程問題锋喜,優(yōu)先選擇ArrayList;
如果在多線程條件下使用诗祸,可以考慮Vector跑芳;
如果需要頻繁地刪除插入,LinkedList就有了用武之地直颅;
如果你什么都不知道博个,用ArrayList沒錯(cuò)。
三功偿、基本數(shù)據(jù)類型
1盆佣、內(nèi)置八種數(shù)據(jù)類型(六種數(shù)字類型(四個(gè)整數(shù)型,兩個(gè)浮點(diǎn)型)械荷,一種字符類型共耍,還有一種布爾型):
byte:Java中最小的數(shù)據(jù)類型,在內(nèi)存中占8位(bit)吨瞎,即1個(gè)字節(jié)痹兜,取值范圍-128~127,默認(rèn)值0颤诀;
short:短整型字旭,在內(nèi)存中占16位对湃,即2個(gè)字節(jié),取值范圍-32768~32767遗淳,默認(rèn)值0拍柒;
int:整型,用于存儲(chǔ)整數(shù)屈暗,在內(nèi)在中占32位拆讯,即4個(gè)字節(jié),取值范圍-2147483648~2147483647养叛,默認(rèn)值0种呐;
long:長整型,在內(nèi)存中占64位弃甥,即8個(gè)字節(jié)-263~263-1陕贮,默認(rèn)值0L;
float:浮點(diǎn)型潘飘,在內(nèi)存中占32位肮之,即4個(gè)字節(jié),用于存儲(chǔ)帶小數(shù)點(diǎn)的數(shù)字(與double的區(qū)別在于float類型有效小數(shù)點(diǎn)只有6~7位)卜录,默認(rèn)值0戈擒;
double:雙精度浮點(diǎn)型,用于存儲(chǔ)帶有小數(shù)點(diǎn)的數(shù)字艰毒,在內(nèi)存中占64位筐高,即8個(gè)字節(jié),默認(rèn)值0丑瞧;
char:字符型柑土,用于存儲(chǔ)單個(gè)字符,占16位绊汹,即2個(gè)字節(jié)稽屏,取值范圍0~65535,默認(rèn)值為空西乖;
boolean:布爾類型狐榔,占1個(gè)字節(jié),用于判斷真或假(僅有兩個(gè)值获雕,即true薄腻、false),默認(rèn)值false届案;
2庵楷、引用數(shù)據(jù)類型:
類、接口類型、數(shù)組類型尽纽、枚舉類型昆婿、注解類型。
區(qū)別:
基本數(shù)據(jù)類型在被創(chuàng)建時(shí)蜓斧,在棧上給其劃分一塊內(nèi)存,將數(shù)值直接存儲(chǔ)在棧上睁冬。
引用數(shù)據(jù)類型在被創(chuàng)建時(shí)挎春,首先要在棧上給其引用(句柄)分配一塊內(nèi)存,而對象的具體信息都存儲(chǔ)在堆內(nèi)存上豆拨,然后由棧上面的引用指向堆中對象的地址直奋。
通信 – 網(wǎng)絡(luò)連接(HttpClient,HttpUrlConnetion)施禾,Socket
數(shù)據(jù)持久化 – SQLite脚线,SharedPreferences,ContentProvider
安全 – 數(shù)據(jù)加密弥搞,代碼混淆邮绿,WebView/Js調(diào)用,https
UI– 動(dòng)畫
其他 – JNI攀例,AIDL船逮,Handler,Intent等
RxJava2+Retrofit2+OkHttp3
Retrofit:Retrofit是Square公司開發(fā)的一款針對Android 網(wǎng)絡(luò)請求的框架(底層默認(rèn)是基于OkHttp 實(shí)現(xiàn))粤铭。請求的數(shù)據(jù)和請求的結(jié)果挖胃,使用接口的方式呈現(xiàn)。
OkHttp:也是Square公司的一款開源的網(wǎng)絡(luò)請求庫梆惯。負(fù)責(zé)請求的過程酱鸭。通過OkHttpClient 可以配置很多東西,比如 鏈接超時(shí)時(shí)間垛吗,緩存凹髓,攔截器等。
RxJava:
a. 負(fù)責(zé)異步怯屉,各種線程之間的切換扁誓,使異步操作變得非常簡單。
b. 加入RxJava后網(wǎng)絡(luò)請求返回不再是一個(gè)call,二十一個(gè)Observable蚀之。
c. 在Activity或Fragment中傳入Subscriber 建立訂閱關(guān)系蝗敢,就可以在onNext中處理結(jié)果了。
d. RxJava 的好處是幫我處理 線程之間的切換足删,我們可以在指定 訂閱的在哪個(gè)線程寿谴,觀察在哪個(gè)線程。
e. 可以 通過操作符 進(jìn)行數(shù)據(jù)變換失受。
f . 整個(gè)過程都是鏈?zhǔn)降难忍喕壿嬘缴F渲蠪latMap 操作符 還可以解除多層嵌套的問題。
性能優(yōu)化
性能分析工具
leakcanary blockcanary ddms traceview layout Inspector Analyze Inspect code
響應(yīng)時(shí)間優(yōu)化
1.使用優(yōu)秀的網(wǎng)絡(luò)請求框架庫和數(shù)據(jù)解析框架痪署,如retrofit码泞、okhttp、Gson等;
2.數(shù)據(jù)緩存推薦使用三級(jí)緩存狼犯,內(nèi)存緩存+本地緩存+網(wǎng)絡(luò)請求緩存余寥;圖片有三級(jí)緩存,文件悯森、 java內(nèi)存 和 native 內(nèi)存宋舷,特別針對 5.0以下系統(tǒng)可以用到 native 內(nèi)存緩存,因?yàn)榭梢詼p少 gc 調(diào)用瓢姻。
界面卡頓優(yōu)化
1.避免UI主線程做耗時(shí)操作祝蝠,耗時(shí)操作交給子線程完成,使用handler更新UI.
2.優(yōu)化布局層級(jí)幻碱,避免過多無用嵌(如使用ConstraintLayout約束布局绎狭,扁平式的布局方式,無任何嵌套褥傍,減少布局的層級(jí)坟岔,優(yōu)化渲染性能),Android通知界面渲染和重繪的時(shí)間要在16ms內(nèi)完成摔桦,超出這個(gè)時(shí)間會(huì)導(dǎo)致丟幀社付。可以使用Hierarchy View進(jìn)行層級(jí)分析邻耕。
內(nèi)存優(yōu)化
創(chuàng)建新的對象都需要額外的內(nèi)存空間鸥咖,盡量要減少創(chuàng)建對象。
將類兄世,變量啼辣,方法等的權(quán)限修改為最小。
針對字符串的拼接御滩,盡量使用StringBuffer替代String等鸥拧。
不要在循環(huán)當(dāng)中申明臨時(shí)變量,不要在循環(huán)中捕獲異常削解。
使用集合對象富弦,如果事先知道其大小,則可以在構(gòu)造方法中設(shè)置初始大小氛驮。
文件讀取操作需要使用緩存類腕柜,及時(shí)關(guān)閉文件多艇。
如果程序會(huì)頻繁創(chuàng)建線程早处,則可以考慮使用線程池。
Recyclerview
一種插拔式的體驗(yàn)贿肩,高度的解耦亏栈,異常的靈活架構(gòu)
- LayoutManager 控制顯示方式:
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
1.LinearLayoutManager線性管理器蔼卡,支持橫向筷屡,縱向布局菠红;
2.GridLayoutManager網(wǎng)格布局管理器;
3.StaggeredGridLayoutManager瀑布流式布局管理器潭流;
- ItemDecoration控制Item間間隔竞惋,可以通過該方法添加分割線:
mRecyclerView.addItemDecoration()
該方法的參數(shù)為RecyclerView.ItemDecoration,該類為抽象類
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,
DividerItemDecoration.VERTICAL_LIST));
- ItemAnimator控制Item增刪動(dòng)畫幻枉;
- 但點(diǎn)擊事件,長按事件需要自己寫诡蜓;
常用設(shè)計(jì)模式
單例模式
創(chuàng)建步驟:
a.將構(gòu)造函數(shù)私有化熬甫,構(gòu)造函數(shù)可避免其他程序創(chuàng)建該類對象。
b.在本類中創(chuàng)建一個(gè)私有的該類對象蔓罚。
c.對外提供一個(gè)公共訪問方式椿肩,為了方便其他程序訪問到該類對象。
創(chuàng)建方式:
1.餓漢式:類一加載就創(chuàng)建對象
class Student{
private Student(){}
private static final Student s = new Student();
public static Student getInstance(){
return s;
}
}
2.懶漢式:使用時(shí)才創(chuàng)建該對象
class Student{
private Student(){}
private static final Student s = null;
public static Student getInstance(){
if(null==s) {
//線程1就進(jìn)來了豺谈,線程2就進(jìn)來了郑象。
s = new Student();
}
return s;
}
}
3.餓漢式和飽漢式的區(qū)別:
餓漢式是類一加載進(jìn)內(nèi)存就創(chuàng)建好了對象;而懶漢式則是類加載進(jìn)內(nèi)存的時(shí)候茬末,對象還沒有存在厂榛,要使用該對象的時(shí)候再new出來;
懶漢式是延遲加載,如果多個(gè)線程同時(shí)操作懶漢式時(shí)就有可能出現(xiàn)線程安全問題;
為解決懶漢式的線程安全問題丽惭,解決線程安全問題可以加同步來解決击奶。
但是加了同步之后,每一次都要比較鎖责掏,效率就變慢了柜砾,可以通過雙重判斷來提高程序效率。
注:開發(fā)常用餓漢式换衬,因?yàn)轲I漢式簡單安全痰驱。懶漢式多線程的時(shí)候容易發(fā)生問題
Picasso,Glide瞳浦,F(xiàn)resco對比分析
Picasso不支持gif,
Glide,Fresco支持gif,
優(yōu)點(diǎn)
Glide
*緩存機(jī)制
- 多種圖片格式的緩存担映,適用于更多的內(nèi)容表現(xiàn)形式(如Gif、WebP叫潦、縮略圖另萤、Video)
- 生命周期集成(根據(jù)Activity或者Fragment的生命周期管理圖片加載請求)
- 高效處理Bitmap(bitmap的復(fù)用和主動(dòng)回收,減少系統(tǒng)回收壓力)
- 高效的緩存策略,靈活(Picasso只會(huì)緩存原始尺寸的圖片四敞,Glide緩存的是多種規(guī)格)泛源,加載速度快且內(nèi)存開銷小(默認(rèn)Bitmap格式的不同忿危,使得內(nèi)存開銷是Picasso的一半)
Fresco
- 最大的優(yōu)勢在于5.0以下(最低2.3)的bitmap加載达箍。在5.0以下系統(tǒng),F(xiàn)resco將圖片放到一個(gè)特別的內(nèi)存區(qū)域(Ashmem區(qū))
- 大大減少OOM(在更底層的Native層對OOM進(jìn)行處理铺厨,圖片將不再占用App的內(nèi)存)
- 適用于需要高性能加載大量圖片的場景
結(jié)論
- Fresco功能強(qiáng)大缎玫,但是對象Glide要復(fù)雜,而且需要自己的SimpleDraweeView,這一點(diǎn)在切換框架的時(shí)候不方便解滓。而且Glide直接緩存ImageView相對大小的圖片赃磨,節(jié)省空間的同時(shí)下場如果是同樣大小的圖片就不要再次請求,直接可以使用洼裤。
- Fresco雖然很強(qiáng)大邻辉,但是包很大,依賴很多腮鞍,使用復(fù)雜值骇,而且還要在布局使用SimpleDraweeView控件加載圖片。相對而言Glide會(huì)輕好多移国,上手快吱瘩,使用簡單,配置方便迹缀,而且從加載速度和性能方面不相上下使碾。對于一般的APP來說Glide是一個(gè)不錯(cuò)的選擇,如果是專業(yè)的圖片APP那么Fresco還是必要的祝懂。
Hybrid App中實(shí)現(xiàn)的主要技術(shù)native組件與js的數(shù)據(jù)交互的理解以及實(shí)現(xiàn)
Android WebviewJavaScriptBridge
https://blog.csdn.net/alwaysgoalong/article/details/77837405
Gradle 多渠道打包
事件分發(fā)
https://blog.csdn.net/guolin_blog/article/details/9097463