在過去不久的金九銀十,有些小伙伴已經找到了理想的作業,當然也有很多小伙伴因為準備不充分,面試掛了,臨近年關,最近有很多網友都在求大廠面試題,正好我在9月份和10月份整理和收集了 Android 中高級面試真題決議,于是就發上來分享給大家,
這些題目是網友去位元組跳動、小米、oppo、美團、阿里巴巴、騰訊、360、華為、京東等一線互聯網公司面試被問到的題目,熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的幾率,
參考決議:位元組跳動技術團隊、郭霖、鴻洋、玉剛、掘金博主 xiangzhihong、Focusing、simpleeeeee、DevYK、簡書博主 huangLearn、騰訊享學課堂、慕課網、極客時間…
內容特點:條理清晰,含影像化表示更加易懂,
內容概要:包括 Android、Java、資料結構與演算法、計算機網路四大模塊、
Android內含:Activity、Fragment、service、布局優化、AsyncTask相關、Android 事件分發機制、 Binder、Android 高級必備 :AMS,WMS,PMS、Glide、 Android 組件化與插件化等面試題和技術堆疊!
Java內含:HashMap、ArrayList、LinkedList 、Hashset 原始碼分析、記憶體模型、垃圾回收演算法(JVM)、多執行緒、注解、反射、泛型、設計模式等面試題和技術堆疊!
接下來我們針對位元組跳動、騰訊、阿里巴巴一線互聯網大廠等最新收集整理 Android 中高級面試展開的完整面試題
一. Android面試相關
1.Activity
- 說下Activity生命周期
- Activity A 啟動另一個Activity B 會呼叫哪些方法?如果B是透明主題的又或則是個DialogActivity呢
- 說下onSaveInstanceState()方法的作用 ? 何時會被呼叫?
- Activity的啟動流程
- onSaveInstanceState(),onRestoreInstanceState的掉用時機
- activity的啟動模式和使用場景
- Activity A跳轉Activity B,再按回傳鍵,生命周期執行的順序
- 橫豎屏切換,按home鍵,按回傳鍵,鎖屏與解鎖螢屏,跳轉透明Activity界面,啟動一個 Theme 為 Dialog 的 Activity,彈出Dialog時Activity的生命周期
- onStart 和 onResume、onPause 和 onStop 的區別
- Activity之間傳遞資料的方式Intent是否有大小限制,如果傳遞的資料量偏大,有哪些方案
- Activity的onNewIntent()方法什么時候會執行
- 顯示啟動和隱式啟動
- scheme使用場景,協議格式,如何使用
- ANR 的四種場景
- onCreate和onRestoreInstance方法中恢復資料時的區別
- activty間傳遞資料的方式
- 跨App啟動Activity的方式,注意事項
- Activity任務堆疊是什么
- 有哪些Activity常用的標記位Flags
- Activity的資料是怎么保存的,行程被Kill后,保存的資料怎么恢復的
2.Service
- service 的生命周期,兩種啟動方式的區別
- Service的兩種啟動方式?區別在哪
- 如何保證Service不被殺死 ?
- Service與Activity怎么實作通信
- IntentService是什么,IntentService原理,應用場景及其與Service的區別
- Service 的 onStartCommand 方法有幾種回傳值?各代表什么意思?
- bindService和startService混合使用的生命周期以及怎么關閉
- 用過哪些系統Service ?
- 了解ActivityManagerService嗎?發揮什么作用
3.BroadcastReceiver
- 廣播的分類和使用場景
- 廣播的兩種注冊方式的區別
- 廣播發送和接收的原理
- 本地廣播和全域廣播的區別
4.ContentProvider
- 什么是ContentProvider及其使用
- ContentProvider的權限管理
- ContentProvider,ContentResolver,ContentObserver之間的關系
- ContentProvider的實作原理
- ContentProvider的優點
- Uri 是什么
5.Handler
- Handler的實作原理
- 子執行緒中能不能直接new一個Handler,為什么主執行緒可以主執行緒的Looper第一次呼叫loop方法,什么時候,哪個類
- Handler導致的記憶體泄露原因及其解決方案
- 一個執行緒可以有幾個Handler,幾個Looper,幾個MessageQueue物件
- Message物件創建的方式有哪些 & 區別?
Message.obtain()怎么維護訊息池的 - Handler 有哪些發送訊息的方法
- Handler的post與sendMessage的區別和應用場景
- handler postDealy后訊息佇列有什么變化,假設先 postDelay 10s, 再postDelay 1s, 怎么處理這2條訊息
- MessageQueue是什么資料結構
- Handler怎么做到的一個執行緒對應一個Looper,如何保證只有一個MessageQueue ThreadLocal在Handler機制中的作用
- HandlerThread是什么 & 好處 &原理 & 使用場景
- IdleHandler及其使用場景
- 訊息屏障,同步屏障機制
- 子執行緒能不能更新UI
- 為什么Android系統不建議子執行緒訪問UI
- Android中為什么主執行緒不會因為Looper.loop()里的死回圈卡死
- MessageQueue#next 在沒有訊息的時候會阻塞,如何恢復?
- Handler訊息機制中,一個looper是如何區分多個Handler的
- 當Activity有多個Handler的時候,怎么樣區分當前訊息由哪個Handler處理
- 處理message的時候怎么知道是去哪個callback處理的
- Looper.quit/quitSafely的區別
- 通過Handler如何實作執行緒的切換
- Handler 如何與 Looper 關聯的
- Looper 如何與 Thread 關聯的
- Looper.loop()原始碼
- MessageQueue的enqueueMessage()方法如何進行執行緒同步的
- MessageQueue的next()方法內部原理
- 子執行緒中是否可以用MainLooper去創建Handler,Looper和Handler是否一定處于一個執行緒
- ANR和Handler的聯系
6.View繪制
- View繪制流程
- MeasureSpec是什么
- 子View創建MeasureSpec創建規則是什么
- 自定義Viewwrap_content不起作用的原因
- 在Activity中獲取某個View的寬高有幾種方法
- 為什么onCreate獲取不到View的寬高
- View#post與Handler#post的區別
- Android繪制和螢屏重繪機制原理
- Choreography原理
- 什么是雙緩沖
- 為什么使用SurfaceView
- 什么是SurfaceView
- View和SurfaceView的區別
- SurfaceView為什么可以直接子執行緒繪制
- SurfaceView、TextureView、SurfaceTexture、GLSurfaceView
- getWidth()方法和getMeasureWidth()區別
- invalidate() 和 postInvalidate() 的區別
- Requestlayout,onlayout,onDraw,DrawChild區別與聯系
- LinearLayout、FrameLayout 和 RelativeLayout 哪個效率高
- LinearLayout的繪制流程
- 自定義 View 的流程和注意事項
- 自定義View如何考慮機型適配
- 自定義控制元件優化方案
- invalidate怎么區域重繪
- View加載流程(setContentView)
7.View事件分發
- View事件分發機制
- view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch方法 三者優先級
- onTouch 和onTouchEvent 的區別
- ACTION_CANCEL什么時候觸發
- 事件是先到DecorView還是先到Window
- 點擊事件被攔截,但是想傳到下面的View,如何操作
- 如何解決View的事件沖突
- 在 ViewGroup 中的 onTouchEvent 中消費 ACTION_DOWN 事件,ACTION_UP事件是怎么傳遞
- Activity ViewGroup和View都不消費ACTION_DOWN,那么ACTION_UP事件是怎么傳遞的
- 同時對父 View 和子 View 設定點擊方法,優先回應哪個
- requestDisallowInterceptTouchEvent的呼叫時機
8.RecycleView
- RecyclerView的多級快取機制,每一級快取具體作用是什么,分別在什么場景下會用到哪些快取
- RecyclerView的滑動回收復用機制
- RecyclerView的重繪回收復用機制
- RecyclerView 為什么要預布局
- ListView 與 RecyclerView區別
- RecyclerView性能優化
9.Viewpager&Fragment
- Fragment的生命周期 & 結合Activity的生命周期
- Activity和Fragment的通信方式, Fragment之間如何進行通信
- getFragmentManager、getSupportFragmentManager 、getChildFragmentManager之間的區別?
- 為什么使用Fragment.setArguments(Bundle)傳遞引數
- FragmentPagerAdapter與FragmentStatePagerAdapter的區別與使用場景
- FragmentPageAdapter和FragmentStatePageAdapter區別及使用場景
- Fragment懶加載
- ViewPager2與ViewPager區別
- Fragment嵌套問題
10.WebView
- 如何提高WebView加載速度
- WebView與 js的互動
- WebView的漏洞
- JsBridge原理
11.影片
- 影片的型別
- 補間影片和屬性影片的區別
- ObjectAnimator,ValueAnimator及其區別
- TimeInterpolator插值器,自定義插值器
- TypeEvaluator估值器
12.Bitmap
- Bitmap 記憶體占用的計算
- getByteCount() & getAllocationByteCount()的區別
- Bitmap的壓縮方式
- LruCache & DiskLruCache原理
- 如何設計一個圖片加載庫
- 有一張非常大的圖片,如何去加載這張大圖片
- 如果把drawable-xxhdpi下的圖片移動到drawable-xhdpi下,圖片記憶體是如何變的,
- 如果在hdpi、xxhdpi下放置了圖片,加載的優先級,如果是400800,10801920,加載的優先級,
13.mvc&mvp&mvvm
- MVC及其優缺點
- MVP及其優缺點
- MVVM及其優缺點
- MVP如何管理Presenter的生命周期,何時取消網路請求
14.Binder
- Android中行程和執行緒的關系,區別
- 為何需要進行IPC,多行程通信可能會出現什么問題
- Android中IPC方式有幾種、各種方式優缺點
- 為何新增Binder來作為主要的IPC方式
- 什么是Binder
- Binder的原理
- Binder Driver 如何在內核空間中做到一次拷貝的?
- 使用Binder進行資料傳輸的具體程序
- Binder框架中ServiceManager的作用
- 什么是AIDL
- AIDL使用的步驟
- AIDL支持哪些資料型別
- AIDL的關鍵類,方法和作業流程
- 如何優化多模塊都使用AIDL的情況
- 使用 Binder 傳輸資料的最大限制是多少,被占滿后會導致什么問題
- Binder 驅動加載程序中有哪些重要的步驟
- 系統服務與bindService啟動的服務的區別
- Activity的bindService流程
- 不通過AIDL,手動編碼來實作Binder的通信
15.記憶體泄漏&記憶體溢位
- 什么是OOM & 什么是記憶體泄漏以及原因
- Thread是如何造成記憶體泄露的,如何解決?
- Handler導致的記憶體泄露的原因以及如何解決
- 如何加載Bitmap防止記憶體溢位
- MVP中如何處理Presenter層以防止記憶體泄漏的
16.性能優化
- 記憶體優化
- 啟動優化
- 布局加載和繪制優化
- 卡頓優化
- 網路優化
17.Window&WindowManager
- 什么是Window
- 什么是WindowManager
- 什么是ViewRootImpl
- 什么是DecorView
- Activity,View,Window三者之間的關系
- DecorView什么時候被WindowManager添加到Window中
18.WMS
- 什么是WMS
- WMS是如何管理Window的
- IWindowSession是什么,WindowSession的創建程序是怎樣的
- WindowToken是什么
- WindowState是什么
- Android視窗大概分為幾種?分組原理是什么
- Dialog的Context只能是Activity的Context,不能是Application的Context
- App應用程式如何與SurfaceFlinger通信的
- View 的繪制是如何把資料傳遞給 SurfaceFlinger 的
- 共享記憶體的具體實作是什么
- relayout是如何向SurfaceFlinger申請Surface
- 什么是Surface
19.AMS
- ActivityManagerService是什么?什么時候初始化的?有什么作用?
- ActivityThread是什么?ApplicationThread是什么?他們的區別
- Instrumentation是什么?和ActivityThread是什么關系?
- ActivityManagerService和zygote行程通信是如何實作的
- ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的關系
- 手寫實作簡化版AMS
20.系統啟動
- android系統啟動流程
- SystemServer,ServiceManager,SystemServiceManager的關系
- 范訓應用行程這種事為什么不交給SystemServer來做,而專門設計一個Zygote
- Zygote的IPC通信機制為什么使用socket而不采用binder
21.App啟動&打包&安裝
- 應用啟動流程
- apk組成和Android的打包流程
- Android的簽名機制,簽名如何實作的,v2相比于v1簽名機制的改變
- APK的安裝流程
22.序列化
- 什么是序列化
- 為什么需要使用序列化和反序列化
- 序列化的有哪些好處
- Serializable 和 Parcelable 的區別
- 什么是serialVersionUID
- 為什么還要顯示指定serialVersionUID的值?
23.模塊化&組件化
- 什么是模塊化
- 什么是組件化
- 組件化優點和方案
- 組件獨立除錯
- 組件間通信
- Aplication動態加載
- ARouter原理
24.熱修復&插件化
- 插件化的定義
- 插件化的優勢
- 插件化框架對比
- 插件化流程
- 插件化類加載原理
- 插件化資源加載原理
- 插件化Activity加載原理
- 熱修復和插件化區別
- 熱修復原理
25.AOP
- AOP是什么
- AOP的優點
- AOP的實作方式,APT,AspectJ,ASM,epic,hook
26.Jectpack
- Navigation
- DataBinding
- Viewmodel
- livedata
- liferecycle
27.開源框架
- Okhttp原始碼流程,執行緒池
- Okhttp攔截器,addInterceptor 和 addNetworkdInterceptor區別
- Okhttp責任鏈模式
- Okhttp快取怎么處理
- Okhttp連接池和socket復用
- Glide怎么系結生命周期
- Glide快取機制,記憶體快取,磁盤快取
- Glide與Picasso的區別
- LruCache原理
- Retrofit原始碼流程,動態代理
- LeakCanary弱參考,原始碼流程
- Eventbus
- Rxjava
二. Java面試相關
1.HashMap
- HashMap原理
- HashMap 有用過嗎?您能給我說說他的主要用途嗎?
- 您能說說 HashMap 常用操作的底層實作原理嗎?如存盤 put(K key, V value),查找 get(Object key),洗掉 remove(Object key),修改 replace(K key, V value)等操作
- hash 沖突(或者叫 hash 碰撞)是什么?為什么會出現這種現象,如何解 決 hash 沖突?
- HashMap 的容量為什么一定要是 2 的 n 次方?
- 您能說說 HashMap 和 HashTable 的區別嗎?
- HashMap中put()如何實作的
- HashMap中get()如何實作的
- 為什么HashMap執行緒不安全
- HashMap1.7和1.8有哪些區別
- 解決hash沖突的時候,為什么用紅黑樹
- 紅黑樹的效率高,為什么一開始不用紅黑樹存盤
- 不用紅黑樹,用二叉查找樹可以不
- 為什么閥值是8才轉為紅黑樹
- 為什么退化為鏈表的閾值是6
- hash沖突有哪些解決辦法
- HashMap在什么條件下擴容
- HashMap中hash函式怎么實作的,還有哪些hash函式的實作方式
- 為什么不直接將hashcode作為哈希值去做取模,而是要先高16位異或低16位
- 為什么擴容是2的次冪
- 鏈表的查找的時間復雜度是多少
- 紅黑樹

2.ArrayList
- ArrayList定義
- ArrayList 的構造器
- add 方法原始碼分析
- get 方法原始碼分析
- set 方法原始碼分析
- ArrayList和LinkedList的區別,以及應用場景

3. LinkedList
- LinkedList 定義
- LinkedList 支持的操作
- Node 類
- addFirst 原始碼分析
- getFirst 方法原始碼分析
- removeFirst 方法原始碼分析
- add(int index, E e)方法原始碼分析

4. Hashset 原始碼
- 屬性
- 構造方法
- 添加元素
- 洗掉元素
- 查詢元素
- 遍歷元素
- 全部原始碼

5. 記憶體模型
- 記憶體模型產生背景
- 物理機的并發問題
- Java 記憶體模型的組成分析
- Java 記憶體間的互動操作
- Java 記憶體模型運行規則

6. 垃圾回收演算法(JVM)
- Jvm的記憶體模型,每個里面都保存的什么
- 類加載機制的幾個階段加載、驗證、準備、決議、初始化、使用、卸載
- 物件實體化時的順序
- 類加載器,雙親委派及其優勢
- 垃圾回識訓制
- 談談對 JVM 的理解?
- JVM 記憶體區域,開執行緒影響哪塊區域記憶體?
- 對 Dalvik、ART 虛擬機有什么了解?對比

7.多執行緒
- 談一談java執行緒模型
- Java中創建執行緒的方式,Callable,Runnable,Future,FutureTask
- 執行緒的幾種狀態
- 談談執行緒死鎖,如何有效的避免執行緒死鎖?
- 如何實作多執行緒中的同步
- synchronized和Lock的使用、區別,原理;
- volatile,synchronized和volatile的區別?為何不用volatile替代synchronized?
- 鎖的分類,鎖的幾種狀態,CAS原理
- 為什么會有執行緒安全?如何保證執行緒安全
- sleep()與wait()區別,run和start的區別,notify和notifyall區別,鎖池,等待池
- Java多執行緒通信
- 為什么Java用執行緒池
- Java中的執行緒池引數,共有幾種
- 說下 Java 中的執行緒創建方式,執行緒池的作業原理

8.注解
- 注解的分類和底層實作原理
- 自定義注解
9.反射
- 什么是反射
- 反射機制的相關類
- 反射中如何獲取Class類的實體
- 如何獲取一個類的屬性物件 & 構造器物件 & 方法物件
- Class.getField和getDeclaredField的區別,getDeclaredMethod和getMethod的區別
- 反射機制的優缺點

10.泛型
- 泛型概念的提出(為什么需要泛型)?
- 什么是泛型?
- 自定義泛型介面、泛型類和泛型方法
- 型別通配符
11.設計模式
- 你所知道的設計模式有哪些
- 單例設計模式
- 工廠設計模式
- 建造者模式(Builder)
- 配接器設計模式
- 裝飾模式(Decorator)
- 策略模式(strategy)
- 觀察者模式(Observer)

由于文章內容比較多,篇幅有限,部分未展示內容以截圖方式展示 ,如有需要獲取完整的資料檔案的朋友掃描下方二維碼免費獲取,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/355366.html
標籤:其他
下一篇:添加,不替換,圖示到滑鼠游標
