Android 之 面試八股文

  1. ?1.Activity生命周期??

    • ??問題??:描述Activity從啟動到銷毀的完整生命周期方法,并說明onSaveInstanceState()的調用時機。

    • ??參考答案??:

      • onCreate()→?onStart()→?onResume()(活躍狀態) →?onPause()(失去焦點) →?onStop()(完全不可見) →?onDestroy()

      • onSaveInstanceState():在Activity可能被銷毀前調用(如屏幕旋轉),用于保存臨時數據到Bundle。

    • ??考察點??:生命周期順序、狀態恢復、資源釋放時機。

  2. ??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()

      • 匿名內部類持有外部引用 → 靜態內部類 + 弱引用。

  1. ??7冷啟動優化??

    • ??問題??:應用冷啟動耗時超過1秒,如何定位和優化?

    • ??參考答案??:

      • ??定位工具??:Android Studio Profiler的啟動時間分析。

      • ??優化方案??:

        • 延遲初始化第三方庫(使用App Startup)。

        • 減少主線程任務(用線程池處理IO操作)。

        • 使用SplashScreen API避免白屏。

  1. 8.??MVVM與MVI對比??

    • ??問題??:解釋MVVM和MVI架構的區別,并說明MVI如何解決狀態管理問題。

    • ??參考答案??:

      • ??MVVM??:數據驅動UI(LiveData + ViewModel),但狀態分散。

      • ??MVI??:單向數據流(ViewState → 事件 → 更新狀態),狀態集中管理(如用Kotlin Flow實現)。

  2. ??模塊化方案??

    • ??問題??:如何將單模塊App拆分為模塊化架構?需考慮哪些問題?

    • ??參考答案??:

      • ??步驟??:按功能劃分模塊(登錄、支付等),基礎庫抽離為獨立Module。

      • ??關鍵點??:

        • 依賴注入解耦(使用Hilt)。

        • 路由框架(如ARouter)解決跨模塊跳轉。

        • Gradle配置按需編譯。

  1. 9.??Binder機制??

    • ??問題??:解釋Binder在IPC中的一次拷貝原理,并說明其與Socket通信的性能差異。

    • ??參考答案??:

      • ??原理??:通過mmap內存映射共享內核空間,減少數據拷貝次數。

      • ??性能??:Binder傳輸速度比Socket快3倍,適合高頻調用(如系統服務)。

  2. ??10.Compose優勢??

    • ??問題??:對比Compose與XML布局的渲染性能差異,并說明聲明式UI的核心思想。

    • ??參考答案??:

      • ??性能??:Compose跳過冗余measure/layout階段,減少嵌套層級。

      • ??聲明式??:UI = f(State)(狀態變化自動觸發重組,無需手動更新View)。

10.進程間通信(IPC)

11.ANR產生原因??

  1. ??主線程耗時操作??

    • ??I/O阻塞??:主線程執行文件讀寫、數據庫操作或網絡請求(Android 4.0+主線程網絡請求直接拋異常)。

    • ??復雜計算??:大數據處理、圖像渲染等占用CPU時間過長。

    • ??鎖競爭??:主線程等待子線程釋放鎖(如死鎖或同步鎖阻塞)。

  2. ??組件超時??

    • ??BroadcastReceiver??:onReceive()未在限定時間內完成(前臺10秒/后臺60秒)。

    • ??Service??:生命周期方法(如onCreate())超時(前臺20秒/后臺200秒)。

    • ??Input事件??:按鍵或觸摸事件5秒內未響應。

  3. ??系統資源瓶頸??

    • ??內存不足??:頻繁GC或內存泄漏拖慢主線程。

    • ??CPU搶占??:高負載時主線程無法獲取CPU資源。

    • ??Binder調用阻塞??:跨進程通信超時或系統服務響應延遲

?12.ANR產生原因?解決方案與優化策略??

  1. ??異步處理耗時任務??

  2. ??組件優化??

    • ??BroadcastReceiver??:使用goAsync()+ 子線程處理耗時邏輯

    • ??Service??:改用``或JobIntentService異步執行任務。

  3. ??資源與鎖管理??

    • ??減少鎖競爭??:避免嵌套鎖,使用ReentrantLock替代synchronized

    • ??數據庫優化??:批量操作使用事務,減少磁盤I/O

      ??UI與內存優化??

    • ??布局扁平化??:用ConstraintLayout減少層級,避免過度繪制。

    • ??內存緩存??:LruCache緩存圖片等資源,減少重復加載

13.OOM產生的主要原因??

  1. ??內存泄漏(核心原因)??

    • ??靜態引用持有短生命周期對象??:靜態變量(如單例)持有ActivityView的強引用,導致其無法被回收。

    • ??未注銷監聽器/廣播??:如未在onDestroy()中調用unregisterReceiver()或移除Handler消息。

    • ??資源未關閉??:CursorInputStreamBitmap未調用recycle()或關閉流。

  2. ??大對象分配與資源處理不當??

    • ??Bitmap加載過大??:高分辨率圖片未經壓縮直接加載,占用內存遠超控件顯示需求。

    • ??緩存策略不合理??:LruCache或內存緩存設置過大,或未及時清理失效數據。

  3. ??頻繁創建對象與內存碎片??

    • ??臨時對象泛濫??:循環中頻繁創建對象(如字符串拼接),引發頻繁GC導致卡頓甚至OOM。

    • ??棧內存溢出??:深度遞歸或局部變量過多導致棧空間耗盡(默認線程棧僅1MB左右)。

  4. ??系統限制與進程模型??

    • ??內存配額限制??:每個應用進程有固定上限(中低端設備32-64MB,高端設備192MB+),可通過ActivityManager.getMemoryClass()獲取。

    • ??Native內存與Java堆分離??:Bitmap通過Native分配內存,占用C層空間,但受總進程內存限制

14.OOM解決辦法

根治內存泄漏??

??場景??

??解決方案??

靜態引用Activity

改用Application ContextWeakReference

Handler/Runnable泄漏

使用靜態內部類 +?WeakReference,并在onDestroy()中移除消息。

單例模式

初始化時傳入Application Context而非Activity Context

資源未關閉

finally塊或try-with-resources中關閉流、回收Bitmap

2. Bitmap優化(核心場景)

??采樣壓縮??:通過BitmapFactory.Options.inSampleSize按需縮放圖片

  • 編碼格式優化??:使用Bitmap.Config.RGB_565(占內存為ARGB_8888的一半)

  • ??及時回收??:非顯示狀態的Bitmap主動調用recycle()并置null

  • ??三級緩存策略??:內存緩存(LruCache) + 磁盤緩存(DiskLruCache) + 網絡加載,避免重復解碼

?內存管理與編碼規范??

  • ??對象復用??:

    • ListView/RecyclerView使用ViewHolder+convertView復用視圖。

    • 避免在onDraw()等高頻方法中創建對象,減少內存抖動。

  • ??數據結構優化??:

    • 遞歸算法改迭代,避免棧溢出。

    • 大對象分塊加載(如分頁讀取文件)。

  • ??引用類型選擇??:

    • 緩存使用WeakHashMapSoftReference,允許GC在內存緊張時回收對象

15. Android 測量一個imageview的大小,在什么生命周期能測量到?

在?Activity的?onCreate()onStart()或?onResume()中直接調用?imageView.getWidth()或?imageView.getHeight()??通常返回 0??,原因如下:

  • ??視圖未完成布局??:此時視圖樹僅完成初始化,但尚未經過測量(Measure)和布局(Layout)階段。

  • ??布局流程未結束??:Android 的視圖布局分為三個階段:

    1. ??Measure??:計算視圖大小(onMeasure())。

    2. ??Layout??:確定視圖位置(onLayout())。

    3. ??Draw??:繪制視圖內容(onDraw())。

    4. 只有完成 ??Layout 階段??后,尺寸才被確定

    5. 可獲取尺寸的生命周期及方法????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 語句??

本地緩存用戶數據(@Entity+?@DAO

??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 擴展函數庫(如簡化?findViewById

??DataStore??

替代?SharedPreferences的安全數據存儲


?? ??三、Jetpack 與傳統開發對比??

維度

傳統開發

Jetpack 開發

??代碼量??

高(需手動處理生命周期)

減少 30%-50% 樣板代碼

1

??內存泄漏風險??

高(需謹慎管理引用)

低(LiveData/ViewModel 自動清理)

??測試便利性??

需大量 Mock 環境

內置?Test組件支持單元測試

17.Android 動畫講一下

回答:幀動畫、補間動畫(也稱為視圖動畫或Tween動畫)和屬性動畫

幀動畫原理??

通過順序播放一組靜態圖片(每張圖片為一幀)形成動態效果,類似傳統幻燈片或電影播放

缺點??:

  • ??內存占用高??:大量或大尺寸圖片易引發OOM(Out of Memory)。

  • ??靈活性低

補間動畫

  1. ??原理??:

    通過定義動畫的??起始狀態??和??結束狀態??,系統自動計算中間幀(如平移、縮放、旋轉、透明度變化)。??僅改變View的顯示效果,不改變實際屬性??(例如平移后點擊事件仍在原位置)。

  2. ??類型與實現??:

    • ??四種基本類型??:

      • AlphaAnimation(透明度)

      • RotateAnimation(旋轉)

      • ScaleAnimation(縮放)

      • TranslateAnimation(位移)

屬性動畫(Property Animation)??

  1. ??原理??:

    ??動態修改對象的屬性值??(如View的坐標、透明度),真實改變屬性,支持任意對象(不限于View)。

  2. ??核心類??:

    • ValueAnimator:計算屬性值變化,通過監聽器更新視圖。

    • ObjectAnimator:直接綁定對象屬性(如?translationXalpha)。

    • AnimatorSet:組合多個動畫(playTogether()playSequentially())。

  3. ??優勢??:

    • ??交互性??:動畫后點擊事件隨位置變化(例如平移按鈕可在新位置響應點擊)。

    • ??靈活性??:支持自定義插值器(控制速度變化)和估值器(計算非數值屬性)。

18.說一下Android中的設計模式

19.講一下Android的架構

20.Android 為什么要用recyclevie代替listview

21.kotlin中的一下資料

22.Kotlin協程在實際項目中的最佳實踐有哪些?

附:面試準備建議??

  1. ??基礎鞏固??:

    • 必刷:Activity/Fragment生命周期、四大組件通信、Handler機制。

  2. ??進階重點??:

    • 深入View繪制/事件分發、內存優化、協程原理。

  3. ??架構設計??:

    • 準備1-2個模塊化/MVVM項目案例,說明技術選型原因。

  4. ??工具使用??:

    • 熟練使用Profiler、LeakCanary、Systrace定位問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92225.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

暴力解決MySQL連接失敗

本文涉及清空root密碼完全重置MySQL權限徹底卸載并重裝MySQL請務必在測試/本地環境操作,生產環境慎用!場景Spring Boot項目連接MySQL一直報Access denied for user rootlocalhost,改密碼、換驅動都沒用?步驟1:完全重置…

前端開發:CSS(1)—— 什么是CSS?

本文用于記錄前端開發的學習過程。前面我們已經學習了html的編寫,知道了Web開發的一些最基本的知識;在html的學習過程中,我們提到關于樣式的設計和修改常需要使用CSS來實現。那么CSS到底是什么東西呢?它又如何來設計樣式呢&#x…

數據結構(4)—棧和隊列

一、概念1.棧只允許在棧頂位置入棧和出棧元素,鏈表可以在任意位置插入和刪除元素,棧和隊列只允許在指定位置插入和刪除元素2.鏈表、棧和隊列都是一種線性結構(一對一),棧和隊列是一種特殊的表狀結構二、棧1.基礎概念先…

vue2.如何給一個頁面設置動態的name。不同路由使用一樣的組件。頁面不刷新怎么辦?

page里面detail.vue export default { name: detail, } vue2里面.vue的頁面都會設置一個name,這個通常是寫死的。不能在頁面動態設置的。頁面刷新緩存通常都是根據這個name來判斷的。如果name寫死。我幾個頁面都通用這一個頁面的話,他也不刷新頁面啊。 比…

浮動IP(Floating IP)的刪除通常需要滿足什么條件

浮動IP(Floating IP)的刪除通常需要滿足什么條件在云計算或網絡環境中,浮動IP(Floating IP)的刪除通常需要滿足一定的條件,以確保操作不會影響現有業務或導致網絡中斷。以下是常見的可刪除浮動IP的場景和條…

機器學習之隨機森林(Random Forest)實戰案例

一、算法基礎 首先,來介紹一下算法的基礎語法 class sklearn.ensemble.RandomForestClassifier(\ n_estimators’warn’,\ criterion’gini’,\max_depthNone, \ min_samples_split2,\ min_samples_leaf1, \ min_weight_fraction_leaf0.0, \ max_features’auto’…

《C語言》指針練習題--1

《C語言》指針練習題–1 1. 交換兩個整數的值 題目描述: 編寫一個C程序,定義一個函數swap,使用指針參數交換兩個整數的值。在main函數中調用該函數并輸出交換后的結果。 解題思路: 為了交換兩個整數的值,可以通過指針傳…

應急響應整理

目錄 windows下 1. 檢查賬號安全 利用注冊表實現用戶隱藏 粘滯鍵后門 2 檢查異常端口、進程 3. 檢查啟動項、計劃任務、服務 4. 日志分析-Windows 常見事件類型、登錄類型 Linux下 1. 賬號安全 2. 歷史命令 3. 檢查異常端口 4. 檢查異常進程 5. 檢查開機啟動項 …

一文讀懂 C# 中的 Bitmap

一文讀懂 C# 中的 Bitmap 一、Bitmap 到底是什么? 二、推薦使用場景 三、實戰 Demo 基礎用法:加載、創建和保存 進階用法 縮放圖片 裁剪圖片 顏色調整(反色處理) 四、核心方法和屬性說明 常用函數 常用屬性 五、避坑指南、注意事項 六、總結與決策 一文讀懂 C# 中的 Bitmap…

預約時間組件

效果圖如何使用<template><view><button click"pickerTime(0)">預約時間0</button><button click"pickerTime(1)">預約時間1</button><button click"pickerTime(2)">預約時間2</button><but…

Android 開發 - Service、Camera、Layout Design 自定義設備類型和大小

一、Service 啟動 1、基本介紹 &#xff08;1&#xff09;startService()其他組件通過調用 startService() 啟動 Service 后&#xff0c;Service 可在后臺無限期運行&#xff0c;即使啟動 Service 的組件被銷毀也不受影響&#xff0c;一般情況下 startService() 是執行單一操作…

Qwen Image:開源中文渲染SOTA,重塑文生圖技術邊界

1. Qwen Image的技術定位與行業痛點1.1 文本渲染&#xff1a;文生圖領域的長期技術瓶頸傳統文生圖模型在圖像美學與真實感優化上已取得顯著進展&#xff0c;但多語言文本渲染始終是行業難以突破的瓶頸。主流模型在處理中文等非字母語言時&#xff0c;常出現字符斷裂、布局錯位、…

Docker入門教程:在騰訊云輕量服務器上部署你的第一個容器化應用 (2025)

更多云服務器知識&#xff0c;盡在hostol.com“在我電腦上明明是好的啊&#xff01;”這句話&#xff0c;是不是堪稱程序員“甩鍋”排行榜第一名的金句&#xff1f;當你辛辛苦苦開發完一個應用&#xff0c;把它交給同事或者部署到服務器上時&#xff0c;卻發現因為它依賴的某個…

DevOps平臺結合Gradle實現打包流水線

在現代軟件開發中,持續集成與持續交付(CI/CD)已成為團隊提速、降本增效的核心實踐。Gradle作為強大的自動化構建工具,常被用于Android與Java項目的構建打包任務。而將Gradle集成進企業的DevOps平臺中,不僅可以標準化構建過程,還能自動化打包、測試、發布的全流程,大幅提…

Node.js 操作 MySQL

目錄 一、什么是 MySQL&#xff1f; 二、MySQL 的功能概覽 三、MySQL 的安裝與啟動 安裝 MySQL 啟動服務 四、Node.js 如何連接 MySQL&#xff1f; 使用 mysql2 模塊&#xff08;推薦&#xff09; 建立連接 五、創建數據表和插入數據&#xff08;SQL 初始化&#xff09…

解鎖高效敏捷:2025年Scrum項目管理工具的核心應用解析

一、為什么Scrum團隊需要專業項目管理工具&#xff1f;在敏捷開發實踐中&#xff0c;Scrum框架雖然提供了基礎的工作流程&#xff0c;但缺乏對任務細粒度管理的支持。傳統白板或簡單看板工具往往無法滿足現代敏捷團隊的需求&#xff0c;導致&#xff1a;沖刺規劃混亂&#xff1…

途游大數據面試題及參考答案

Java 的反射機制是什么?主要應用在哪些場景? Java的反射機制是指程序在運行時,能夠獲取自身類的信息(如類名、屬性、方法、構造器等),并動態操作這些信息的能力。正常情況下,Java代碼編譯時類型已確定,而反射打破了這種編譯期約束,讓程序在運行時靈活操作類和對象。 …

貪心+矩陣算法

貪心算法貪心的本質是&#xff1a;選擇每一階段的局部最優&#xff0c;從而達到全局最優做題的時候&#xff0c;只要想清楚 局部最優 是什么&#xff0c;如果推導出全局最優&#xff0c;其實就夠了。買賣股票的最佳實際思路&#xff1a;如果第i天賣出股票&#xff0c;則最大利潤…

STM32U5 周期性異常復位問題分析

關鍵字&#xff1a; Option Bytes, IDWG 1. 問題背景 客戶反饋使用 NUCLEO_STM32U575 進行評估時&#xff0c;發現板子燒錄完程序后&#xff0c;能看到指示程序運行的 LED 燈正常點亮&#xff0c;但是程序跑不起來。仔細觀察 LED 指示燈&#xff0c;并不是常亮而是出現周期性…

RedisBloom使用

安裝RedisBloom模塊&#xff0c;從git獲取對應的原碼&#xff0c;make生成.so文件&#xff0c;掛載.so文件&#xff0c;啟動redis docker run --name test-redis -v /iothub/test-redis/data:/data -v /iothub/test-redis/modules:/modules -p 6378:6379 -d redis:4.0.10 redis…