藝術探索筆記 IPC

2021-10-03 04:02:02 字數 2886 閱讀 7656

執行緒:cpu 排程的最小單位,是一種有限的系統資源。

程序:乙個執行單元,一般指乙個程式或應用。乙個程序可以有多個執行緒。

私有程序:程序名以:開頭,不允許其他應用的元件執行在私有程序

全域性程序:程序名以.開頭,其他應用可以通過 shareuid 方式,將元件執行在全域性程序。

ipc 的方式:

序列化與反序列化

序列化的本質是資料形式的轉化。

將記憶體中的資料以流的形式寫入到磁碟快取中。

反序列化即將磁碟快取中的資料讀出來,轉化為之前的資料將結構。

serializable

pulic class user implement serializable
serializable 反序列化時呼叫了 objectinputstream.readobject 內部使用了反射,產生大量臨時物件,效率低parcelable

public class user implement parcelable 

public void writeparcel(parcel out, int flags)

public static final parcelable.creatorcreator = new parcelable.creator(

public user newarray(int size)

} private user(parcel in)

});}

parcelable 實現原理是在記憶體中建立一塊共享資料塊,序列化和反序列化均是操作這一塊的資料。效率高記憶體中傳遞使用 parcelable,持久化儲存和網路傳輸使用 serializable由於bundle 實現了 parcelable 藉口,所以 activity、service、receiver 都支援在 intent 中傳遞 bundle 資料進行(程序間)通訊。我們可以在 bundle 中附加能夠被序列化的資訊,如基本資料型別(已實現 serializable)、parcelable 物件、serializable 物件等。

因為 android 系統基於 linux,所以可以無限制的對檔案進行併發讀/寫操作,通過多個程序對同一檔案進行交換資料也可以達到程序間通訊的目的。

sharepreferences、資料庫等儲存方案本質上仍是檔案的一種。由於 android 系統對 sharepreferences 的讀/寫有一定的快取策略,即記憶體中會有乙份 sharepreferences 的快取,所以多程序下系統對它的讀寫變得不在可靠,因此,不建議使用。

binder 是 android 中的一種跨程序通訊方式,是 servicemanager 連線 manager 與 managerservice 的橋梁,是客戶端與服務端進行通訊的媒介。

binder 主要應用於 aidl 和 messager。

binder 的唯一標識,一般使用 binder 的類名表示。

asinte***ce(ibinder obj)

將服務端 binder 物件轉換為客戶端 aidl 介面型別的物件。

如果客戶端和服務端在同一程序,返回值為 stub本身,否則返回 stub.proxy 物件。

asbinder

返回當前 binder 物件。

ontransact(int code, parcel data, parcel reply, int flags)

proxy.basictypes

通過parce.obtain()方法建立輸入型物件 _data、輸出型物件 _reply;將函式入參、descriptor 寫入 _data;通過 binder 物件呼叫 transact 方法,將 transact 型別、_data,_reply 傳入服務端進行處理之後,從 _reply 中取出返回結果。

從客戶端發起請求開始,直至服務端返回資料,客戶端當前執行緒會一直處於掛起狀態,所以耗時操作需要做執行緒切換處理。

unlinktodeath

在客戶端宣告乙個 deathrecipient 物件,在 binderdied 函式內部對 binder 進行移除繫結(並重新繫結)。

deathrecipient = ibinder.deathrecipient }}

linktodeath

客戶端繫結遠端服務後,為 binder 設定死亡**。

val connection = object : serviceconnection  catch (e: remoteexception) }}

messenger

messenger 的底層實現是 aidl。它實際上是對 aidl 進行了封裝,通過 message 物件在程序間傳輸資料,message 中能使用的載體只有 what、arg1、arg2、bundle 以及 replyto。messenger 一次只會處理乙個請求,所以服務端不會處理併發請求,不用考慮執行緒同步的問題。

socket

socket 即「套接字」,它是計算機之間進行通訊的一種方式,因此我們也可以通過 socket 實現程序間的通訊。socket 分為 流式套接字(tcp)、資料報套接字(udp),可以用來傳輸任意位元組流。

socket 在使用時需要網路許可權,且不能在主線程中使用,與在 android 裝置中進行網路請求是相同的。

Android 開發藝術探索 IPC機制

2.1 2.2.1 android 開啟程序方式只有android proces 特殊方式通過jni native fork乙個程序 android proces remote 私有程序,其他應用和元件不能和他跑乙個程序 android proces com.test 全域性程序,具有相同share...

Android 開發藝術探索筆記(14)

android動畫可以分為三種 view動畫,幀動畫和屬性動畫。view動畫 view動畫作用於view,它支援四種動畫效果,分別是平移 縮放 旋轉和透明度。幀動畫也屬於view動畫,但是其表現形式和上面四種變換效果不太一樣。view的四種變換效果對應著animation的四個子類 translat...

Android 開發藝術探索筆記(16)

插值器和估值器 timeinterpolator中文翻譯為時間插值器,它的作用是根據時間流逝的百分比來計算出當前屬性改變的百分比。系統預置了一些插值器 線性插值器,加減速插值器等 typeevaluator的中文翻譯為型別估值演算法,也叫估值器,它的作用是根據當前屬性改變的百分比來計算改變後的屬性值...