面試官這一套 Framework 連環炮;看看你能撐到第幾步?

引言

最近在後臺上

看到有很多人

留言

,說在

面試或者晉升

考核中都遇到了關於

Handler、Binder

機制的

難題

,相信大家在

金九銀十

這個

面試季

中也會遇到類似的

難題

,現在

面試官

問題

都是根據你做過的

專案

進行深入探討,如若對

技術原理

底層邏輯

沒有深入瞭解的話,那麼你透過面試的機會會

顯著下降

近期也是

收集並整理

了關於

Android Framework

的邏輯

知識點

總結和

Handler、Binder

機制的

學習手冊

,相信能夠解決大家對

底層邏輯,技術原理,原始碼解析,面試真題

等等相關技術知識點得不夠了解透徹的問題,下面為大家展示一下

Handler、Binder

機制的相關

面試真題例項

面試真題例項

Handler 被設計出來的原因?有什麼用?

一種東西被設計出來肯定就有它存在的意義,而 Handler 的意義就是切換執行緒

作為

Android 訊息機制

的主要成員,它管理著所有與

介面

有關的

訊息事件

常見的使用場景有:

跨程序

之後的

介面訊息處理

比如

Activity 的啟動

,就是

AMS

在進行

程序間通訊

的時候,透過

Binder 執行緒

將訊息傳送 ApplicationThread 的訊息處理者

Handler

,然後再將訊息

分發

給主執行緒中去

執行

網路互動

後切換到

主執行緒

進行

UI 更新

子執行緒

網路操作之後,需要切換到

主執行緒

進行

UI 更新

總之一句話,Hanlder 的存在就是為了解決在子執行緒中無法訪問 UI 的問題

Handler 執行緒是如何切換的?

假設現在有一個執行緒 A

,在 A 執行緒中透過 Looper。prepare 和 Looper。loop 來開啟 Looper,並且在A執行緒中例項化出來一個 Handler

Looper.prepare() 方法被呼叫時會為會初始化 Looper 併為 ThreadLocal 設定 Looper

,此時 ThreadLocal 中就儲存了 A 執行緒的 Looper;另外 MessageQueue 也會在 Looper 中被初始化

接著當呼叫 Loop.loop 方法時

,loop 方法會透過 myLooper 得到A執行緒中的 Looper,進而拿到 Looper 中的 MessageQueue,接著開啟死迴圈等待執行 MessageQueue 中的方法

此時,再開啟一個執行緒 B

,並在 B 執行緒中透過 Handler 傳送出一個 Message,這個 Message 最終會透過 sendMessageAtTime 方法呼叫到 MessageQueue 的 equeueMessage 方法將訊息插入到佇列

由於

Loope r的 loop 是一個死迴圈

,當 MessageQueue 中被插入訊息的時候,loop 方法就會取出 MessageQueue 中的訊息,並執行 callback;而此時,Looper 是 A 執行緒的 Looper,進而呼叫的 Message 或者 Handler 的 Callback 都是執行在 A 線成中的;以此達到了

執行緒的切換

Handler 記憶體洩漏的原因是什麼?

通常在使用 Handler 的時候回透過匿名內部類的方式來例項化 Handler

,而非靜態的匿名內部類預設持有外部類的引用,即匿名內部類 Handler 持有了外部類;而導致

記憶體洩漏

的根本原因是是因為

Handler 的生命週期與宿主的生命週期不一致

比如說在

Activity 中例項化

了一個

非靜態

匿名內部類 Handler

,然後透過 Handler 傳送了一個

延遲訊息

,但是在訊息還未執行時結束了 Activity

此時由於 Handler 持有 Activity

,就會導致 Activity 無法被 GC 回收,也就是出現了

記憶體洩漏

的問題

什麼是 Binder?

直觀來說,

Binder 是 Android

中的一個

,它

繼承了 IBinder 介面

從 IPC 角度來說:

Binder

Android

中的一種

跨程序通訊方式

,Binder 還可以理解為一種

虛擬

物理裝置

,它的裝置驅動是 /dev/binder,該通訊方式在 linux 中沒有

從 Android Framework 角度來說:

Binder 是 ServiceManager 連線各種 Manager(ActivityManager、WindowManager,etc)和相應ManagerService 的橋樑

從 Android 應用層來說:

Binder

客戶端和服務端

進行通訊的

媒介

,當你 bindService 的時候,服務端會返回一個包含了服務端業務呼叫的 Binder 物件,透過這個 Binder 物件,客戶端就可以獲取服務端提供的服務或者資料,這裡的服務包括普通服務和基於 AIDL 的服務

為什麼要使用 Binder?

效能:

移動裝置

中如果廣泛的使用

跨程序通訊機制

肯定會對通訊機制提出嚴格的要求,而 Binder 相比較傳統的程序通訊方式更加的高效

安全:

由於

傳統程序通訊方式

沒有對通訊的

雙方和身方

做出嚴格的

驗證

,只有上層協議才會去架構,如 socket 連線的 IP 地址可以人為的偽造;而

Binder 身份校驗也是 android 許可權模式的基礎

Binder 的工作流程是什麼樣的?

性客戶端首先獲取伺服器端的代理物件

,所謂的代理物件實際上就是在

客戶端

建立一個服務端的

“引用”

,該代理物件具有

服務端的功能

,使其在客戶端訪問服務端的方法就像訪問本地方法一樣

性客戶端

透過呼叫伺服器代理物件的方式向伺服器端傳送請求

性代理物件將使用者請求

透過 Binder 驅動傳送到伺服器程序

性伺服器程序處理使用者請求

,並透過 Binder 驅動返回處理結果給客戶端的伺服器代理物件

隨著面試過程中你的回答

面試官

就會聯想到更多的

技術知識點

,以此來了解你的

技術面有多廣

適不適合該職位

,或者能不能往

更高的職位

上發展,

全方位

考察

你對

技術

理解深度

,以及

解決問題的能力

為了幫助大家更好學習

Android Framework 框架層

必備的

底層邏輯,技術原理,原始碼解析,面試真題

等等相關技術知識點相關的問題,這裡

特別提供

一份由

騰訊大佬

所整理的一張

Android Framework 思維導圖

及其

配套

的一份

學習手冊

;有需要

思維導圖及學習手冊

的朋友:

可以私信傳送 “進階”

即可 直達獲取

;希望大家看完之後,能夠

查漏補缺

思維導圖及學習手冊內容展示如下:

Android Framework 思維導圖

面試官這一套 Framework 連環炮;看看你能撐到第幾步?

高畫質版 Android Framework 思維導圖獲取方式:私信傳送 “進階”即可 直達獲取

從原始碼角度談談 Handler 的應用

Handler 的應用

執行緒間的通訊

實現延時操做

使用

HandlerThread

在非同步執行緒執行耗時操做

使用

Handler

機制檢測應用中的卡頓問題

Handler 使用注意事項

面試官這一套 Framework 連環炮;看看你能撐到第幾步?

Handler 機制之 Thread

執行緒概念

Android 執行緒的實現

執行緒的阻塞

關於執行緒上下文切換

關於執行緒的安全問題

守護執行緒

執行緒的記憶體

面試官這一套 Framework 連環炮;看看你能撐到第幾步?

完整版 Android Framework 思維導圖及學習手冊 獲取方式:私信傳送 “進階”即可 直達獲取

Handler 機制之 ThreadLocal

Java 中的 ThreadLocal

ThreadLocal 的前世今生

Android 中的 ThreadLocal

Android 面試中的關於 ThreadLocal 的問題

ThreadLocal 的結構

ThreadLocal 靜態類 ThreadLocal。Values

ThreadLocal 的總結

面試官這一套 Framework 連環炮;看看你能撐到第幾步?

應用程式與 AMS 的通訊實現

從應用程式程序到管理者程序

應用程式程序向管理者程序傳送訊息

從管理者程序到應用程式程序

管理者程序嚮應用程式程序傳送訊息

使用者程序接收訊息

面試官這一套 Framework 連環炮;看看你能撐到第幾步?

完整版 Android Framework 思維導圖及學習手冊 獲取方式:私信傳送 “進階”即可 直達獲取

應用程序與 WMS 的通訊實現

WindowManagerImpl & WindowManagerGlobal

ViewRootImpl

從應用程序到管理者程序

從管理者程序到應用程序

面試官這一套 Framework 連環炮;看看你能撐到第幾步?

應用程序之間的通訊實現

服務端編寫 AIDL 檔案

編寫 Service

宣告 Service

客戶端編寫 AIDL 檔案

繫結服務,並呼叫

IBinder實現原理

面試官這一套 Framework 連環炮;看看你能撐到第幾步?

完整版 Android Framework 思維導圖及學習手冊 獲取方式:私信傳送 “進階”即可 直達獲取

機遇往往是留給有準備的人,一個好的機遇往往就能讓你一飛沖天;但機遇即使到了你身邊,你卻沒有能力留住它,那麼它還是會從你的身邊溜走,所以我們一定要在有限的時間內,將自己的技術打磨好,不斷的吸取新知識,努力提升自己的知識水平和技術層次,只有這樣,你才能在機遇降臨到你身邊的時候,你才能夠牢牢的抓住它

既然選擇了程式設計師這個行業,那麼你一定要做好充足的準備;要想在人前顯貴,背後所付出的辛勞和汗水就是必須的

Android 架構師之路還能漫長,與君共勉