IPC 程序間通訊

2021-09-01 22:09:53 字數 2800 閱讀 5592

開啟多程序

程序名以":"開頭的講程屬於當前應用的私有程序,其他應用的元件不可以和它跑在同乙個程序中,而程序名不以開頭的程序屬於全域性程序, 其他應用通過shareuid方式可以和它跑在同乙個程序中。

我們知道andrid系統會為每個應用分配乙個唯一的uid,具有相同uid的應用才能共享資料。這裡要說明的是,兩個應用通過shareuid跑在同乙個程序中是有要求的,需要這兩個應用有相同的shareuid並且簽名相同才可以。在這種情況下,它們可以互相訪問對方的私有資料,比如data目錄、元件資訊等,不管它們是否跑在同乙個程序中。 當然如果它們跑在同乙個程序中,那麼除了能共享data目錄、元件資訊,還可以共享記憶體資料,或者說它們看起來就像是乙個應用 的兩個部分。

多程序造成問題

ipc方式

messenger

messenger可以翻譯為信使,顧名思義,通過它可以在不同程序中傳遞mesge物件,

在message中放入我們需要傳遞的資料,就可以輕鬆地實現資料的程序間傳遞了

binder

直觀來說,binder 是android中的乙個類, 它實現了ibinder 介面。從ipc 角度來說,

binder是android中的一種跨進 程通訊方式,binder 還可以理解為一種虛擬的物理裝置,它的裝置驅動是/dev/binder,該通訊方式在linux中沒有;從android framework角度來說binder是servicemanager連線各種manager (activitymanager、windowmanager,等等)相應managerservice的橋梁;

從android 應用層來說,binder 是客戶端和服務端進行通化的媒介,當bindservice 的時候,服務端會返回一乙個包含了服務端業務呼叫的binder物件通過這個binder物件,客戶端就可以獲取服務端提供的服務或者資料,這裡的服務包括通服務和基於aidl的服務。

android開發中,binder主要用在service中,包括aidl和messenger,其中普通serv中的binder不涉及程序間通訊,所以較為簡單,無法觸及binder的核心,而messenget底層其實是aidl。

aidl支援的資料型別

aidl注意

inte***ce ibookmanager

aidl介面只支援方法,不支援宣告靜態常量

aidl的包結構在服務端和客戶端要保持一直.因為客戶端需要反序列化服務端中和aidl介面相關的所有類,類的完整路徑不一樣反序列化失敗

aidl方法是在服務端的binder執行緒池中執行,copyonwritearraylist自動線程同步,還有concurrenthashmap

remotecallbacklist,自動線程同步,程序終止時自動移除註冊的listener;beginbroadcast()和finishbroadcast()必須配對使用

服務端aidl介面方法全部執行在binder執行緒池中,介面方法可以做耗時操作,如果呼叫介面的客戶端是在ui執行緒中,那麼不要再介面方法中做耗時操作否則就會導致anr;如果明確知道必須做耗時操作,那麼在呼叫介面的客戶端中需要開啟執行緒來呼叫耗時的aidl介面方法

客戶端中的aidl介面執行在客戶端的執行緒池中,不能做重新整理ui;

服務端在ui執行緒中(比如在onbind方法中獲取客戶端的相關資訊)呼叫客戶端耗時的aidl介面,會導致服務端anr

客戶端的onserviceconnected()和onservicedisconnected()執行在ui執行緒

binder死亡、binder連線斷裂

binder提供兩個配對使用方法:linktodeath()和unlinktodeath(),通過linktodeath方法設定乙個死亡**,binder死亡時收到通知,此時可以重新發起請求重新連線

private ibinder.deathrecipient recipient = new ibinder.deathrecipient()

ibookmanager.asbinder().unlinktodeath(recipient,0);

ibookmanager = null;

//這裡重新繫結遠端service

}};

其次,在客戶端繫結遠端服務成功之後,給binder設定死亡**

@override

public void onserviceconnected(componentname name, ibinder binder)

aidl許可權驗證

contentprovider

//authority與表名關聯,根據傳入的uri取出來外界想要操作哪張表

//content:

//content:

urimatcher urimatcher = new urimatcher(urimatcher.no_match);

urimatcher.adduri(authority, path, code);

urimatcher.adduri(authority, path, code);

getcontext().getcontentresolver().notifychange(uri, null);
外界註冊資料改變監聽

getcontext().getcontentresolver().registercontentobserver(uri,true,new contentobserver(null) 

});//解除註冊

getcontext().getcontentresolver().unregistercontentobserver()

程序間通訊IPC

這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...

程序間通訊 IPC

part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...

程序間通訊IPC

乙個大型的應用系統,往往需要眾多程序協作,程序間通訊的重要性顯而易見。首先,程序間通訊至少可以通過傳送開啟檔案來實現,不同的程序通過乙個或多個檔案來傳遞資訊,事實上,在很多應用系統裡,都使用了這種方法。但一般說來,程序間通訊 ipc interprocess communication 不包括這種似...