Android應用開發面試題(持續更新)
一 Android知識
1、簡述binder機制
Linux裡幾種比較常見的IPC方式比如有:共享記憶體,訊號,Socket,管道(pipe),訊息佇列等
其中共享記憶體,顧名思義就是多個程序共享一塊記憶體,大家有什麼改變就直接在這塊共同記憶體裡改,這樣看起來十分方便,資料也無需任何的拷貝,但是共享一塊記憶體,安全性上顯然會出很多問題,必須做好程序同步等問題,所以控制起來比較複雜。
而Socket,即套接字,我們一般都是在網路請求,網路通訊的時候使用它,如果使用它來實現同一機器上的程序間通訊,由於他傳輸效率較低,顯然開銷會很大,不適合我們這裡所說的程序間的通訊。
其次就是管道,訊息佇列等,利用他們實現傳輸通訊,都需要把資料先從傳送方的快取區copy到核心開闢的快取區,然後再從核心開闢的快取區copy到接收方的快取區,這樣經過兩次的copy才能實現程序間的通訊,所以傳輸效能上並不優秀。
傳統的IPC,並沒有給傳送方程序分配UID和PID(即使用者ID和程序ID),而是在傳送的時候由使用者填入資料包,這就給程式留下風險,即存在資料在放鬆過程中PID被修改的可能,也就是接收方無法獲取可靠的傳送方的UID和PID(無法鑑定身份),而安卓為每一個應用程式到分配好UID,這樣當這個程序產生時他就已經有了一個唯一的PID,所以是可靠的。
Binder由四部分組成:Binder客戶端、Binder服務端、Binder驅動、Service Manager服務登記查詢模組。
Binder機制下的兩個程序之間的通訊基本就是上面那樣一個過程:即服務端定義服務,客戶端通過獲取服務端的物件引用的方式(通過中介Binder驅動),然後就可以呼叫服務端定義的各種服務。
2、Application執行onCreate次數
一個apk應用我們都是預設開啟一個程序,其程序名為AndroidMainfest.xml檔案中指定的應用包名,所有的基本元件都是在這個程序中進行,application會被執行一次。但是如果我們工程涉及到多程序,那麼就會出現application的oncreate多次被呼叫情況,有多少程序,就執行多少次onCreate。可以在onCreate中新增條件,是主程序才執行onCreate邏輯。
3、Activity與Service是否處於同一程序?
一般來說:同一個包內的activity和service,如果service沒有設定屬性android:process=":remote"的話,service會和activity跑在同一個程序中,由於一個程序只有一個UI執行緒,所以,service和acitivity就是在同一個執行緒裡面的。android:process=":remote"值得注意他的用法!!!如果Activity想訪問service中的物件或方法,如果service設定屬性android:process=":remote",那麼就是跨程序訪問,不同程序擁有各自獨立的虛擬機器,Application,記憶體空間,
4、android系統啟動後的第一個java程序
zygote是系統啟動後的第一個java程序,是由init啟動的
5、android跨程序通訊方式
名稱 | 優點 | 缺點 | 使用場景 |
Bundle | 簡單易用 | 只能支援Bundle支援對資料型別 | 四大元件程序間通訊 |
檔案共享 | 簡單易用 | 不適合高併發場景,無法做到程序間對實時通訊 | 沒有併發對情景,交換簡單對資料 |
AIDL | 功能強大,支援一對多對併發通訊,支援實時通訊 | 使用稍複雜,需要處理好執行緒同步問題 | 一對多的通訊且有RPC需求 |
Messager | 功能一般,支援一對多對併發通訊,支援實時通訊 | 不能很好處理並發現象,不支援RPC,只能支援Bundle支援對資料型別 | 低併發對一對多即時通訊,無RPC需求 |
ContentProvider | 資料訪問方面功能強大,支援一對多對併發資料共享 | 守約束對AIDL,主要提供資料來源對CRUD操作 | 一對多的程序間的資料共享 |
Socket | 功能強大,可通過網路傳輸位元組流,支援一對多對併發通訊 | 繁瑣,不支援直接對RPC | 網路資料交換 |
這裡再對比總結一下:
- 只有允許不同應用的客戶端用 IPC 方式呼叫遠端方法,並且想要在服務中處理多執行緒時,才有必要使用
AIDL
- 如果需要呼叫遠端方法,但不需要處理併發 IPC,就應該通過實現一個
Binder
建立介面
- 如果您想執行 IPC,但只是傳遞資料,不涉及方法呼叫,也不需要高併發,就使用
Messenger
來實現介面
- 如果需要處理一對多的程序間資料共享(主要是資料的 CRUD),就使用
ContentProvider
- 如果要實現一對多的併發實時通訊,就使用
Socket
RPC 即 Remote Procedure Call (遠端過程呼叫) 是一種計算機通訊協議,它為我們定義了計算機 C 中的程式如何呼叫另外一臺計算機 S 的程式,讓程式設計師不需要操心底層網路協議,使得開發包括網路分散式多程式在內的應用程式更加容易。
RPC 是典型的 Client/Server 模式,由客戶端對伺服器發出若干請求,伺服器收到後根據客戶端提供的引數進行操作,然後將執行結果返回給客戶端。