【Interview】彙總

1、面向對象問題

封裝、繼承、多態
面向對象的目的,代碼的可重複性、可擴展性、可靠性。
理解java的三大特性之多態

2、UI相關

測量,佈局,繪製
View Measure -----onMeasure
View Layout------onLayout
View draw------onDraw

measure總結

1.View的measure方法是final類型的,子類不可以重寫,子類可以通過重寫onMeasure方法來測量自己的大小,當然也可以不重寫onMeasure方法使用系統默認測量大小。
2.View測量結束的標誌是調用了View類中的setMeasuredDimension成員方法,言外之意是,如果你需要在自定義的View中重寫onMeasure方法,在你測量結束之前你必須調用setMeasuredDimension方法測量纔有效。
3.在Activity生命週期onCreate和onResume方法中調用View.getWidth()和View.getMeasuredHeight()返回值爲0的,是因爲當前View的測量還沒有開始,這裏關係到Activity啓動過程,文章開頭說了當ActivityThread類中的performResumeActivity方法執行之後纔將DecorView添加到PhoneWindow窗口上,開始測量。在Activity生命週期onCreate在中performResumeActivity還爲執行,因此調用View.getMeasuredHeight()返回值爲0。
4.子視圖View的大小是由父容器View和子視圖View佈局

1.視圖View的佈局邏輯是由父View,也就是ViewGroup容器佈局來實現的。因此,我們如果自定義View一般都無需重寫onMeasure方法,但是如果自定義一個ViewGroup容器的話,就必須實現onLayout方法,因爲該方法在ViewGroup是抽象的,所有ViewGroup的所有子類必須實現onLayout方法。

2.當我們的視圖View在佈局中使用 android:visibility=”gone” 屬性時,是不佔據屏幕空間的,因爲在佈局時ViewGroup會遍歷每個子視圖View,判斷當前子視圖View是否設置了 Visibility==GONE,如果設置了,當前子視圖View就會添加到父容器上,因此也就不佔據屏幕空間。

3.必須在View佈局完之後調用getHeight()和getWidth()方法獲取到的View的寬高才大於0

layout佈局總結

1.視圖View的佈局邏輯是由父View,也就是ViewGroup容器佈局來實現的。因此,我們如果自定義View一般都無需重寫onMeasure方法,但是如果自定義一個ViewGroup容器的話,就必須實現onLayout方法,因爲該方法在ViewGroup是抽象的,所有ViewGroup的所有子類必須實現onLayout方法。

2.當我們的視圖View在佈局中使用 android:visibility=”gone” 屬性時,是不佔據屏幕空間的,因爲在佈局時ViewGroup會遍歷每個子視圖View,判斷當前子視圖View是否設置了 Visibility==GONE,如果設置了,當前子視圖View就會添加到父容器上,因此也就不佔據屏幕空間。

3.必須在View佈局完之後調用getHeight()和getWidth()方法獲取到的View的寬高才大於0

繪製Draw總結:

1.View繪製的畫布參數canvas是由surface對象獲得,言外之意,View視圖繪製最終會繪製到Surface對象去。

2.父類View繪製主要是繪製背景,邊框漸變效果,進度條,View具體的內容繪製調用了onDraw方法,通過該方法把View內容的繪製邏輯留給子類去實現。因此,我們在自定義View的時候都一般都需要重寫父類的onDraw方法來實現View內容繪製。

3.不管任何情況,每一個View視圖都會繪製 scrollBars滾動條,且繪製滾動條的邏輯是在父類View中實現,子類無需自己實現滾動條的繪製。

4.ViewGroup繪製的過程會對每個子視圖View設置佈局容器動畫效果,如果你在ViewGroup容器佈局裏面設置瞭如下屬性的話:

android:animateLayoutChanges="true"

簡單項目
動畫大全

3、四大組件及應用場景

Android四大組件(整理相關知識點)
Service的兩種啓動模式
Android 廣播Broadcast的兩種註冊方式靜態和動態

4、多線程

android 多線程 — 線程的面試題和答案

5、tcp/udp socket http基本通信協議

Android之B面試題⑤HTTPS和HTTP的區別
關於TCP,UDP,針對面試。超詳細
UDP和TCP的面試題
Retrofit分析-漂亮的解耦套路

6、框架原理

從架構角度看Retrofit的作用、原理和啓示
Retrofit源碼學習之動態代理
稍做總結:Retrofit使用的,就是動態代理,方法註解、建造者,工廠模式和適配器等成熟的技術或模式,retrofit內部通過動態代理的模式,講creat出來的包含接口信息的類傳入到代理中(Proxy)。然後利用InvocationHandler將傳入的接口信息根據需要拆解組合成serviceMethod類(ParameterHandler處理註解信息,callFactory處理網絡請求,CallAdapter處理適配器信息,Converter處理類的轉化),再轉換成OkHttpCall,使用okhttp進行網絡請求,返回的網絡請求之後,再由事先定義好的適配器轉換,得到接口定義的網絡對象,最後提供接口返回數據

Android常見圖片加載框架比較
Fresco圖片框架內部實現原理探索

7、進程間通信

https://www.cnblogs.com/lizhengxian/p/5075635.html

8、插件化開發和熱修復熱更新、增量更新

andfix、tinker、Sophix

9、handle原理、屏幕適配、jvm,gc,靜態內部類非靜態內部類,ui線程向子線程發送消息,事件分發,webview和js交互

10、性能優化、oom、內存分配

性能優化
性能優化:
1、卡頓:
佈局優化,減少層級,佈局服用,減少無用屬性避免過度繪製
啓動優化,分佈加載,異步加載,延期加載提高啓動速度
合理刷新機制,減少刷新次數和刷新區域
2、內存優化
場景:
資源性對象未關閉。比如Cursor、File文件等,往往都用了一些緩衝,在不使用時,應該及時關閉它們。
註冊對象未註銷。
類的靜態變量持有大數據對象
Handler臨時性內存泄漏
WebView。WebView 存在着內存泄漏的問題,在應用中只要使用一次 WebView,內存就不會被釋放掉。

優化內存空間:
對象引用。強引用、軟引用、弱引用、虛引用四種引用類型,根據業務需求合理使用不同,選擇不同的引用類型。
減少不必要的內存開銷。注意自動裝箱,增加內存複用,比如有效利用系統自帶的資源、視圖複用、對象池、Bitmap對象的複用。
使用最優的數據類型。比如針對數據類容器結構,可以使用ArrayMap數據結構,避免使用枚舉類型,使用緩存Lrucache等等。
圖片內存優化。可以設置位圖規格,根據採樣因子做壓縮,用一些圖片緩存方式對圖片進行管理等等。
3、穩定性優化(Crash 和 ANR)
提高代碼質量。比如開發期間的代碼審覈,看些代碼設計邏輯,業務合理性等。
代碼靜態掃描工具。常見工具有Android Lint、Findbugs、Checkstyle、PMD等等。
Crash監控。把一些崩潰的信息,異常信息及時地記錄下來,以便後續分析解決。
Crash上傳機制。在Crash後,儘量先保存日誌到本地,然後等下一次網絡正常時再上傳日誌信息。
4、耗電優化
計算優化,避開浮點運算等。
避免 WaleLock 使用不當。
使用 Job Scheduler。
5、安裝包大小優化
代碼混淆。使用proGuard 代碼混淆器工具,它包括壓縮、優化、混淆等功能。
資源優化。比如使用 Android Lint 刪除冗餘資源,資源文件最少化等。
圖片優化。比如利用 AAPT 工具對 PNG 格式的圖片做壓縮處理,降低圖片色彩位數等。
避免重複功能的庫,使用 WebP圖片格式等。
插件化。比如功能模塊放在服務器上,按需下載,可以減少安裝包大小。

音視頻及ndk開發

oppo

1、無限輪播收尾切換原理

2、視圖平移

3、sp的commit和apply

IntentService和Service

https://blog.csdn.net/u013738122/article/details/80557219

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章