?1.Activity生命周期??
??問題??:描述Activity從啟動到銷毀的完整生命周期方法,并說明
onSaveInstanceState()
的調用時機。??參考答案??:
onCreate()
→?onStart()
→?onResume()
(活躍狀態) →?onPause()
(失去焦點) →?onStop()
(完全不可見) →?onDestroy()
。onSaveInstanceState()
:在Activity可能被銷毀前調用(如屏幕旋轉),用于保存臨時數據到Bundle。
??考察點??:生命周期順序、狀態恢復、資源釋放時機。
??2.Fragment通信方式??
??問題??:列舉3種Fragment間通信方式,并對比優缺點。
??參考答案??:
??ViewModel共享??:通過同一Activity作用域的ViewModel共享數據(推薦,解耦性強)。
??Fragment Result API??:使用
setFragmentResult()
傳遞Bundle(無需直接引用)。??接口回調??:Fragment定義接口,Activity實現并轉發(代碼冗余,適合簡單場景)。
??3.View繪制流程??
??問題??:解釋View的
onMeasure()
,?onLayout()
,?onDraw()
的作用,并說明如何優化自定義View的性能。??參考答案??:
onMeasure()
:計算View尺寸(需處理MeasureSpec
模式)。onLayout()
:確定子View位置。onDraw()
:繪制內容(避免在此創建對象或耗時操作)。??優化??:使用
ViewStub
延遲加載、減少布局層級、啟用硬件加速。
4.??事件分發機制?
5.??Handler機制??
6.解釋下多線程編程
6.??內存泄漏場景與解決??
??問題??:列舉3個常見內存泄漏場景(如靜態Context),并提供解決方案。
??參考答案??:
靜態Context → 改用
ApplicationContext
或弱引用。未注銷廣播 → 在
onDestroy()
中調用unregisterReceiver()
。匿名內部類持有外部引用 → 靜態內部類 + 弱引用。
??7冷啟動優化??
??問題??:應用冷啟動耗時超過1秒,如何定位和優化?
??參考答案??:
??定位工具??:Android Studio Profiler的啟動時間分析。
??優化方案??:
延遲初始化第三方庫(使用
App Startup
)。減少主線程任務(用線程池處理IO操作)。
使用SplashScreen API避免白屏。
8.??MVVM與MVI對比??
??問題??:解釋MVVM和MVI架構的區別,并說明MVI如何解決狀態管理問題。
??參考答案??:
??MVVM??:數據驅動UI(LiveData + ViewModel),但狀態分散。
??MVI??:單向數據流(ViewState → 事件 → 更新狀態),狀態集中管理(如用Kotlin Flow實現)。
??模塊化方案??
??問題??:如何將單模塊App拆分為模塊化架構?需考慮哪些問題?
??參考答案??:
??步驟??:按功能劃分模塊(登錄、支付等),基礎庫抽離為獨立Module。
??關鍵點??:
依賴注入解耦(使用Hilt)。
路由框架(如ARouter)解決跨模塊跳轉。
Gradle配置按需編譯。
9.??Binder機制??
??問題??:解釋Binder在IPC中的一次拷貝原理,并說明其與Socket通信的性能差異。
??參考答案??:
??原理??:通過
mmap
內存映射共享內核空間,減少數據拷貝次數。??性能??:Binder傳輸速度比Socket快3倍,適合高頻調用(如系統服務)。
??10.Compose優勢??
??問題??:對比Compose與XML布局的渲染性能差異,并說明聲明式UI的核心思想。
??參考答案??:
??性能??:Compose跳過冗余measure/layout階段,減少嵌套層級。
??聲明式??:UI = f(State)(狀態變化自動觸發重組,無需手動更新View)。
10.進程間通信(IPC)
11.ANR產生原因??
??主線程耗時操作??
??I/O阻塞??:主線程執行文件讀寫、數據庫操作或網絡請求(Android 4.0+主線程網絡請求直接拋異常)。
??復雜計算??:大數據處理、圖像渲染等占用CPU時間過長。
??鎖競爭??:主線程等待子線程釋放鎖(如死鎖或同步鎖阻塞)。
??組件超時??
??BroadcastReceiver??:
onReceive()
未在限定時間內完成(前臺10秒/后臺60秒)。??Service??:生命周期方法(如
onCreate()
)超時(前臺20秒/后臺200秒)。??Input事件??:按鍵或觸摸事件5秒內未響應。
??系統資源瓶頸??
??內存不足??:頻繁GC或內存泄漏拖慢主線程。
??CPU搶占??:高負載時主線程無法獲取CPU資源。
??Binder調用阻塞??:跨進程通信超時或系統服務響應延遲
?12.ANR產生原因?解決方案與優化策略??
??異步處理耗時任務??
??組件優化??
??BroadcastReceiver??:使用
goAsync()
+ 子線程處理耗時邏輯??Service??:改用``或
JobIntentService
異步執行任務。
??資源與鎖管理??
??減少鎖競爭??:避免嵌套鎖,使用
ReentrantLock
替代synchronized
。??數據庫優化??:批量操作使用事務,減少磁盤I/O
??UI與內存優化??
??布局扁平化??:用
ConstraintLayout
減少層級,避免過度繪制。??內存緩存??:
LruCache
緩存圖片等資源,減少重復加載
13.OOM產生的主要原因??
??內存泄漏(核心原因)??
??靜態引用持有短生命周期對象??:靜態變量(如單例)持有
Activity
或View
的強引用,導致其無法被回收。??未注銷監聽器/廣播??:如未在
onDestroy()
中調用unregisterReceiver()
或移除Handler
消息。??資源未關閉??:
Cursor
、InputStream
、Bitmap
未調用recycle()
或關閉流。
??大對象分配與資源處理不當??
??Bitmap加載過大??:高分辨率圖片未經壓縮直接加載,占用內存遠超控件顯示需求。
??緩存策略不合理??:
LruCache
或內存緩存設置過大,或未及時清理失效數據。
??頻繁創建對象與內存碎片??
??臨時對象泛濫??:循環中頻繁創建對象(如字符串拼接),引發頻繁GC導致卡頓甚至OOM。
??棧內存溢出??:深度遞歸或局部變量過多導致棧空間耗盡(默認線程棧僅1MB左右)。
??系統限制與進程模型??
??內存配額限制??:每個應用進程有固定上限(中低端設備32-64MB,高端設備192MB+),可通過
ActivityManager.getMemoryClass()
獲取。??Native內存與Java堆分離??:Bitmap通過Native分配內存,占用C層空間,但受總進程內存限制
14.OOM解決辦法
根治內存泄漏??
??場景?? | ??解決方案?? |
---|---|
靜態引用Activity | 改用 |
Handler/Runnable泄漏 | 使用靜態內部類 +? |
單例模式 | 初始化時傳入 |
資源未關閉 | 在 |
2. Bitmap優化(核心場景)
??采樣壓縮??:通過BitmapFactory.Options.inSampleSize
按需縮放圖片
編碼格式優化??:使用
Bitmap.Config.RGB_565
(占內存為ARGB_8888
的一半)??及時回收??:非顯示狀態的Bitmap主動調用
recycle()
并置null
。??三級緩存策略??:內存緩存(
LruCache
) + 磁盤緩存(DiskLruCache
) + 網絡加載,避免重復解碼
?內存管理與編碼規范??
??對象復用??:
ListView/RecyclerView
使用ViewHolder
+convertView
復用視圖。避免在
onDraw()
等高頻方法中創建對象,減少內存抖動。
??數據結構優化??:
遞歸算法改迭代,避免棧溢出。
大對象分塊加載(如分頁讀取文件)。
??引用類型選擇??:
緩存使用
WeakHashMap
或SoftReference
,允許GC在內存緊張時回收對象
15. Android 測量一個imageview的大小,在什么生命周期能測量到?
在?Activity
的?onCreate()
、onStart()
或?onResume()
中直接調用?imageView.getWidth()
或?imageView.getHeight()
??通常返回 0??,原因如下:
??視圖未完成布局??:此時視圖樹僅完成初始化,但尚未經過測量(Measure)和布局(Layout)階段。
??布局流程未結束??:Android 的視圖布局分為三個階段:
??Measure??:計算視圖大小(
onMeasure()
)。??Layout??:確定視圖位置(
onLayout()
)。??Draw??:繪制視圖內容(
onDraw()
)。只有完成 ??Layout 階段??后,尺寸才被確定
可獲取尺寸的生命周期及方法????
onWindowFocusChanged()
:窗口焦點變化時,當 Activity窗口獲得焦點(用戶可見且可交互)時,視圖已完成布局,此時可直接獲取尺寸
16.Android jectpack有哪些組件,有哪些作用?
??一、Jetpack 的定義與價值??
??定位??:Jetpack 是 Google 推出的??標準化開發組件集合??,旨在解決四大痛點:
? ??加速開發??:減少樣板代碼(如數據庫操作、生命周期處理)
? ??兼容性保障??:自動適配不同 Android 版本(如?
AppCompat
實現 Material Design 兼容)? ??架構規范??:強制推行 MVVM 等現代化架構,提升可維護性
? ??性能優化??:通過生命周期感知機制避免內存泄漏
💡 ??面試點睛??:可類比為“Android 開發的瑞士軍刀”,整合了 iOS 的 CocoaPods + UIKit 功能
。
📦 ??二、核心組件分類與作用??
?? ??1. 架構組件(Architecture)??
組件 | 核心作用 | 典型場景舉例 |
---|---|---|
??ViewModel?? | 管理 UI 相關數據,??獨立于 Activity/Fragment 生命周期??(屏幕旋轉不丟失數據) | 保存頁面狀態(如用戶輸入表單) |
??LiveData?? | 生命周期感知的??數據觀察者??,自動更新 UI 并避免內存泄漏 | 實時展示數據庫查詢結果 |
??Room?? | SQLite 的 ORM 抽象層,??編譯時校驗 SQL 語句?? | 本地緩存用戶數據( |
??Navigation?? | 管理 Fragment 導航棧,??可視化配置頁面跳轉關系?? | 實現單 Activity 多 Fragment 架構 |
??WorkManager?? | ??可靠的后臺任務調度??(支持設備重啟后繼續執行) | 定期同步服務器數據 |
🎨 ??2. UI 組件??
組件 | 核心作用 |
---|---|
??Compose?? | 聲明式 UI 工具包(未來趨勢),??實時預覽??布局 |
??RecyclerView?? | 高效加載大數據集列表(支持差異化更新) |
??ConstraintLayout?? | 扁平化布局減少嵌套,優化渲染性能 |
??Paging?? | 分頁加載大數據集(如聊天記錄、商品列表) |
?? ??3. 行為組件(Behavior)??
組件 | 核心作用 |
---|---|
??CameraX?? | 標準化相機開發(兼容不同設備) |
??DownloadManager?? | 系統級文件下載管理(斷點續傳、通知欄進度) |
??Permissions?? | 簡化運行時權限請求流程 |
🧱 ??4. 基礎組件(Foundation)??
組件 | 核心作用 |
---|---|
??AppCompat?? | 向后兼容 Material Design 控件 |
??Android KTX?? | Kotlin 擴展函數庫(如簡化? |
??DataStore?? | 替代? |
?? ??三、Jetpack 與傳統開發對比??
維度 | 傳統開發 | Jetpack 開發 |
---|---|---|
??代碼量?? | 高(需手動處理生命周期) | 減少 30%-50% 樣板代碼 1 |
??內存泄漏風險?? | 高(需謹慎管理引用) | 低(LiveData/ViewModel 自動清理) |
??測試便利性?? | 需大量 Mock 環境 | 內置? |
17.Android 動畫講一下
回答:幀動畫、補間動畫(也稱為視圖動畫或Tween動畫)和屬性動畫
幀動畫原理??:
通過順序播放一組靜態圖片(每張圖片為一幀)形成動態效果,類似傳統幻燈片或電影播放
缺點??:
??內存占用高??:大量或大尺寸圖片易引發OOM(Out of Memory)。
??靈活性低
補間動畫
??原理??:
通過定義動畫的??起始狀態??和??結束狀態??,系統自動計算中間幀(如平移、縮放、旋轉、透明度變化)。??僅改變View的顯示效果,不改變實際屬性??(例如平移后點擊事件仍在原位置)。
??類型與實現??:
??四種基本類型??:
AlphaAnimation
(透明度)RotateAnimation
(旋轉)ScaleAnimation
(縮放)TranslateAnimation
(位移)
屬性動畫(Property Animation)??
??原理??:
??動態修改對象的屬性值??(如View的坐標、透明度),真實改變屬性,支持任意對象(不限于View)。
??核心類??:
ValueAnimator
:計算屬性值變化,通過監聽器更新視圖。ObjectAnimator
:直接綁定對象屬性(如?translationX
、alpha
)。AnimatorSet
:組合多個動畫(playTogether()
、playSequentially()
)。
??優勢??:
??交互性??:動畫后點擊事件隨位置變化(例如平移按鈕可在新位置響應點擊)。
??靈活性??:支持自定義插值器(控制速度變化)和估值器(計算非數值屬性)。
18.說一下Android中的設計模式
19.講一下Android的架構
20.Android 為什么要用recyclevie代替listview
21.kotlin中的一下資料
22.Kotlin協程在實際項目中的最佳實踐有哪些?
附:面試準備建議??
??基礎鞏固??:
必刷:Activity/Fragment生命周期、四大組件通信、Handler機制。
??進階重點??:
深入View繪制/事件分發、內存優化、協程原理。
??架構設計??:
準備1-2個模塊化/MVVM項目案例,說明技術選型原因。
??工具使用??:
熟練使用Profiler、LeakCanary、Systrace定位問題