導語
這一份Android面試題集,適應于實習 & 初級工程師 & 中級工程師,高級工程師勉強吧,筆者在搜集問題的同時,也花了大半年的時間整理答案,
目前我就職于某大廠安卓高級工程師職位,在當下大環境下也想為安卓工程師出一份力,通過我的技術經驗整理了面試經常問的題,答案部分會是一篇文章或者幾篇文章,都是我認真看過并且覺得不錯才整理出來,大家知道高級工程師不會像剛入門那樣被問的問題一句話兩句話就能表述清楚,所以我通過過濾好文章來幫助大家理解,希望Android求職者認真研讀,準備面試,并順利找到Offer,
如果你是Android學習者,請訂閱筆者的Android知識體系總結(全方面覆寫Android知識結構,面試&進階),本篇文章中的問題可以從文章中找到答案,謝謝支持,查閱答案,請star專案[https://github.com/Android-Alvin/Android-LearningNotes
](https://github.com/Android-Alvin/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E8%BF%98%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)

本面試題集只應對于Android求職者,有7個模塊:
??Java部分
??Kotlin部分
??Android部分
??移動UI框架部分(Flutter為主)
??資料結構與演算法部分
??常用的開源庫部分
??計算機網路認識
1.Java部分
1.1 作業系統相關
- 1.什么是作業系統?(校招&實習)
- 2.什么是執行緒,什么是行程?(校招&實習)
1.2 JDK&JVM&JRE
- 1.JDK & JVM & JRE分別是什么以及它們的區別?(校招&實習)
- 2.解釋一下為什么Java可以跨平臺?(校招&實習)
1.3 面向程序 & 面向物件
- 1.什么是面向程序 & 什么是面向物件 & 區別?(校招&實習)
- 2.給我說說Java面向物件的特征以及講講你代碼中凸顯這些特征的經驗,(校招&實習)
- 3.什么是多載 & 什么是重寫 & 區別,(校招&實習)
- 4.談談你對this和super的認識,(校招&實習)
- 5.介面和抽象類的區別,(校招&實習)
- 6.靜態屬性和靜態方法能被繼承嗎?靜態方法又是否能被重寫呢?(校招&實習)
- 7.給我說說權限修飾符特性,(校招&實習)
- 8.給我談談Java中的內部類,(校招&實習)
- 9.閉包和內部類的區別?
- 10.Java多型的實作機制是什么?
- 11.談談你對物件生命周期的認識?
- 12.static關鍵字的作用?(校招&實習)
- 13.final關鍵字的作用,(校招&實習)
1.4 八大基本資料型別&參考型別
- 1.說說Java中的8大基本型別 & 記憶體中占有的位元組 & 什么是參考型別?(校招&實習)
- 2.什么是拆箱 & 裝箱,能給我舉栗子嗎?(校招&實習)
1.5 陣列
- 1.能說說多維陣列在記憶體上是怎么存盤的嗎?
- 2.你對陣列二次封裝過嗎?說說封裝了什么
1.6 Java例外
- 1.說說Java例外體系主要用來干什么的 & 例外體系?(校招&實習)
- 2.Error和Exception的區別?(校招&實習)
- 3.說說運行時例外和非運行時例外的區別?(校招&實習)
- 4.如何自定義一個例外?(校招&實習)
- 5.throw和throws 的區別?(校招&實習)
- 6.try{}catch{}finally{}可以沒有finally嗎?(校招&實習)
- 7.finally語塊有什么特點?(校招&實習)
- 8.return在try{}catch{}finally{}中執行具有哪些規則?(校招&實習)
- 9.給我例舉至少5個常見的運行時例外,(校招&實習)
1.7 NIO/BIO/AIO
- 1.NIO是什么 & BIO是什么 & AIO是什么 & 它們之間的區別?(校招&實習)
- 2.IO按照方向和資料型別劃分能劃分為哪些資料流?(校招&實習)
- 3.能給我說說NIO有什么特點?平常開發中使用過嗎?
1.8 集合(容器)
- 1.說說Java中集合的框架?(校招&實習)
- 2.Collection & Map區別(校招&實習)
- 3.談談你常用的集合 & 它們底層的實作方式 & 優缺點 & 使用場景,
- 4.Map的遍歷方式有哪些?(校招&實習)
- 5.給我說說ArrayList的擴容機制.
- 6.什么是深拷貝 & 淺拷貝 & 如何深拷貝一個List集合.
- 7.Set是如何確保它的唯一性的,
- 8.你覺得HashMap的元素順序和什么有關?
- 9.Java中HashMap如何解決哈希碰撞的?
- 10.ConcurrentHashMap如何實作并發訪問的?
- 11.談談Java集合中那些執行緒安全的集合 & 實作原理,
- 12.說說有哪些集合能加入null,哪些不能加入null,為什么?
- 13.說說LinkedHashMap原理,
- 14.Collection 和 Collections的區別?
- 15.比較一下ArrayMap和HashMap,
- 16.說說HashMap的原理,
- 17.從原始碼角度剖析ArrayList,LinkedList
- 18.你如何看代Java 8中HashMap引入紅黑樹?
1.9 執行緒
- 1.什么是執行緒?能解決什么問題,(校招&實習)
- 2.Java中創建執行緒的2種方式 & 區別?(校招&實習)
- 3.給我說說執行緒的生命周期,(校招&實習)
- 4.執行緒死鎖的原因 & 舉個栗子 & 如何避免死鎖,(校招&實習)
- 5.Synchronized放在靜態方法和非靜態方法上的鎖物件分別是什么?(校招&實習)
- 6.如何停止掉一個執行緒?(校招&實習)
- 7.給我說說執行緒池的種類 & 特點 & 內部原理 & 平時當中使用案例,(校招&實習)
- 8.給我談談你是如何保證執行緒資料安全問題的?
- 9.wait()和sleep()的區別?(校招&實習)
- 10.什么是公平鎖&非公平鎖&區別?
- 11.給我講講執行緒間通信
- 12.volatile關鍵字是如何使用的?原理是什么
- 13.說說使用5個執行緒去計算一個陣列之和的思路,
- 14.談談執行緒阻塞的原因有哪些?
- 15.談談你對notify的理解?
- 16.你覺得Lock和Synchronized的區別是什么?
- 17.談談你對ReentrantLock的認識,
- 18.呼叫run()和start()的區別?
- 19.transient關鍵字的用法 & 作用 & 原理,
- 20.ThreadPoolExecutor的作業策略有哪些?
- 21.ThreadLocal了解嗎?說說原理,
- 22.權衡多執行緒的性能,
- 23.如何理解同步和異步,阻塞和非阻塞,
- 25.比較一下執行緒和協程,
- 26.從原始碼角度講講你對Thread類中run方法的理解,
- 27.談談Java記憶體模型,
- 28.兩次呼叫Thread物件的start方法會發生什么?為什么?
- 29.Thread的sleep方法會清除中斷的狀態嗎?
- 30.為什么執行緒通信的方法wait,notify,notifyAll被定義于Object中,而sleep方法被定義在Thread類中?
- 31.說說Thread類中提供的getState()方法作用,然后說說執行緒的狀態有哪些以及轉換程序,
- 32.用至少2種方式手寫生產者消費者模式代碼,
- 33.interrupted和isInterrupted方法的區別?
- 34.分別講講JVM記憶體結構,Java記憶體模型,Java物件模型,
- 35.什么是happens-before?它的規則有哪些?
- 36.什么是JMM?談談作業記憶體和主記憶體的關系,
- 37.Java重排序了解嗎?談談重排序的3種情況,
- 38.什么是可見性?為什么存在可見性問題?怎樣解決可見性帶來的問題?
- 39.管程是什么?談談它的重要性,
1.10 泛型
- 1.什么是泛型?能解決什么問題?
- 2.說說Java中泛型的作業機制?
- 3.在泛型種extends和super關鍵字的區別是什么?
- 4.比較一下其它語言中的泛型和Java泛型的區別,
- 5.在Java中List< A >和List< B >是一樣的型別還是不一樣的型別?為什么?
- 6.你可以例舉一些自己使用泛型的栗子嗎?
1.11 反射
- 1.什么是反射?
- 2.如何獲取一個類的成員變數 & 成員方法 & 注解資訊 & …,
- 3.通常在專案當中用到反射多嗎?都是用來干嘛?
- 4.如何反射一個匿名內部類(考察對匿名內部類的認識)
1.12 注解
- 1.什么是注解 & 它和注釋的區別?
- 2.注解的作業機制是什么?
- 3.如何決議注解?
1.13 Socket編程
- 1.什么是Socket編程?(校招&實習)
- 2.什么是TCP,什么是UDP,二者之間區別如何?(校招&實習)
1.14 設計模式
- 1.說說設計模式的六大原則,(校招&實習)
- 2.請講講你會使用的一些設計模式?(校招&實習)
- 3.請說說單例模式 & 你專案中常用的單例模式,(校招&實習)
- 4.懶漢單例模式為什么要加volaitle?(校招&實習)
- 5.能否給我說說Android中至少3個用到設計模式的栗子?(校招&實習)
1.15 JVM相關
- 1.什么是class檔案?
- 2.Java代碼執行流程?
- 3.Java記憶體結構 & 記憶體模型,
- 4.GC回識訓制,
- 5.Java虛擬機是如何加載一個類的?
- 6.給我談談類加載器,
- 7.談談static編譯運行時的流程,在虛擬機中如何保存的?
- 8.說說Java種的4種參考以及用法?
- 9.如何判斷一個物件是死亡的?
- 10.代碼中直接呼叫System.gc()會發生什么?
- 11.一個強參考直接被null賦值,那么這個物件會被立刻回收嗎?
- 12.String a = “a”+“b”+“c”;在記憶體中創建了幾個物件?
- 13.談談你對字符集的理解,
- 14.常見的編碼格式有哪些?
- 15.utf-8中的中文占幾個位元組?int型占幾個位元組?
- 16.談談你對邏輯地址和物理地址的理解?
- 17.你知道物件什么時候會回呼finalize方法嗎?
- 18.什么是Java記憶體模型 & Java7、8、9記憶體模型的區別.
1.16 高級Java知識點
- 1.AOP是什么 & 和OOP區別?實作的方式有哪些?Android中如何實作?
- 2.APT是什么?例舉一些基于它實作的輪子 & 自己有玩過它嗎 & 做了些什么?
- 3.位元組碼篡改技術了解嗎?
1.17 其它Java部分有關面試題
- 1.為什么區域內部類訪問區域變數需要final?(校招&實習)
- 2.String、StringBuffer、StringBuilder、CharSequence的區別,(校招&實習)
- 3.equals和==的區別?(校招&實習)
- 4.關于字串的拼接你在專案中常常怎么操作的?為什么不能用“+”的方式進行拼接呢?(校招&實習)
- 5.什么是Callback,講講你專案中使用的一些有關Callback的栗子,(校招&實習)
- 6.retrun & break & continue 區別?(校招&實習)
- 7.如何判斷一個字串是回文字串?(校招&實習)
- 8.final,finally,finalize的區別?(校招&實習)
- 9.什么是動態代理 & 什么是靜態代理?
- 10.String為什么會加final?
- 11.OOM可以try{}catch{}嗎?
- 12.給我談談正則運算式,(校招&實習)
- 13.如何將String轉成int?(校招&實習)
- 14.談談你對String的理解,
- 15.你如何理解序列化?有哪些方式序列化?
- 16.談談你對依賴注入的理解,
- 17.給我談談你對分派的理解,

由于文章內容比較多,篇幅不允許,部分未展示內容以截圖方式展示 ,如有需要獲取完整的資料檔案的朋友點擊我的GitHub免費獲取,
2.Kotlin部分
kotlin為什么被設計出來
kotlin被設計出來并被Google推廣,主要有以下優勢:
- 完全兼容Java
- 更少的空指標例外
- 更少的代碼量,更快的開發速度
kotlin作業原理
首先,我們了解下Java的作業原理:
Java 代碼是經過編譯才能運行的,首先會編譯成class檔案,然后通過java虛擬機運行,在Android中也就是ART,
所以,任何語言只要能被編譯成符合規格的class檔案,就能被java虛擬機運行,也就能運行在我們的Android手機上,kotlin亦是如此,
- 另外Android studio也提供了一個功能,可以查看kotlin對應的位元組碼:
Tools -> Kotlin -> Show Kotlin Bytecode
再點擊Decomplie還可以反編譯成Java檔案,
kotlin的空安全
- java中,我們可以任意初始化一個變數,而不需要賦值,比如String,就有它的默認值null,
String a;
如果要呼叫物件的引數,必須判空:
if (a!=null){
Log.d("lz","length="+a.length());
}else{
Log.d("lz","length=null");
}
- kotlin中,為了保證減少空指標的問題,不允許直接設定為空,可以通過?=的方式設定可以為空,
val a: String ? = null
1)賦值的時候,可以直接使用?來表示這個物件可能為空,如果為空則運算式結果也為空,而不用進行非空判斷,
//如果 b 非空,就回傳 b.length,否則回傳 null
val length = b?.length
//如果 b 非空,就回傳 String型別的b,否則回傳 null
val str = b as? String
也就是通過問號來表示物件為空則整個運算式結果為空,而不會報錯空指標,
2)如果需要設定為空的時候回傳的運算式值不為空,可以用運算子?:來表示,也叫Elvis運算子,
//b為空則運算式回傳-1
val length = b?.length ?: -1
3)如果要將值轉換為非空型別,就可以使用 !!來標識非空,但是這種運算子就有可能會拋出空指標例外,如果實際物件為空的話,所以這種運算子相當于去除了空判斷,
//如果b為空,空指標例外
val length = b!!.length
val和var
val,全稱value,宣告一個不可變的變數,這種變數在初始賦值之后就再也不能重新賦值了,所以相當于java中的final變數,
var,全稱variable(可變的),所以是用來宣告一個可變的變數,可以重復賦值,
kotlin中這么設計的原因主要是把不可變變數 這種因素和可變變數拿到同一級來設計,也就是說我們以后編碼設計變數的時候,必須要考慮這個變數是不可變還是可變的,養成良好習慣,不是以前在java中需要添加final這種稍微繁瑣的舉動,
擴展函式(Extension Function)
擴展函式,其實就是擴展類的函式,可以在已有的類中添加新的方法,比繼承更加簡潔優雅方便,
- 擴展函式比如:
fun Activity.showToast( msgId:Int){
Toast.makeText(this,msgId,Toast.LENGTH_SHORT).show()
}
這樣任何的Activity里面就可以直接呼叫showToast方法來展示Toast了,
- 同樣,可以設定擴展屬性,比如:
var <T> MutableList<T>.lastData: T
//獲取List中最后一個物件
get() = this[this.size - 1]
//設定List中最后一個物件的值
set(value) {
this[this.size - 1] = value
}
用法:
var strs = mutableListOf<String>()
strs.lastData="heihei"
Log.e(TAG,"lastdata= ${strs.lastData}")
這里還涉及到兩個知識點:
-
kotlin中,在使用物件的get和set方法,可以直接省略,直接使用屬性名即可,會根據運算式的實際功能來添加對應的set或者get方法,
-
kotlin中,對于$符號表示 串模板,就是可計算的代碼片段,可以將其計算結果鏈接到字串中,
擴展屬性原理
kotlin這個擴展功能確實設計的很巧妙,那就一起來研究下它的原理:
按照上面的方法,也就是Tools -> Kotlin -> Show Kotlin Bytecode -> Decomplie, 我們得到showToast擴展函式和使用代碼所對應的java代碼:
//擴展函式
public final class UtilsKt {
public static final void showToast(@NotNull Activity $this$showToast, int msgId) {
Intrinsics.checkParameterIsNotNull($this$showToast, "$this$showToast");
Toast.makeText((Context)$this$showToast, msgId, 0).show();
}
}
//使用
UtilsKt.showToast(this, 1900026);
可以看到所謂的擴展函式不過就是自動生成一個帶有當前物件的函式,擴展函式的所在類被public final修飾,函式被public static final修飾,然后擴展的那個類被作為方法的一個引數傳進去,這樣就跟我們用java的時候寫的工具類很像,
然后使用的時候就跟我們使用工具類一樣呼叫工具類的方法即可,
可以定義同名的擴展方法嗎
在同一個包名下,是不可以定義相同類相同方法名的擴展方法的,但是,在不同包名下,是可以定義的,
比如我在不同的包名下定義了相同的擴展方法:
//Utils2.kt
package com.example.studynote.kotlin
fun Activity.showToast(msg:String){
Toast.makeText(this,msg,Toast.LENGTH_LONG).show()
}
//Utils.kt
package com.example.studynote
fun Activity.showToast(msg:String){
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show()
}
具體會用哪個呢?就要看你匯入的包是哪個了~
擴展方法可以覆寫掉某個類的已有方法嗎
肯定是不能的,如果一個類的擴展方法和它已有方法同名,是可以編譯過的,
但是呼叫的時候會優先呼叫類中本來就有的方法,而不是擴展方法,
kotlin中有沒有用到;的時候
kotlin中一般會把;省略,但是有兩種情況還是會用到:
- 列舉中,如果有方法的情況,必須用;來分割列舉常量串列和方法
enum class Color {
RED,
BLACK,
BLUE,
GREEN,
WHITE;
fun getTopColor():Color {
return BLACK
}
}
- 兩個運算式在一行的時候,當然這種有點累贅,為啥要寫成一行呢是吧:
var test="nihao" ; var test2="heihei"
let、apply、with、run
- let 默認當前這個物件作為閉包的it引數,回傳值為函式最后一行,或者return
fun getInt():Int{
"jimu".let {
println(it.length)
return 0
}
}
- apply 在apply函式范圍內,可以任意呼叫該物件的任意方法,并回傳該物件
fun getInt(): Int {
return ArrayList<String>().apply {
add("jimu")
}.size
}
- with 回傳值是最后一行,這點類似let,可以直接呼叫物件的方法,這點類似apply,
fun getInt(): Int {
return with(ArrayList<String>()){
add("jimu")
size
}
}
- run run和with很像,可以呼叫物件的任意函式,回傳值是最后一行
fun getInt(): Int {
return ArrayList<String>().run{
add("jimu")
size
}
}
lateinit和by lazy
上篇說過,Kotlin有空限制,所以有些變數如果不想設定為空的時候初始化該怎么做呢?這就用到延遲初始化了,lateinit和by lazy都能實作,
- lateinit
lateinit用于修飾var變數,它會讓編譯器暫時忽略初始化這個事情,到后面用的時候我們在進行初始化,但是不能用到基本資料型別,比如int,double這種,
lateinit var test: String
- by lazy
by lazy用于val型別的變數,它會暫時不進行初始化,并且在第一次使用的時候自動呼叫我們設定好的運算式進行初始化,
val str by lazy {
println("Init lazy")
"Hello World"
}
Kotlin中的建構式
kotlin中建構式分為主建構式和次建構式,
- 主建構式
主建構式沒有函式體,直接定義在類名后,每個類都會默認帶一個不帶引數的建構式,也可以直接定義引數,如果需要在建構式中進行初始化作業,可以用init關鍵字:
class Student {
}
class Student(var name: String) {
init {
Log.e(TAG,"name=$name")
}
}
class Student constructor(var name: String) {
init {
Log.e(TAG,"name=$name")
}
}
- 次建構式
除了類名后這種主建構式,其他的建構式方法就是通過constructor關鍵字來定義次建構式,一個類可以定義多個次建構式,如果主建構式和次建構式同時存在的時候,次建構式必須呼叫主建構式,
class Student{
private val username: String
constructor(username: String){
this.username = username
}
}
class Student(username: String) {
private var username: String
private var age: Int
init {
this.username = username
this.age = 10
}
constructor(username: String, age: Int) : this(username) {
this.age = age
}
}
協程
Kotlin協程是對執行緒的一種封裝,同樣是用來解決并發任務(異步任務)的方案,可以理解為一種執行緒框架,特點是掛起時不需要阻塞執行緒,更好的解決了執行緒切換,魔鬼呼叫的問題,
簡單舉個例子,具體的說明大家可以翻翻以前的文章——協程三問,
GlobalScope.launch(Dispatchers.Main) {
var name = ioTask()
updateUI(name)
var name1 = ioTask()
updateUI(name1)
var name2 = ioTask()
updateUI(name2)
}
private suspend fun ioTask(): String {
var name = ""
withContext(Dispatchers.IO) {
//耗時操作,比如網路介面訪問
name = "jimu"
}
return name
}
- GlobalScope.launch去開啟一個協程
- Dispatchers.Main表示運行在主執行緒
- suspend關鍵字用于標記掛起函式的關鍵字
- withContext函式用來構建一個協程作用域,可以標明作用執行緒,比如這里的Dispatchers.IO,這個函式必須在掛起函式或者協程中執行
說說插值器和估值器
- 插值器
一般指時間插值器TimeInterpolator,是設定 屬性值 從初始值過渡到結束值 的變化規律,比如勻速,加速,減速等等,可以通過xml屬性和java代碼設定,
系統默認的插值器是AccelerateDecelerateInterpolator,即先加速后減速,
//勻速插值器設定
android:interpolator="@android:anim/linear_interpolator"
alphaAnimation.setInterpolator(new LinearInterpolator());
屬性影片中,插值器的含義就是要設定時間和屬性的變化關系,也就是根據影片的進度(0%-100%)通過邏輯計算 計算出當前屬性值改變的百分比,比如勻速關系就是影片進度和屬性值改變的進度保持一致,50%時間進度就完成了屬性值50%的變化,
//自定義勻速插值器
public class MyLinearInterpolator implements TimeInterpolator {
@Override
public float getInterpolation(float input) {
return input;
}
- 估值器
又叫型別估值演算法TypeEvaluator,用來設定 屬性值 從初始值過渡到結束值 的變化具體數值,剛才介紹的插值器是指變化規律,而這個估值器是決定具體的變化數值,是用來協助插值器完成影片設定,
比如屬性影片設定:
ObjectAnimator anim = ObjectAnimator.ofObject(view, "scale", new IntEvaluator(),1,10);
//系統估值器型別
IntEvaluator:針對整型屬性
FloatEvaluator:針對浮點型屬性
ArgbEvaluator:針對Color屬性
可以看看IntEvaluator原始碼,其實就是根據三個引數—估值小數(fraction),開始值(startValue)和 結束值(endValue)然后計算具體屬性變化的值:
public class IntEvaluator implements TypeEvaluator<Integer> {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(startInt + fraction * (endValue - startInt));
}
}
所以要實作一個完整的屬性影片,需要估值器和插值器進行協同作業:
- 首先由TimeInterpolator(插值器)根據時間流逝的百分比計算出當前屬性值改變的百分比,并且 插值器 將這個百分比回傳,這個時候 插值器 的作業就完成了,
- 比如 插值器 回傳的值是0.5,很顯然我們要的不是0.5,而是當前屬性的值,即當前屬性變成了什么值,這就需要 估值器根據當前屬性改變的百分比來計算改變后的屬性值,根據這個屬性值,我們就可以設定當前屬性的值了,
3.Android 部分
- 四大組件是哪四個?ABCS(Activity,Braodcast,ContentProvider,Service)(校招&實習)
3.1 Activity
- 1.Activity是什么?(校招&實習)
- 2.典型情況下的Activity生命周期?(校招&實習)
- 3.例外情況下的Activity的生命周期 & 資料如何保存和恢復? (校招&實習)
- 4.從Activity A跳轉到Activity B之后,然后再點擊back建之后,它們的生命周期呼叫流程是什么?(校招&實習)
- 5.如何統計Activity的作業時間?(校招&實習)
- 6.給我說說Activity的啟動模式 & 使用場景,(校招&實習)
- 7.如何在任意位置關掉應用所有Activity & 如何在任意位置關掉指定的Activity?(校招&實習)
- 8.Activity的啟動流程(從原始碼角度決議)?
- 9.啟動一個其它應用的Activity的生命周期分析,
- 10.Activity任務堆疊是什么?在專案中有用到它嗎?說給我聽聽
- 11.什么情況下Activity不走onDestory?
- 12.什么情況下Activity會單獨執行onPause?(校招&實習)
- 13.a->b->c界面,其中b是SingleInstance的,那么c界面點back回傳a界面,為什么?
- 14.如果一個Activity彈出一個Dialog,那么這個Acitvity會回呼哪些生命周期函式呢?
- 15.Activity之間如何通信 & Activity和Fragment之間通信 & Activity和Service之間通信?
- 16.說說Activity橫豎屏切換的生命周期,(校招&實習)
- 17.前臺切換到后臺,然后在回到前臺時Activity的生命周期,
- 18.下拉狀態欄時Activity的生命周期?
- 19.Activity與Fragment的生命周期比較?
- 20.了解哪些Activity常用的標記位Flags?
- 21.談談隱式啟動和顯示啟動Activity的方式?
- 22.Activity用Intent傳遞資料和Bundle傳遞資料的區別?為什么不用HashMap呢?
- 23.在隱式啟動中Intent可以設定多個action,多個category嗎 & 順便講講它們的匹配規則?
- 24.Activity可以設定為對話框的形式嗎?(校招&實習)
- 25.如何給Activity設定進入和退出的影片?
- 26.Activity使用Intent傳遞資料是否有限制 & 如果傳遞一個復雜的物件,例如一個復雜的控制元件物件應該怎么做?
- 27.在Activity中可以多次呼叫setContentView方法嗎?說說不同時機第二次呼叫setContentView會發生什么?
- 28.說說分別在Activity里每一個生命周期函式里呼叫finish方法后,接下來Activity的生命周期如何回呼?
- 29.有什么方法可以啟動一個沒有在AndroidManifest.xml中注冊過的Activity?
- 30.在Activity進行配置時,catrgory和action的區別是什么?
- 31.activity中分別在onCreate,onStart,onResume中呼叫finish后的生命周期如何回呼?
- 32.鎖定屏與解鎖螢屏,Activity 生命周期?
- 33.如何設定Activity進入和退出的影片?
- 34.談談你對Activity中onNewIntent()方法的認識?
- 35.如果一個Activity啟動比較慢,需要優化,你覺得可以從哪些方面入手?
- 36.Activity之間傳遞資料的方式Intent是否有大小限制,如果傳遞的資料量偏大,有哪些方案?
- 37.了解scheme跳轉協議嗎?談一談
- 38.談談你對Activity的Context的認識?
- 39.如何在Application中獲取當前Activity實體?
- 40.Activity行程優先級?
- 41.Activity出現ANR的條件有哪些 & 解決方案?
3.2 BroadcastReceiver
- 1.廣播是什么?(校招&實習)
- 2.廣播的注冊方式有哪些?(校招&實習)
- 3.廣播的分類 & 特性 & 使用場景?(校招&實習)
- 4.說說系統廣播和本地廣播的原理 & 區別 & 使用場景,
- 5.有兩個應用注冊了一樣的廣播,一個是靜態,一個是動態,連優先級也一樣,那么當廣播從系統發出來后,哪個應用先接收到廣播?
3.3 ContentProvider
- 1.什么是內容提供者?(校招&實習)
- 2.說說如何創建自己應用的內容提供者 & 使用場景,(校招&實習)
- 3.說說ContentProvider的原理,
- 4.ContentProvider,ContentResolver,ContentObserver之間的關系?
- 5.說說ContentProvider的權限管理,
3.4 Service
- 1.什么是Service?(校招&實習)
- 2.說說Service的生命周期,(校招&實習)
- 3.Service和Thread的區別?(校招&實習)
- 4.Android 5.0以上的隱式啟動問題及其解決方案,
- 5.給我說說Service保活方案
- 6.IntentService是什么 & 原理 & 使用場景 & 和Service的區別,
- 7.創建一個獨立行程的Service應該怎樣做?
- 8.Service和Activity之間如何通信?
- 9.說說你了解的系統Service,
- 10.談談你對ActivityManagerService的理解,
- 11.在Activtiy中創建一個Thread和在一個Service中創建一個Thread的區別?
3.5 Handler
- 1.子執行緒一定不能更新UI嗎?(校招&實習)
- 2.給我說說Handler的原理(校招&實習)
- 3.Handler導致的記憶體泄露你是如何解決的?
- 4.如何使用Handler讓子執行緒和子執行緒通信?
- 5.你能給我說說Handler的設計原理?
- 6.HandlerThread是什么 & 原理 & 使用場景?
- 7.IdleHandler是什么?
- 8.一個執行緒能否創建多個Handler,Handler和Looper之間的對應關系?
- 9.為什么Android系統不建議子執行緒訪問UI?
- 10.Looper死回圈為什么不會導致應用卡死?
- 11.使用Handler的postDealy后訊息佇列有什么變化?
- 12.可以在子執行緒直接new一個Handler出來嗎?
- 13.Message物件創建的方式有哪些 & 區別?
- 14.ANR和Handler存在什么聯系嗎?
- 15.子執行緒的Looper和主執行緒的Looper有什么區別?
- 16.說說Handler為什么不能進行跨行程通信?
- 17.Handler的訊息延時是如何實作的?
- 18.什么是訊息屏障?
- 19.假設主執行緒new了Handler A和Handler B以及Handler C,現在有個子執行緒,在子執行緒中通過Handler C發送了一條訊息,那么Handler A和Handler B能接收到嗎?為什么?
3.6 AsyncTask
- 1.AsyncTask是什么?能解決什么問題(校招&實習)
- 2.給我談談AsyncTask的三個泛型引數作用 & 它的一些方法作用,
- 3.給我說說AsyncTask的原理,
- 4.你覺得AsyncTask有不足之處嗎?
3.7 Fragment
- 1.Android中v4包下Fragment和app包下Fragment的區別是什么?
- 2.Fragment的生命周期 & 請結合Activity的生命周期再一起說說,
- 3.說說Fragment如何進行懶加載,
- 4.ViewPager + Fragment結合使用會出現記憶體泄漏嗎 & 如何解決?
- 5.Fragment如何和Activity進行通信 & Fragment之間如何進行通信?
- 6.給我談談Fragment3種切換的方式以及區別 & 使用場景,
- 7.getFragmentManager,getSupportFragmentManager,getChildFragmentManager之間的區別?
- 8.FragmentPagerAdapter和FragmentStatePagerAdapter區別?
- 9.Fragment如何實作類似Activity堆疊的壓堆疊和出堆疊效果的?
3.8 序列化
- 1.什么是序列化 & 能用來干什么?(校招&實習)
- 2.Android中序列化方式有幾種?說說它們的區別,(校招&實習)
- 3.如果想要序列化的類中某些欄位不序列化,那么應該怎么做?
3.9 IPC
- 1.說說你對Android多行程開發的認識?
- 2.Android中行程間通信的方式有哪些?
- 3.什么是AIDL?如何創建一個AIDL,
3.10 檔案存盤
- 1.說說Android中資料持久化的方式 & 使用場景,(校招&實習)
- 2.接觸過MMKV嗎?說說SharedPreference和它的區別,
- 3.第三方資料庫框架用過哪些?有沒有自己封裝過一個SQLite的庫?
- 4.SQLite是執行緒安全的嗎 & SharedPreference是執行緒安全的嗎?(校招&實習)
- 5.請簡單的給我說說什么是三級快取?(校招&實習)
- 6.SharedPreference的apply和commit的區別,
- 7.談談你對SQLite事務的認識,
- 8.千奇百怪的SQL陳述句考察,(校招&實習)
- 9.SharePreference跨行程使用會怎么樣?如何保證跨行程使用安全?
- 10.談談SQLite升級要注意哪些地方?
3.11 ListView & RecyclerView
- 1.ListView是什么?如何使用?(校招&實習)
- 2.RecyclerView是什么?如何使用?如何回傳不一樣的Item,(校招&實習)
- 3.ListView和RecycyclerView的區別是什么?(校招&實習)
- 4.分別講講你對ListView & RecyclerView的優化經驗,(校招&實習)
- 5.給我說說RecyclerView的回收復用機制
- 6.說說你是如何給ListView & RecyclerView加上拉重繪 & 下拉加載更多機制,
- 7.談談你是如何對ListView & RecycleView進行區域重繪的?
- 8.談談如何進行分頁加載?
- 9.ScrollView下嵌套一個ListView通常會出現什么問題?
- 10.一個ListView或者一個RecyclerView在顯示新聞資料的時候,出現圖片錯位,可能的原因有哪些 & 如何解決?
3.12 圖片編程
- 1.你對Bitmap了解嗎?它在記憶體中如何存在?
- 2.有關Bitmap導致OOM的原因知道嗎?如何優化?
- 3.給我談談圖片壓縮,
- 4.LruCache & DiskLruCache原理,
- 5.說說你平常會使用的一些第三方圖片加載庫,最好給我談談它的原理,
- 6.如果讓你設計一個圖片加載庫,你會如何設計?
- 7.有一張非常大的圖片,你如何去加載這張大圖片?
- 8.你知道Android中處理圖片的一些庫嗎(OpenCv & GPUImage …)?
- 9.如何計算一張圖片在記憶體中占用的大小?
3.13 WebView
- 1.WebView是什么?(校招&實習)
- 2.WebView會導致記憶體泄露嗎?原因是什么?解決方式有哪些?(校招&實習)
- 3.你知道Hybrid開發嗎?說說你的相關經驗,
- 4.說說WebSettings & WebViewClient & WebChromeClient這三個類的作用 & 用法,
- 5.說說你了解的Hybrid框架,
- 6.如何提高原生的WebView加載速度?
- 7.談談你對webView作業機制的認識,你在專案中優化過它嗎?說說是從哪些方面著手的?
3.14 ViewPager
- 1.什么是ViewPager?說說它的那些配接器,(校招&實習)
- 2.你了解ViewPager2嗎?和ViewPager 1有哪些區別?
- 3.ViewPager + Fragment結合使用存在的記憶體泄漏的原因是什么?如何解決?
3.15 View事件分發機制
- 1.什么是事件分發機制?主要用來解決什么問題?(校招&實習)
- 2.給我說說事件分發的流程 & 你專案解決事件沖突的一些案例,
- 3.分別講講有關事件分發的三個方法的作用及關系,
- 4.如果我在一個設定了點擊事件的TextView中dispatchTouchEvent方法強制回傳ture或者false會發生什么?
- 5.談談你對MotionEvent的認識?Cancel事件是什么情況下觸發的?
- 6.線性布局A下面放置一個Button,如果給Button設定了點擊事件,在線性布局A中重寫了dispatchTouchEvent,onInterceptHoverEvent,而且它們都回了true,那么Button的點擊事件會被呼叫嗎?當前Activity的onTouchEvent又是否會被呼叫呢?為什么?
- 7.多點觸摸事件平時接觸過嗎?如何監聽用戶第二個手指,第三個…?
- 8.OnTouchListener & OnTouchEvent & OnClickListener三者之間的關系?
- 9.談談你對MotionEvent的認識?Cancel事件是什么情況下觸發的?
- 10.能給我談談Android中坐標體系嗎?
3.16 View繪制機制
- 1.說說View繪制流程,(校招&實習)
- 2.說說Activity View樹結構,
- 3.自定義View的方式有哪些?給我說說你之前專案中的案例,
- 4.invalidate和postvalidate的區別?
- 5.說說你在自定義View時常常重寫的一些方法?
- 6.說說自定義View中如何自定義屬性?
- 7.requestLayout(),onLayout(),onDraw(),drawChild()區別和聯系?
- 8.如何計算出一個View的嵌套層級?
- 9.自定義View如何考慮機型適配?
3.17 布局
- 1.說說Android中有哪些布局 & 特點,(校招&實習)
- 2.你知道布局檔案到控制元件物件的程序嗎?
- 3.有這么一個布局需求,一個文本控制元件放在螢屏一半的一半的中間位置,你如何進行布局?
- 4.LinearLayout,FrameLayout,RelativeLayout性能對比,為什么?
3.18 Binder
- 1.什么是Binder?用來干什么?
- 2.給我具體講講Binder機制,
3.19 影片機制
- 1.Android中的影片分為哪些種類 & 特點 & 缺點,(校招&實習)
- 2.知道SVG & 矢量影片嗎?
- 3.給我說說轉場影片,
- 4.給我談談插值器 & 估值器 的作用,
- 5.說說Android影片框架實作的原理,
3.20 JNI
- 1.什么是JNI?它主要用來干什么,
- 2.Java Native方法如何和Native函式進行系結的?
- 3.JNI如何實作資料傳遞?
- 4.如何全域捕獲Native發生的例外?
- 5.只有C/C++能撰寫Native庫嗎?
3.21 Window & Appliction & Context
- 1.說說你對Android中Window的理解,
- 2.說說你對Application的理解 & 生命周期,
- 3.Android中有哪些背景關系 & 區別 & 作用,
- 4.談談你對Android中Context的理解,
3.22 通知
- 1.Android 8.0如何適配通知?(校招&實習)
- 2.自定義通知流程?
3.23 對話框(Dialog & DialogFragment & PopWindow)
- 1.說說Android中對話框可以用哪些方式完成?(校招&實習)
3.24 藍牙
- 1.說說最新的藍牙版本?新版本的特性是什么?(校招&實習)
3.25 冷啟動&熱啟動
- 1.什么是冷啟動 & 什么是熱啟動 & 它們的流程?
- 2.如何優化冷啟動?
- 3.啟動頁白屏,黑屏,太慢如何解決?
3.26 懸浮窗
- 1.在做懸浮窗的時候你遇到了什么困難(主要指懸浮窗權限適配)?
- 2.如何制作一個懸浮窗?
3.27 Android版本
- 1.最新的Android版本多少知道嗎?有哪些特性(校招&實習)
- 2.說說更新較大的Android版本,
3.28 Android Studio
- 1.你現在比較常用Android Studio那個版本 & 用的Gradle版本是多少?(校招&實習)
- 2.如何理解gradle?
- 3.說說Android Studio中大致專案結構?(校招&實習)
- 4.混淆是什么 & 為什么需要進行混淆 & 混淆的原理 & 為什么Java反射常常會和混淆沖突?
3.29 UI卡頓優化
- 1.ANR是什么?導致原因有哪些?(校招&實習)
- 2.談談你專案中避免ANR的一些經驗,
- 3.分別說說Activity & BroadcastReceiver & Serice最長可耗時時間為多少?
3.30 記憶體優化
- 1.什么是OOM & 什么是記憶體泄漏 & 什么是記憶體抖動?(校招&實習)
- 2.談談你專案中記憶體優化的一些經驗,
3.31 螢屏適配
- 1.說說Android中一些螢屏單位,
- 2.談談你專案中的一些螢屏適配的經驗,
- 3.今日頭條的輕量級適配方案了解嗎 & 給我說說原理,
3.32 多渠道打包 & apk簽名
- 1.apk為什么需要簽名?(校招&實習)
- 2.多渠道打包是什么 & 有類似經驗嗎?
- 3.簡述多渠道打包及原理和常用操作?
3.33 專案架構
- 1.說說你用過的專案架構?(校招&實習)
- 2.分別給我說說MVC,MVP,MVVM特點和區別,
- 3.以登陸界面為例子,設計MVP架構,
- 4.談談AndroidManifest.xml檔案的理解,
- 5.談談你對組件化架構的理解
3.34 Android前沿知識
- 1.谷歌新出的Flutter知道嗎?
- 2.谷歌新出的官方開發語言Kotlin了解嗎 & 和Java相比它有哪些特點,
- 3.談談Kotlin中協程的認識?
- 4.Jetpack組件用過嗎?使用它的好處
3.35 音視頻開發(高薪)
- 1.之前有過音視頻開發經驗嗎 & 說說用哪些開源架子開發的,
- 2.FFmpeng了解過嗎?
- 3.Android中播放視頻音頻的方式有哪些?
- 4.Android中播放網路地址視頻有哪些出色的開源庫?
- 5.流媒體服務器了解嗎?
- 6.談談你對編碼格式的理解,
- 7.MediaPlayer和SoundPool的區別?
- 8.視頻硬解碼和軟解碼的區別?
3.36 熱修復 & 插件化
- 1.Java類加載程序?
- 2.了解哪些熱修復框架 & 使用過哪些 & 說出它們的原理
- 3.談談對 ClassLoader 的理解
- 4.雙親委托機制的好處
- 5.自定義 ClassLoader
- 6.插件化為什么會出現,如何代碼加載,資源加載,代理 Hook?
3.37 其它Android部分有關面試題
- 1.說說一個app的啟動流程(從原始碼角度講解),
- 2.你知道無論是Kotlin或者是Java,程式運行的主要入口都是main()方法,那么Android的main方法在哪里?
- 3.Android Hock技術了解嗎?
- 4.簡述Android中的加固和使用平臺?
- 5.談談你對Apk瘦身的經驗?
- 6.為什么子執行緒不能更新UI?
- 7.你知道如何定位記憶體泄漏嗎?
- 8.說說System.exit(0),onDestory(),Activity.finish()的區別?
- 9.在OnResume或者之前獲取View的寬高為多少 & 為什么?
- 10.Art & Dvm 虛擬機區別,特別是談談GC的區別,
- 11.說說你用的二維碼框架 & 有過優化經驗嗎?
- 12.談談App多行程的好處 & 缺點,
- 13.說說AMS是怎么找到啟動指定的Activity?
- 14.View的getWidth和getMeasureWidth有啥區別?
- 15.有插件化或者熱修復經驗嗎?說說它的原理,
- 16.斷點續傳了解嗎?談談你是如何通過多執行緒實作斷點續傳的,
- 17.給我談談你對SurfaceView的認識,
- 18.什么情況下你會使用到ScrollView,
- 19.低版本SDK如何使用高版本API?
- 20.AlertDialog,PopWindow,Activity之間的區別?
- 21.Application和Activity,Context的區別?
- 22.談談Android中多執行緒通信方式?
- 23.說說Android大體的架構圖,試著畫出來,
- 24.知道SpareArray嗎?
- 25.Activity除了setContentView可以設定布局,還有其它方式嗎?
- 26.Android為每個應用程式分配的記憶體大小為多少?
- 27.Android行程保活方案?
- 28.談談Android系統安裝apk的程序?
- 29.Activity,Window,View三者的關系?
- 30.ActivityThread,ActivityManagerService,WindowManagerService的作業原理?
- 31.PackageManagerService的作業原理?
- 32.PowerManagerService的作業原理?
- 33.在桌面點擊一個未啟動的App的流程 & 點擊一個已啟動的App的流程?
- 34.Android中行程分為哪些種類?
- 35.什么是埋點,懂點它的原理嗎?
- 36.行程和Application生命周期之間的關系?
- 37.App相互喚醒的有哪些方式?
- 38.Android中如何開啟多行程?應用是否可以開啟N個行程?
- 39.談談訊息推送的方式有哪些?
- 40.談談你對Root權限的理解,
- 41.談談專案如何進行國際化?
- 42.談談你對Intent和IntentFilter的理解,
- 43.一條最長的短資訊約占多少byte?
- 44.如何理解組件化設計思想?
- 45.如何判斷app首次啟動,切換至后臺,后臺切換至前臺?
3.38 經驗相關面試題
- 1.請至少說出5種常見的app奔潰的原因 & 以及解決方案,
- 2.請說出你專案中用到的資料持久化技術有哪些?
- 3.在以往的專案中有沒有特別難以解決的問題,最后如何解決的?
- 4.請至少例舉出5種記憶體泄漏情況,
- 5.熟悉Monkey測驗嗎?單元測驗呢?如何實作?
- 6.如何區分app環境(測驗環境 & 開發環境)?
- 7.平時采用什么方式除錯后端的介面?
- 8.說說你對開發app除錯心得?
- 9.使用過哪些性能優化工具?
- 10.你如何區分app環境(debug & release等)
3.39 安全 & 性能優化
- 1.你認為混淆的作用有哪些?
- 2.app加固用過哪些 & 加固的原理
- 3.談談你的app性能優化心得(具體可以談網路,記憶體,app瘦身,卡頓,布局優化等等)
3.40 Gradle
- 1.gradle是什么?
- 2.gradle是基于什么編程語言的?對它熟悉嗎?
- 3.gradle支持了Kotlin了,有用過嗎?
- 4.gradle能幫你做什么事情?你有自己自定義過嗎?

由于文章內容比較多,篇幅不允許,部分未展示內容以截圖方式展示 ,如有需要獲取完整的資料檔案的朋友點擊我的GitHub免費獲取,
4.移動UI框架部分(Flutter為主)
Dart
1. Dart 當中的 「…」表示什么意思? Dart 當中的 「…」意思是 「級聯運算子」,為了方便配置而使用,「…」和「.」不同的是 呼叫「…」后回傳的相當于是 this,而「.」回傳的則是該方法回傳的值 ,
2. Dart 的作用域 Dart 沒有 「public」「private」等關鍵字,默認就是公開的,私有變數使用 下劃線 _開頭,
3. Dart 是不是單執行緒模型?是如何運行的? Dart 是單執行緒模型,運行的的流程如下圖,

簡單來說,Dart 在單執行緒中是以訊息回圈機制來運行的,包含兩個任務佇列,一個是“微任務佇列” microtask queue,另一個叫做“事件佇列” event queue,
當Flutter應用啟動后,訊息回圈機制便啟動了,首先會按照先進先出的順序逐個執行微任務佇列中的任務,當所有微任務佇列執行完后便開始執行事件佇列中的任務,事件任務執行完畢后再去執行微任務,如此回圈往復,生生不息,
4. Dart 是如何實作多任務并行的? 前面說過, Dart 是單執行緒的,不存在多執行緒,那如何進行多任務并行的呢?其實,Dart的多執行緒和前端的多執行緒有很多的相似之處,Flutter的多執行緒主要依賴Dart的并發編程、異步和事件驅動機制,

簡單的說,在Dart中,一個Isolate物件其實就是一個isolate執行環境的參考,一般來說我們都是通過當前的isolate去控制其他的isolate完成彼此之間的互動,而當我們想要創建一個新的Isolate可以使用Isolate.spawn方法獲取回傳的一個新的isolate物件,兩個isolate之間使用SendPort相互發送訊息,而isolate中也存在了一個與之對應的ReceivePort接受訊息用來處理,但是我們需要注意的是,ReceivePort和SendPort在每個isolate都有一對,只有同一個isolate中的ReceivePort才能接受到當前類的SendPort發送的訊息并且處理,
5. 說一下Dart異步編程中的 Future關鍵字? 前面說過,Dart 在單執行緒中是以訊息回圈機制來運行的,其中包含兩個任務佇列,一個是“微任務佇列” microtask queue,另一個叫做“事件佇列” event queue,
在Java并發編程開發中,經常會使用Future來處理異步或者延遲處理任務等操作,而在Dart中,執行一個異步任務同樣也可以使用Future來處理,在 Dart 的每一個 Isolate 當中,執行的優先級為 : Main > MicroTask > EventQueue,
6. 說一下Dart異步編程中的 Stream資料流? 在Dart中,Stream 和 Future 一樣,都是用來處理異步編程的工具,它們的區別在于,Stream 可以接收多個異步結果,而Future 只有一個, Stream 的創建可以使用 Stream.fromFuture,也可以使用 StreamController 來創建和控制,還有一個注意點是:普通的 Stream 只可以有一個訂閱者,如果想要多訂閱的話,要使用 asBroadcastStream(),
7. Stream 有哪兩種訂閱模式?分別是怎么呼叫的? Stream有兩種訂閱模式:單訂閱(single) 和 多訂閱(broadcast),單訂閱就是只能有一個訂閱者,而廣播是可以有多個訂閱者,這就有點類似于訊息服務(Message Service)的處理模式,單訂閱類似于點對點,在訂閱者出現之前會持有資料,在訂閱者出現之后就才轉交給它,而廣播類似于發布訂閱模式,可以同時有多個訂閱者,當有資料時就會傳遞給所有的訂閱者,而不管當前是否已有訂閱者存在,
Stream 默認處于單訂閱模式,所以同一個 stream 上的 listen 和其它大多數方法只能呼叫一次,呼叫第二次就會報錯,但 Stream 可以通過 transform() 方法(回傳另一個 Stream)進行連續呼叫,通過 Stream.asBroadcastStream() 可以將一個單訂閱模式的 Stream 轉換成一個多訂閱模式的 Stream,isBroadcast 屬性可以判斷當前 Stream 所處的模式,
8. await for 如何使用? await for是不斷獲取stream流中的資料,然后執行回圈體中的操作,它一般用在直到stream什么時候完成,并且必須等待傳遞完成之后才能使用,不然就會一直阻塞,
Stream<String> stream = new Stream<String>.fromIterable(['不開心', '面試', '沒', '過']);
main() async{
await for(String s in stream){
print(s);
}
}
復制代碼
9. 說一下 mixin機制? mixin 是Dart 2.1 加入的特性,以前版本通常使用abstract class代替,簡單來說,mixin是為了解決繼承方面的問題而引入的機制,Dart為了支持多重繼承,引入了mixin關鍵字,它最大的特殊處在于: mixin定義的類不能有構造方法,這樣可以避免繼承多個類而產生的父類構造方法沖突,
mixins的物件是類,mixins絕不是繼承,也不是介面,而是一種全新的特性,可以mixins多個類,mixins的使用需要滿足一定條件,
可以參考Flutter基礎知識之Dart語音基礎
Flutter
1. 請簡單介紹下Flutter框架,以及它的優缺點? Flutter是Google推出的一套開源跨平臺UI框架,可以快速地在Android、iOS和Web平臺上構建高質量的原生用戶界面,同時,Flutter還是Google新研發的Fuchsia作業系統的默認開發套件,在全世界,Flutter正在被越來越多的開發者和組織使用,并且Flutter是完全免費、開源的,Flutter采用現代回應式框架構建,其中心思想是使用組件來構建應用的UI,當組件的狀態發生改變時,組件會重構它的描述,Flutter會對比之前的描述,以確定底層渲染樹從當前狀態轉換到下一個狀態所需要的最小更改,
優點
- 熱多載(Hot Reload),利用Android Studio直接一個ctrl+s就可以保存并多載,模擬器立馬就可以看見效果,相比原生冗長的編譯程序強很多;
- 一切皆為Widget的理念,對于Flutter來說,手機應用里的所有東西都是Widget,通過可組合的空間集合、豐富的影片庫以及分層課擴展的架構實作了富有感染力的靈活界面設計;
- 借助可移植的GPU加速的渲染引擎以及高性能本地代碼運行時以達到跨平臺設備的高質量用戶體驗, 簡單來說就是:最終結果就是利用Flutter構建的應用在運行效率上會和原生應用差不多,
缺點
- 不支持熱更新;
- 三方庫有限,需要自己造輪子;
- Dart語言撰寫,增加了學習難度,并且學習了Dart之后無其他用處,相比JS和Java來說,
2. 介紹下Flutter的理念架構 其實也就是下面這張圖,

由上圖可知,Flutter框架自下而上分為Embedder、Engine和Framework三層,其中,Embedder是作業系統適配層,實作了渲染 Surface設定,執行緒設定,以及平臺插件等平臺相關特性的適配;Engine層負責圖形繪制、文字排版和提供Dart運行時,Engine層具有獨立虛擬機,正是由于它的存在,Flutter程式才能運行在不同的平臺上,實作跨平臺運行;Framework層則是使用Dart撰寫的一套基礎視圖庫,包含了影片、圖形繪制和手勢識別等功能,是使用頻率最高的一層,
3. 介紹下FFlutter的FrameWork層和Engine層,以及它們的作用
Flutter的FrameWork層是用Drat撰寫的框架(SDK),它實作了一套基礎庫,包含Material(Android風格UI)和Cupertino(iOS風格)的UI界面,下面是通用的Widgets(組件),之后是一些影片、繪制、渲染、手勢庫等,這個純 Dart實作的 SDK被封裝為了一個叫作 dart:ui的 Dart庫,我們在使用 Flutter寫 App的時候,直接匯入這個庫即可使用組件等功能,
Flutter的Engine層是Skia 2D的繪圖引擎庫,其前身是一個向量繪圖軟體,Chrome和 Android均采用 Skia作為繪圖引擎,Skia提供了非常友好的 API,并且在圖形轉換、文字渲染、位圖渲染方面都提供了友好、高效的表現,Skia是跨平臺的,所以可以被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS閉源的 Core Graphics / Core Animation,Android自帶了 Skia,所以 Flutter Android SDK要比 iOS SDK小很多,
4. 介紹下Widget、State、Context 概念
- Widget:在Flutter中,幾乎所有東西都是Widget,將一個Widget想象為一個可視化的組件(或與應用可視化方面互動的組件),當你需要構建與布局直接或間接相關的任何內容時,你正在使用Widget,
- Widget樹:Widget以樹結構進行組織,包含其他Widget的widget被稱為父Widget(或widget容器),包含在父widget中的widget被稱為子Widget,
- Context:僅僅是已創建的所有Widget樹結構中的某個Widget的位置參考,簡而言之,將context作為widget樹的一部分,其中context所對應的widget被添加到此樹中,一個context只從屬于一個widget,它和widget一樣是鏈接在一起的,并且會形成一個context樹,
- State:定義了StatefulWidget實體的行為,它包含了用于”互動/干預“Widget資訊的行為和布局,應用于State的任何更改都會強制重建Widget,
5. 簡述Widget的StatelessWidget和StatefulWidget兩種狀態組件類
-
StatelessWidget: 一旦創建就不關心任何變化,在下次構建之前都不會改變,它們除了依賴于自身的配置資訊(在父節點構建時提供)外不再依賴于任何其他資訊,比如典型的Text、Row、Column、Container等,都是StatelessWidget,它的生命周期相當簡單:初始化、通過build()渲染,
-
StatefulWidget: 在生命周期內,該類Widget所持有的資料可能會發生變化,這樣的資料被稱為State,這些擁有動態內部資料的Widget被稱為StatefulWidget,比如復選框、Button等,State會與Context相關聯,并且此關聯是永久性的,State物件將永遠不會改變其Context,即使可以在樹結構周圍移動,也仍將與該context相關聯,當state與context關聯時,state被視為已掛載,StatefulWidget由兩部分組成,在初始化時必須要在createState()時初始化一個與之相關的State物件,
6. StatefulWidget 的生命周期 Flutter的Widget分為StatelessWidget和StatefulWidget兩種,其中,StatelessWidget是無狀態的,StatefulWidget是有狀態的,因此實際使用時,更多的是StatefulWidget,StatefulWidget的生命周期如下圖,

- initState():Widget 初始化當前 State,在當前方法中是不能獲取到 Context 的,如想獲取,可以試試 Future.delayed()
- didChangeDependencies():在 initState() 后呼叫,State物件依賴關系發生變化的時候也會呼叫,
- deactivate():當 State 被暫時從視圖樹中移除時會呼叫這個方法,頁面切換時也會呼叫該方法,和Android里的 onPause 差不多,
- dispose():Widget 銷毀時呼叫,
- didUpdateWidget:Widget 狀態發生變化的時候呼叫,
7. 簡述Widgets、RenderObjects 和 Elements的關系 首先看一下這幾個物件的含義及作用,
- Widget :僅用于存盤渲染所需要的資訊,
- RenderObject :負責管理布局、繪制等操作,
- Element :才是這顆巨大的控制元件樹上的物體,
Widget會被inflate(填充)到Element,并由Element管理底層渲染樹,Widget并不會直接管理狀態及渲染,而是通過State這個物件來管理狀態,Flutter創建Element的可見樹,相對于Widget來說,是可變的,通常界面開發中,我們不用直接操作Element,而是由框架層實作內部邏輯,就如一個UI視圖樹中,可能包含有多個TextWidget(Widget被使用多次),但是放在內部視圖樹的視角,這些TextWidget都是填充到一個個獨立的Element中,Element會持有renderObject和widget的實體,記住,Widget 只是一個配置,RenderObject 負責管理布局、繪制等操作,
在第一次創建 Widget 的時候,會對應創建一個 Element, 然后將該元素插入樹中,如果之后 Widget 發生了變化,則將其與舊的 Widget 進行比較,并且相應地更新 Element,重要的是,Element 不會被重建,只是更新而已,
8. 什么是狀態管理,你了解哪些狀態管理框架? Flutter中的狀態和前端React中的狀態概念是一致的,React框架的核心思想是組件化,應用由組件搭建而成,組件最重要的概念就是狀態,狀態是一個組件的UI資料模型,是組件渲染時的資料依據,
Flutter的狀態可以分為全域狀態和區域狀態兩種,常用的狀態管理有ScopedModel、BLoC、Redux / FishRedux和Provider,詳細使用情況和差異可以自行了解,
9. 簡述Flutter的繪制流程
Flutter的繪制流程如下圖所示,

Flutter只關心向 GPU提供視圖資料,GPU的 VSync信號同步到 UI執行緒,UI執行緒使用 Dart來構建抽象的視圖結構,這份資料結構在 GPU執行緒進行圖層合成,視圖資料提供給 Skia引擎渲染為 GPU資料,這些資料通過 OpenGL或者 Vulkan提供給 GPU,
10. 簡述Flutter的執行緒管理模型 默認情況下,Flutter Engine層會創建一個Isolate,并且Dart代碼默認就運行在這個主Isolate上,必要時可以使用spawnUri和spawn兩種方式來創建新的Isolate,在Flutter中,新創建的Isolate由Flutter進行統一的管理, 事實上,Flutter Engine自己不創建和管理執行緒,Flutter Engine執行緒的創建和管理是Embeder負責的,Embeder指的是將引擎移植到平臺的中間層代碼,Flutter Engine層的架構示意圖如下圖所示,

在Flutter的架構中,Embeder提供四個Task Runner,分別是Platform Task Runner、UI Task Runner Thread、GPU Task Runner和IO Task Runner,每個Task Runner負責不同的任務,Flutter Engine不在乎Task Runner運行在哪個執行緒,但是它需要執行緒在整個生命周期里面保持穩定,
11. Flutter 是如何與原生Android、iOS進行通信的? Flutter 通過 PlatformChannel 與原生進行互動,其中 PlatformChannel 分為三種:
- BasicMessageChannel :用于傳遞字串和半結構化的資訊,
- MethodChannel :用于傳遞方法呼叫(method invocation),
- EventChannel : 用于資料流(event streams)的通信,
同時 Platform Channel 并非是執行緒安全的 ,更多詳細可查閱閑魚技術的 《深入理解Flutter Platform Channel》
12. 簡述Flutter 的熱多載 Flutter 的熱多載是基于 JIT 編譯模式的代碼增量同步,由于 JIT 屬于動態編譯,能夠將 Dart 代碼編譯成生成中間代碼,讓 Dart VM 在運行時解釋執行,因此可以通過動態更新中間代碼實作增量同步,
熱多載的流程可以分為 5 步,包括:掃描工程改動、增量編譯、推送更新、代碼合并、Widget 重建,Flutter 在接收到代碼變更后,并不會讓 App 重新啟動執行,而只會觸發 Widget 樹的重新繪制,因此可以保持改動前的狀態,大大縮短了從代碼修改到看到修改產生的變化之間所需要的時間,
另一方面,由于涉及到狀態的保存與恢復,涉及狀態兼容與狀態初始化的場景,熱多載是無法支持的,如改動前后 Widget 狀態無法兼容、全域變數與靜態屬性的更改、main 方法里的更改、initState 方法里的更改、列舉和泛型的更改等,
可以發現,熱多載提高了除錯 UI 的效率,非常適合寫界面樣式這樣需要反復查看修改效果的場景,但由于其狀態保存的機制所限,熱多載本身也有一些無法支持的邊界,
5.演算法與資料結構部分
5.1 復雜度分析
- 1.什么是時間復雜度 & 什么是空間復雜度?(校招&實習)
- 2.時間復雜度和空間復雜度之間存在什么聯系?(校招&實習)
5.2 陣列
- 1.談談你對陣列的理解,(校招&實習)
5.3 鏈表
- 1.什么是單鏈表 & 雙向鏈表 & 回圈鏈表 & 雙向回圈鏈表 & 靜態鏈表,(校招&實習)
- 2.反轉一個鏈表有哪些方式?
- 3.如何判斷鏈表有環?
- 4.用Java語言設計一個LinkedList,
5.4 堆
- 1.如何理解堆?
5.5 堆疊
- 1.什么是堆疊 & 堆疊的特點是什么?(校招&實習)
- 2.什么是順序堆疊 & 鏈式堆疊?
- 3.你有沒有基于堆疊封裝的業務類?
- 4.你能用堆疊實作佇列嗎?
- 5.如何實作瀏覽器前進和后退功能?
5.6 佇列
- 1.什么是佇列 & 佇列的特點是什么?(校招&實習)
- 2.什么是優先佇列?
- 3.什么是雙端佇列 & 阻塞佇列?
- 4.你能用佇列實作堆疊嗎?
5.7 散串列
- 1.什么是散列函式?(校招&實習)
- 2.什么是散列沖突?解決的方式有哪些?Java中的HashMap解決方式采用的哪一種?
- 3.什么是散串列的動態擴容?
- 4.什么是位圖?
5.8 樹
- 1.什么是二叉樹?(校招&實習)
- 2.什么是先序遍歷 & 中序遍歷 & 后序遍歷,
- 3.什么是多路查找樹?
- 4.什么是紅黑樹?
5.9 排序
- 1.給我說說你會的排序 & 復雜度如何?(校招&實習)
- 2.現在有10萬條資料需要進行排序,你會選擇什么排序?(校招&實習)
5.10 查找
- 1.說說你知道的查找演算法 & 復雜度如何?(校招&實習)
5.11 遞回&回溯演算法
- 1.什么是遞回 & 什么是回溯?(校招&實習)
5.12 貪心演算法
- 1.什么是貪心演算法?(校招&實習)
5.13 其它有關演算法與資料結構的面試題
- 1.什么是圖?可以解決一些什么問題?(校招&實習)
- 2.時針走一圈,時針分針重合幾次?
- 3.有一個不均勻的繩子燒完要1個小時,如何算出1小時15分鐘?
- 4.求1000以內的水仙花數以及40億以內的水仙花數?
- 5.資料怎么壓縮,資料的安全,
- 6.談談你對對稱加密 & 非對稱加密的理解,
6.常用的開源庫部分
6.1 異步通信
- 1.RxJava用法 & RxJava2用法 & 原理 &用到的設計模式?
- 2.EventBus用法 & 原理,
6.2 網路
- 1.OkHttp用法 & 原始碼分析,
- 2.Retrofit用法 & 原始碼分析,
- 3.Volley用法 & 缺點,
- 4.OkHttp的請求分為哪2種?區別是什么?
- 5.談談Okhttp的分發器有什么作用?
- 6.談談OkHttp的5個內部攔截器的作用?
- 7.OkHttp的攔截器鏈了解嗎?給我談談它
- 8.OkHttp的應用攔截器和網路攔截器是什么?分別說說它們的作用
- 9.OkHttp如何實作WebSocket?
- 10.Retrofit網路請求層用的什么?
- 11.Retrofit中使用了哪些設計模式?
6.3 依賴注入
- 1.ButterKnife用法 & 原理,
- 2.Dagger2用法 & 原理,
- 3.最新版本的ButterKnife用到是注解+反射還是注解+APT?
6.4 圖片加載
- 1.Glide用法 & 原理,
- 2.Picasso用法 & 原理,
- 3.Fresco用法 & 原理,
- 4.在使用Glide的時候with方法中傳入Activity的背景關系和Application的背景關系有什么區別?
- 5.談談Glide中使用的LruCache演算法?
- 6.Glide和Picasso的區別,
- 7.談談Glide的快取策略,
- 8.當一個Activity退出時(執行了onDestory方法銷毀了),那么Glide如何正確監聽Activity生命周期從而準確回收圖片資源呢?
- 9.Glide為什么不會導致OOM呢?
- 10.手寫簡單的LRU演算法代碼,
- 11.Picasso中的tag有什么用處?
- 12.Picasso內部下載圖片使用的網路庫是什么?
6.5 資料庫
- 1.GreenDao用法 & 原理,
- 2.LitePal用法 & 原理,
- 3.OrmLite用法 & 原理,
- 4.DBFlow用法 & 原理,
- 5.Realm用法 & 原理,
- 6.如果讓你封裝一個資料庫框架,你會如何進行封裝?
6.6 其它
- 1.分享你覺得比較好用的開源庫,(校招&實習)
- 2.自己有封裝庫嗎?給我說說你是如何設計的?
- 3.你是如何設計一個網路請求框架的?
- 4.SDK開發和App開發有什么區別?
- 5.現在有一個組件化專案,模塊之間通信用EventBus有缺點為什么(指的是耦合性高,當然事件下沉可以解決,但此處不是這個意思) & 解決方案?
7.計算機網路部分
- 1.給我介紹5層網路模型,試著說說https加密程序 & 為什么https比http要安全?(校招&實習)
- 2.Http/Https協議作業在哪一層?IP協議作業在哪一層?應用層有哪些協議?(校招&實習)
- 3.TCP/UDP協議作業在哪一層?(校招&實習)
- 4.給我說說三次握手和四次揮手,(校招&實習)
- 5.什么是請求頭 & 回應頭 ? 說說請求頭中一些重要的欄位,(校招&實習)
- 6.什么是Cookie & Session & Token,
- 7.知道什么是心跳檢測嗎?
- 8.Http和Https的區別?(校招&實習)
- 9.加密協議TLS/SSL加密程序是怎樣的?(校招&實習)
- 10.什么是DNS & 作用是什么 &作業機制?(校招&實習)
- 11.瀏覽器訪問一個url網址所經歷的程序是什么?(校招&實習)
- 12.Socket是協議嗎?WebSocket是協議嗎?它們的區別是什么?
- 13.Json決議方式有哪些?比較它們的優劣勢,
- 14.XML決議方式有哪些?比較它們的優劣勢,
- 15.http1.x & http 2.0區別是什么?
- 16.說說HTTP快取的原理,
- 17.如果有個100M大的檔案,需要上傳至服務器中,而服務器form表單最大只能上傳2M,可以使用什么方法?
- 18.說說你專案中即時通訊的方案有哪些?
- 19.為什么是三次握手而不是兩次,四次握手或者更多次呢?
- 20.用過哪些抓包工具?
- 21.講講你如何封裝專案中的網路請求,
- 22.如何做斷點續傳?
- 23.如何下載檔案 & 上傳檔案?如果檔案過大如何解決?
- 24.有Socket編程經驗嗎?談談Socket編程
- 25.你知道的訊息推送方案有哪些?說說自己實作過哪些?怎么實作的?
- 26.短輪詢 & 長輪詢 & 區別 & 優缺點 & 有哪些能替代輪詢的良好方案,
- 27.談談Http快取問題,在頭部中有哪些關于快取的重要欄位,說說它的作用,
- 28.http(s)請求資料過慢可以從哪些方面進行優化(主要考察網路請求程序的理解)

由于文章內容比較多,篇幅不允許,部分未展示內容以截圖方式展示 ,如有需要獲取完整的資料檔案的朋友點擊我的GitHub免費獲取,
喜歡本文的讀者,記得給個關注+點贊,整理不易,且行且珍惜!
在CSDN看到好的文章,又點贊的讀者,思想都比一般人豁達!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/262586.html
標籤:其他
