2019最全Android面試題總結(持續更新中。。。)

1. Android

1.1 View相關

1.1.1 基礎

  • Q:SurfaceView和View的區別?
  • Q:自定義View/ViewGroup需要注意什么?

1.1.2 系統View組件

  • ListView

    • Q:ListView為什么可以加載1000個條目不崩?
    • Q:什么是RecycleBin,它是怎么和ListView回收和復用的?
    • Q:你知道notifyDataSetChanged方法干了啥嗎?調用之后為啥ListView就刷新了?
    • Q:你知道ListView的跟手滑動和fling是怎么實現的嗎?
  • ScrollView

    • Q:ScrollView的測量過程,滑動過程以及fling的實現?
  • FrameLayout

    • Q:FrameLayout的布局過程?
  • LinearLayout

    • Q:LinearLayout的布局過程?
  • RecyclerView

  • CoordinatorLayout(協同布局)

  • ConstraintLayout(約束布局)

1.1.3 測量

  • Q:View的三次measure,兩次layout和一次draw
  • Q:onMeasure里面的MeasureSpec哪里來的?它的數據結構怎么樣?怎么用?
  • Q:LinearLayout和RelativeLayout選擇哪個更好?為什么RelativeLayout需要測量2次
  • Q:requestLayout()的原理,什么是責任鏈模式?

1.1.4 繪制相關

  • Q:什么是 SurfaceFlinger FrameBuffer Surface
  • Q:為什么我們說主線程的操作不要操作16ms?
  • Q:什么是VSYNC(垂直同步)、格柵化?
  • Q:什么是掉幀jank,怎么處理?(雙緩沖和三緩存機制)
  • Q:invalidate()和postInvalidate()的區別?

1.1.5 事件傳遞

  • Q:談一談View的事件分發機制?
  • Q:MotionEvent是什么?包含幾種事件?什么條件下會產生?
  • Q:如何解決View的滑動沖突(方向相同、方向不同)?
  • Q:onTouch()、onTouchEvent()和onClick()關系?
  • Q: InputManageService的事件是怎么傳遞到Activity的?
  • Q:主線程和InputManageService的通信建立?(WindowStateWindowSession)
  • Q:InputReader、InputDispatcher線程是干嘛的?運行在哪個進程?

1.1.6 滑動

  • Q:Scroller中最重要的兩個方法是什么?主要目的是?
  • Q:scrollTo()和scrollBy()的區別?
  • Q:fling方法的實現?

2. 圖片相關

  • Q:什么是LRU,什么是LinkedHashMshap?
  • Q:本地、內存2級緩存怎么設計?
  • Q:怎么加載一張大圖又防止OOM?
  • Q:了解哪些Drawable?適用場景?

3 系統組件

3.1 Activity

  • Q:Activity的啟動過程?
  • Q:說下Activity的生命周期?
  • Q:onStart()和onResume()/onPause()和onStop()的區別?
  • Q:Activity A啟動另一個Activity B會回調哪些方法?如果Activity B是完全透明呢?如果啟動的是一個Dialog呢?
  • 狀態存儲
    • Q:談談onSaveInstanceState()方法?何時會調用?
    • Q:onSaveInstanceState()與onPause()的區別?
  • Q:如何避免配置改變時Activity重建?
  • Q:優先級低的Activity在內存不足被回收后怎樣做可以恢復到銷毀前狀態?
  • ActivityStack
    • Q:說下Activity的四種啟動模式?(有時會出個實際問題來分析返回棧中Activity的情況)
    • Q:談談singleTop和singleTask的區別以及應用場景
    • Q:onNewIntent()調用時機?
    • Q:了解哪些Activity啟動模式的標記位?
  • Q:如何啟動其他應用的Activity?

3.2 Fragment

Q:談一談Fragment的生命周期?
Q:Activity和Fragment的異同?
Q:Activity和Fragment的關系?
Q:何時會考慮使用Fragment?

3.3 Service

Q:談一談Service的生命周期?
Q:Service的兩種啟動方式?區別在哪?
Q:一個Activty先start一個Service后,再bind時會回調什么方法?此時如何做才能回調Service的destory()方法?
Q:Service如何和Activity進行通信?
Q:用過哪些系統Service?
Q:是否能在Service進行耗時操作?如果非要可以怎么做?
Q:AlarmManager能實現定時的原理?
Q:前臺服務是什么?和普通服務的不同?如何去開啟一個前臺服務?
Q:是否了解ActivityManagerService,談談它發揮什么作用?
Q:如何保證Service不被殺死?

3.4 Broadcast Receiver

  • Q:廣播的注冊、解綁過程?發送廣播過程?
  • Q:廣播有幾種形式?什么特點?
  • Q:廣播的兩種注冊形式?區別在哪?

3.5 ContentProvider

  • Q:ContentProvider啟動過程?原理?有哪些坑?

3.6 Window

  • Q:Activity、View、Window三者之間的關系?
  • Q:Window(phoneWindow)、WindowManager(WindowManagerImpl)、WindowState、WindowSession、WMS分別是什么?
  • Q:Window有哪幾種類型?
  • Q:Activity創建和Dialog創建過程的異同?

3.7 ActivityManagerService

  • Q:Instrumentation、ActivityStack、PackageInfo是什么?

3.8 Context

  • Q:Context、ContextImpl、ContextWrapper是什么?

4 線程

4.1 線程通信

  • Handler
    • Q:談談消息機制Hander?作用?有哪些要素?流程是怎樣的?
    • Q:可以在子線程直接new一個Handler嗎?那該怎么做?
    • Q:使用Hanlder的postDealy()后消息隊列會發生什么變化?
  • Looper
    • Q:這里的ThreadLocal有什么作用?為什么Looper是ThreadLocal的?
    • Q:主線程中Looper死循環為何沒有卡死主線程?
  • Message
    • Q:Message可以如何創建?哪種效果更好(回收池)?為什么需要回收池?
  • Q:為什么系統不建議在子線程訪問UI?
  • Q:一個Thread可以有幾個Looper(1)?幾個Handler(多個)?
  • Q:如何將一個Thread線程變成Looper線程(prepare loop)?Looper線程有哪些特點?
  • Q:MessageQueue是怎么實現取消息時擁塞,放置消息時喚醒的(epoll、pipe)?
  • Q:Thread直接調用run方法會怎么樣?start方法作用是什么?

5 進程通信IPC

5.1基礎

  • Q:Android中進程和線程的關系?區別?
  • Q:為何需要進行IPC?多進程通信可能會出現什么問題?
  • Q:什么是序列化?Serializable接口和Parcelable接口的區別?為何推薦使用后者?
5.2 binder
  • Q:Android中為何新增Binder來作為主要的IPC方式?
  • Q:使用Binder(binder binderProxy BBinder BpBinder)進行數據傳輸的具體過程?
  • Q:Binder框架中ServiceManager的作用?
  • Q:Android中有哪些基于Binder的IPC方式(Messenger、Aidl)?簡單對比下?
  • Q:是否了解AIDL?原理(stub(binder) proxy(binderProxy的代理))是什么?如何優化多模塊都使用AIDL的情況?

線程模塊

  • Q:AsyncTask的原理,以及線程池?
  • Q:HandlerThread是什么(自帶looper的線程,通過getHandler方法對外暴露Handler給外部使用)?
  • Q:IntentService是什么(自帶looper線程的工作Service,回調onHandleIntent方法)?
  • Q:線程池的好處、原理、類型?

Animation

  • Q:Android中有哪幾種類型的動畫?
  • Q:幀動畫在使用時需要注意什么?
  • Q:View動畫和屬性動畫的區別?
  • Q:View動畫為何不能真正改變View的位置?而屬性動畫為何可以?
  • Q:屬性動畫插值器和估值器的作用?

數據存儲

  • Q:Android中提供哪些數據持久存儲的方法?
  • Q:Java中的I/O流讀寫怎么做?
  • Q:SharePreferences適用情形?使用中需要注意什么?
  • SQLite
    • Q:了解SQLite中的事務處理嗎?是如何做的?
    • Q:使用SQLite做批量操作有什么好的方法嗎?
    • Q:如果現在要刪除SQLite中表的一個字段如何做?
    • Q:使用SQLite時會有哪些優化操作?

2. 性能優化

  • Q:merge 標簽、ViewStub 標簽、 include 標簽
  • Q:性能優化方向(繪制優化、內存泄露、布局優化)
  • Q:如何優化app啟動?
  • Q:了解哪些性能優化的工具(內存、方法時間、布局結構分析)?
  • Q:布局上如何優化?列表呢?
  • Q:什么情況會導致內存溢出?
  • Q:內存泄漏和內存溢出的區別?
  • Q:內存泄漏是什么?為什么會發生?常見哪些內存泄漏的例子?都是怎么解決的?

遇到的問題

  • Q:什么是ANR?什么情況會出現ANR?如何避免?在不看代碼的情況下如何快速定位出現ANR問題所在?

2.Java

2.1 基礎

  • Q:Java封裝、集成、多態
  • Q:重寫和重載的區別?
  • Q:抽象類和接口的異同?
  • Q:泛型的本質是什么?什么是泛型擦除?
  • Q:怎么使用注解?注解的本質是什么?
  • Q:String、StringBuffer和StringBuilder的區別?
  • Q:String a=""和String a=new String("")的的關系和異同?
  • Q:裝箱、拆箱什么含義?為什么ArrayList<Integer>能夠添加int 數字?
  • Q:int和Integer的區別?
  • Q:遇見過哪些運行時異常?異常處理機制知道哪些?
  • Q:什么是反射,有什么作用和應用?
  • Q:final、finally、finalize()分別表示什么含義?
  • Object
    • Q:有哪些公用方法(finalize、toString、hashcode、clone、getclass、wait、notify)?
    • Q:深克隆與淺克隆?
    • Q:waitnotify方法怎么使用?
    • Q: Objectequal()== 的區別?
  • Q:動態代理的原理?
  • system.out.println 是怎么實現不同終端(windows、mac)打印效果不同的?
  • 內部類
    • Q:內部類的作用?
    • Q:匿名內部類、靜態內部類、內部類的區別?
    • Q:為什么內部類可以訪問外部類的私有成員和方法?外部類能夠訪問內
      部類的私有變量和方法?
    • Q:為什么匿名內部類中使用局部變量要用final修飾?

2.2 集合

  • Q:Java集合框架中有哪些類?都有什么特點
  • Q:集合、數組、泛型的關系,并比較
  • Q:ArrayList和LinkList的區別(數組與鏈表)?
  • Q:ArrayList和Vector的區別?
  • Q:HashSet和TreeSet的區別?
  • HashMap
    • Q:HashMapHashtable的區別?
    • Q:HashMap在put、get元素的過程?數據結構是什么樣的?如何解決Hash沖突(拉鏈法)?
    • Q:如何保證HashMap線程安全?什么原理?
    • Q:HashMap是有序的嗎?如何實現有序(LinkedHashMap)?
    • Q:HashMap是如何擴容的?如何避免擴容?
  • Q:hashcode()的作用,與equal()有什么區別?
  • Q:ConcurrentHashmap的同步原理?
  • Q:Lru算法與LinkedHashMap?

2.3 并發

  • Q:什么是ThreadLocal?原理(主內存與工作內存)
  • Q:開啟一個線程的方法有哪些?銷毀一個線程的方法呢?
  • Q:同步和非同步、阻塞和非阻塞的概念
  • Q:Thread的join()有什么作用?
  • Q:線程的有哪些狀態?
  • Q:什么是線程安全?保障線程安全有哪些手段?
  • Q:ReentrantLock和synchronized的區別?
  • Q:synchronized和volatile的區別?
  • Q:synchronized同步代碼塊還有同步方法本質上鎖住的是誰?為什么?
  • Q:sleep()和wait()的區別?
  • Q:怎么安全停止一個線程任務?原理是什么?線程池里有類似機制嗎?
  • Q:Java有哪些線程池?他們的區別是什么?線程池工作流程是怎樣的?線程池實現原理是怎樣的?Cache線程池有哪些弊端?

3. JVM

  • Q:JVM內存是如何劃分的?
  • Q:談談垃圾回收機制?為什么引用計數器判定對象是否回收不可行?知道哪些垃圾回收算法?
  • Q:介紹下分代回收?
  • Q:Java中引用有幾種類型?在Android中常用于什么情景?
  • Q:類加載的全過程是怎樣的?什么是雙親委派模型?
  • Q:工作內存和主內存的關系?在Java內存模型有哪些可以保證并發過程的原子性、可見性和有序性的措施?
  • Q:JVM、Dalvik、ART的區別?
  • Q:Java中堆(對象)和棧(局部變量)的區別?
  • Q:垃圾回收機制?有哪些對象可以作為GC roots?

4. 計算機網絡

4.1 基礎

  • Q:五層協議的體系結構分別是什么?每一層都有哪些協議?
  • Q:為何有MAC地址還要IP地址?

4.2 TCP

  • Q:TCP和UDP的區別?
  • Q:TCP如何保證傳輸是可靠的?數據不丟失?連續且按序?
  • Q:擁塞控制和流量控制都是什么,兩者的區別?
  • Q:談談TCP為什么要三次握手?為什么要四次揮手?
  • Q:播放視頻用TCP還是UDP?為什么?
  • Q:cookie是用來干嘛的?

4.3 HTTP

  • Q:HTTP報文樣式與header字段
  • Q:了解哪些響應狀態碼?
  • Q:get和post的區別?
  • Q:Http1.0、Http1.1、Http2.0的區別?
  • Q:HTTP和TCP的區別?
  • Q:HTTP和HTTPS的區別?
  • Q:HTTP和Socket的區別?
  • Q:在地址欄打入http://www.baidu.com會發生什么(DNS -> HTTPS -> HTTP -> TCP -> IP -> 數據鏈路)?

5. 設計模式

  • 依賴注入
  • 代理模式與動態代理
  • 觀察者模式
  • 單例模式
  • 談談MVC、MVP和MVVM?

6. 操作系統

  • Q:操作系統中進程和線程的區別?
  • Q:死鎖的產生和避免(銀行家算法)?
  • Q:如何理解生產者消費者模型?

7. 算法

  • Q:什么是斐波那契數列?
  • Q:迭代和遞歸的特點,并比較優缺點
  • Q:了解哪些查找算法,時間復雜度都是多少?
  • Q:了解哪些排序算法,并比較一下,以及適用場景
  • Q:快排的基本思路是什么?最差的時間復雜度是多少?如何優化?
  • Q:100盞燈問題
  • Q:老鼠和毒藥問題,加個條件,必須要求第二天出結果
  • Q:海量數據問題
  • Q:(手寫算法)二分查找
  • Q:(手寫算法)反轉鏈表
  • Q:(手寫算法)用兩個棧實現隊列
  • Q:(手寫算法)多線程輪流打印問題
  • Q:(手寫算法)如何判斷一個鏈有環/兩條鏈交叉
  • Q:(手寫算法)快速從一組無序數中找到第k大的數/前k個大的數
  • Q:(手寫算法)最長(不)重復子串

8.數據結構

  • Q:AVL樹插入或刪除一個節點的過程是怎樣的?
  • Q:什么是紅黑樹?

為什么不寫答案

這篇文章主要是把題目總結下來,做一個拋磚引玉,實際上技術的題目沒有標準答案,不同的人看的維度和深度是不同的,下篇文章2019最全Android面試題總結解密(持續更新中。。。)將會提供題目答案,僅是我自己的理解,大佬請勿拍我。


完整Android學習路徑 請戳我的Android學習之旅

感謝

厘米姑娘文章匯總|學習Android的一點一滴

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容