1. 程式人生 > >Android應用開發面試題(持續更新)

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,記憶體空間,

跨程序訪問容易出現意想不到的問題,還是慎重給service設定屬性android:process=":remote",注意:這裡選擇”remote”這個名字是隨意主觀的,你能用其他名字來讓這個服務在另外的程序中執行。冒號’:’這個字首將把這個名字附加到你的包所執行的標準程序名字的後面作為新的程序名稱。例如一個應用執行在程序com.aoyousatuo.example中,android:process屬性設定為com.rabbit.man,則新的程序名字為com.rabbit.run.

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 模式,由客戶端對伺服器發出若干請求,伺服器收到後根據客戶端提供的引數進行操作,然後將執行結果返回給客戶端。