国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

# 讀 Android 開發藝術探索 &2

2019-11-09 17:57:55
字體:
來源:轉載
供稿:網友

關鍵詞:ipC / 多進程 / 序列化 / Binder

IPC,Inter-PRocess Communication 的縮寫,含義為進程間通信或者跨進程通信,兩個進程之間進行數據交換的過程。說到 IPC 的使用場景,就要提到多進程,當采用了多進程的設計方法,那么應用中就必須妥善處理進程間通信的各種問題。

[ 首先必須知道的幾點:]

進程:一般是指一個執行單元,在 PC 和移動設備中指一個程序或者一個應用。線程:CPU 調度的最小單元,是一種有限的系統資源。一個進程可以包含多個線程,包含與被包含的關系。一個進程可只有一個線程,主線程,在 Android 中就是 UI 線程,只有在 UI 線程里才能對界面元素進行操作。ANR,application Not Responding,應用無響應,防止ANR,把耗時的任務放在子線程中執行。Android 有自己的進程間通信方式:Binder / Socket通過系統提供的 ContentProvider 去查詢數據的時候也是一種進程間通信,只不過通信細節被系統屏蔽了。

1. Android 中的多進程模式 #

在 Android 中使用多進程的常用方法只有一種:給四大組件在 AndroidManifest 中指定 android:process 屬性。示例:

<activity android:name="io.github.isayes.MainActivity" ... /><activity android:name="io.github.isayes.SecondActivity" android:process=":remote" /><activity android:name="io.github.isayes.ThirdActivity" android:process="io.github.isayes.remote" />

[ 需要知道以下幾點:]

啟動 SecondActivity 的時候系統會為它創建一個單獨的進程:“io.github.isayes:remote”; 啟動 ThirdActivity 的時候系統為它創建一個單獨的進程:“io.github.isayes.remote”; 入口的 MainActivity 運行在默認的進程中,默認的進程名為包名; 進程名以 “:” 開頭說明進程屬于當前應用的私有進程(其它應用的組件不可以與之跑在同一個進程中),不以之開頭的進程是全局進程(其它應用通過 ShareUID 方式與之可以跑在同一個進程中);Android 系統會為每個應用分配一個唯一的 UID,UID 相同才能共享數據(data 目錄、組件信息等私有數據);UID 相同并且簽名相同才能跑在同一個進程中(還可以共享內存數據)。

Android 系統為每一個應用分配了一個獨立的虛擬機,或者說為每一個進程都分配了一個獨立的虛擬機,不同的虛擬機在內存分配上有不同的地址空間,導致在不同的虛擬機中訪問同一個類的對象會產生多份副本。一般來說,使用多線程會導致以下幾個需要注意的問題 ↓

靜態成員和單例模式失效線程同步機制失效SharedPreferences 的可靠性下降Application 會多次創建(運行在同一個進程中的組件是屬于同一個虛擬機和同一個 Application 的,同理,運行在不同的進程中的組件是屬于不同的兩個虛擬機和不同的 Application )在多進程模式中,不同的進程的組件會有獨立的虛擬機,獨立的Application 以及內存空間;

理解同一個應用間的多進程:相當于兩個不同的應用采用了 ShareUID 的模式。 為了解決多進程帶來的問題,系統提供了很多跨進程通信的方法,雖然不能直接的共享內存,但是通過跨進程通信可以實現數據交互。實現跨進程通信的方式有: 1. 通過 Intent 傳遞數據 2. 共享文件 3. SharedPreferences 4. 基于 Binder 的 Messenger 和 AIDL 5. Socket 等

要理解 IPC 的各種方式,需要熟悉一些基礎概念:序列化相關的 Serializable / Parcelable 接口 和 Binder

2. IPC 基礎 相關概念 #

IPC 的基礎概念有三點:
Serializable
Parcelable
Binder

Serializable 和 Parcelable 接口完成對象的序列化過程,當我們通過 Intent 和 Binder 傳輸數據時就需要使用 Parcelable 或者 Serializable。

若需要把對象持久化到存儲設備上或者通過網絡傳輸給其他客戶端,這時候也需要使用 Serializable 來完成對象的持久化。

【關于 Serializable 需要知道的幾點】

java 提供的序列化接口,是一個空接口為對象提供標準的序列化和反序列化操作幾乎所有的工作都被系統自動完成了靜態成員變量屬于類不屬于對象,所以不會參與序列化過程采用 transient 關鍵字標記的成員變量不參與序列化過程private static final long serialVersionUID = -1589804003600796026L; serialVersionUID 輔助序列化和反序列化過程,序列化后的數據的 serialVersionUID 要和 當前類的 serialVersionUID 相等才能被正常地反序列化

【關于 Parcelable 需要知道的幾點】

方法 / 功能 / 標記位
createFromParcel(Parcel in) / 從序列化后的對象中創建原始對象 /
newArray(int size) / 創建指定長度的原始對象數組 /
User(Parcel in) / 從序列化后的對象中創建原始對象 /
writeToParcel(Parcel out, int flags) / 將當前對象寫入序列化結構中,其中 flags 標識有兩種值:0 或 1,為 1 時標識當前對象需要作為返回值返回,不能立即釋放資源,幾乎所有情況都為 0 / PARCELABLE_WRITE_RETURN_VALUE
describeContents / 返回當前對象的內容描述。如果含有文件描述符,返回 1,否則返回 0, 幾乎所有情況都返回 0 / CONTENTS_FILE_DESCRIPTOR

[ 對 Parcelable 的典型用法示例 ]

public class User implements Parcelable{ public int userId; public String userName; public boolean isMale; public Book book; public User(int userId, String userName, boolean isMale){ this.userId = userId; this.userName = userName; this.isMale = isMale; } // 內容描述功能 public int describeContents(){ return 0; } // 序列化功能的完成,最終通過 Pacel 中的一系列 write 方法來完成 public void writeToParcel(Parcel out, int flags){ out.wirteInt(userId); out.writeString(userName); out.writeInt(isMale ? 1 : 0); out.writeOarcelable(book, 0); } // 反序列化功能的完成 public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { public User createFromParcel(Parcel in) { return new User(in); } public User[] newArray(int size){ return new User[size]; } }; private User(Parcel in){ userId = in.readInt(); userName = in.readString(); isMale = in.readInt() == 1; book = in.readParcelable(Thread.currentThread().getContextClass-Loader()); }}

[ 對兩種序列化接口的比較:]

Serializable / Parcelable
Serializable 是 Java 提供的序列化接口 / Parcelable 是 Android 提供的序列化接口,更適合在 Android 平臺上
Serializable 使用簡單但是開銷大,序列化和反序列化過程中需要大量的 IO 操作 / Parcelable 使用麻煩但是效率很高

【Binder】

需要知道的幾點 ↓

Binder 是 Android 的一個實現了 IBinder 接口的類。是 Android 的一種跨進程通信方式是一種虛擬的物理設備,設備驅動是 /dev/binder從 Android Framework 角度來看,Binder 是 ServiceManager 連接各種 Manager(ActivityManager、WindowManager 等等)和相應的 ManagerService 的橋梁。從 Android 應用層來說,是客戶端和服務端進行通信的媒介Binder 主要用在 Service 中,包括 AIDL、Messenger(底層也是 AIDL)所有可以在 Binder 中傳輸的接口都需要繼承 IInterface 接口

關于 Binder 的知識需要單獨總結一下:讀 Android 開發藝術探索 &3 (番外篇之弄懂 Binder)

End.

Note by HF. Learn from 《Android 開發藝術探索》



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三门县| 广宁县| 南华县| 翼城县| 江陵县| 永平县| 水富县| 榆林市| 道孚县| 黔南| 禹城市| 鄂托克前旗| 南漳县| 鄂州市| 丰城市| 阜阳市| 陈巴尔虎旗| 上高县| 漠河县| 武邑县| 克什克腾旗| 兴海县| 镇巴县| 朔州市| 宾阳县| 黑河市| 西平县| 紫阳县| 福泉市| 澄城县| 山阴县| 乌审旗| 汝州市| 马龙县| 茌平县| 囊谦县| 天祝| 汝阳县| 弥勒县| 赣榆县| 莒南县|