android程序間通訊--Binder
深入理解之程序間通訊–Binder
同一個程式中的兩個方法能夠直接呼叫的根本原因是處於相同的記憶體空間中。兩個不同的應用程式因為不在同一個程序中,他們是沒有辦法直接通過記憶體地址來訪問到對方的函式和變數的。同一個程序中物件的傳遞是傳遞的記憶體地址,這個地址並不是真正的實體地址,而是邏輯地址,在其他程序中是沒有意義的。既然沒有辦法直接的訪問對方程序的記憶體空間,那有沒有間接的方法呢?這就是Binder所要做的工作!
6.1智慧指標
……..
6.2程序間的資料傳遞載體—Parcel
由於採用了虛擬記憶體機制,兩個程序都有自己獨立的記憶體地址空間,所以跨程序傳遞的地址值是無效的。Parcel的英文直譯是打包,是對程序間資料傳遞的形象描述,在A程序中將某物件佔據的記憶體相關資料打包起來,寄給程序B,由B在自己程序空間中復現。
遵循Parcelable協議的物件可以通過Parcel來存取,如開發人員經常用到的bundle就是繼承自Parcelable的,在Android應用開發中經常用到bundle來打包資料。bundle的最大特點就是採用鍵值對的方式來儲存資料,並在一定程度上優化了讀取效率。
Active Object一般情況物件打包跨程序傳遞的只是物件的內容,而Active Object寫入的則是他們的特殊標誌引用,在取出時看到的是原來被寫入的例項。目前只有兩類物件可以以這種方式傳遞,Binder和FileDescriptor。
6.3Binder驅動與協議
…….
6.4“DNS”伺服器
……..
6.5Binder 客戶端—Binder Client
Binder是一種程序間通訊機制,Binder的最大“消費者”是Java層的應用程式,Android系統在底層Binder機制的基礎上做了進一步的封裝來滿足應用程式的研發需求,從而使開發者不關心Binder的內部細節就可以實現各種跨程序的互動功能,Android做的如此完美以至於我們並沒有感覺到程序間通訊的痕跡。
我們從Android元件中看出端倪。
Activity 通過startActivity可以啟動目標程序。
Service 任何應用程式都可以通過StartService或bindService來啟動特定的服務,不論是不是跨程序的。
Broadcast 任何應用程式都可以通過sendBroadcast傳送廣播,無論廣播處理者是否在同一程序。
Intent