Android開發藝術探索知識回顧——第2章 IPC機制

 

第2章 IPC機制

本章主要講解 Android 中的 IPC 機制。首先介紹 Android 中的多進程概念以及多進程開發模式中常見的注意事項,接着介紹Android 中的序列化機制和 Binder,然後詳細介紹 Bundle文件共享、AIDLMessengerContentProvider Socket 等進程間通信的方式。

爲了更好地使用 AIDL 來進行進程間通信,本章還引入了 Binder 連接池的概念。最後,本章講解各種進程間通信方式的優缺點和適用場景。通過本章,可以讓讀者對 Android 中的 IPC 機制和多進程開發模式有深入的理解。

 

2.1 Android IPC 簡介

IPC 是 Inter-Process Communication 的縮寫,含義爲進程間通信或者跨進程通信,是指兩個進程之間進行數據交換的過程。說起進程間通信,我們首先要理解什麼是進程,什麼是線程,進程和線程是截然不同的概念。

按照操作系統中的描述,線程是CPU調度的最小單元,同時線程是一種有限的系統資源。而進程一般指一個執行單元,在PC和移動設備上指一個程序或者一個應用。一個進程可以包含多個線程,因此進程和線程是包含與被包含的關係。最簡單的情況下,一個進程中可以只有一個線程,即主線程,在Android裏面主線程也叫UI線程,在UI線程裏才能操作界面元素。

很多時候,一個進程中需要執行大量耗時的任務,如果這些任務放在主線程中去執行就會造成界面無法響應,嚴重影響用戶體驗,這種情況在 PC 系統和移動系統中都存在,在Android中有一個特殊的名字叫做ANR (Application Not Responding) 即應用無響應。解決這個問題就需要用到線程,把一些耗時的任務放在線程中即可。

IPC 不是 Android 中所獨有的,任何一個操作系統都需要有相應的 IPC 機制,比如 Windows 上可以通過剪貼板、管道和郵槽等來進行進程間通信;Linux 上可以通過命名管道、共享內容、信號量等來進行進程間通信。可以看到不同的操作系統平臺有着不同的進程間通信方式,對於 Android 來說,它是一種基於 Linux 內核的移動操作系統,它的進程間通信方式並不能完全繼承自 Linux,相反,它有自己的進程間通信方式。

在 Android 中最有特色的進程間通信方式就是 Binder 了,通過 Binder 可以輕鬆地實現進程間通信。除了 Binder,Android 還支持 Socket,通過 Socket 也可以實現任意兩個終端之間的通信,當然同一個設備上的兩個進程通過 Socket 通信自然也是可以的。

說到 IPC 的使用場景就必須提到多進程,只有面對多進程這種場景下,才需要考慮進程間通信。這個是很好理解的,如果只有一個進程在運行,又何談多進程呢?多進程的情況分爲兩種。

第一種情況是:一個應用因爲某些原因自身需要釆用多進程模式來實現,至於原因,可能有很多,比如有些模塊由於特殊原因需要運行在單獨的進程中,又或者爲了加大一個應用可使用的內存,所以需要通過多進程來獲取多份內存空間。Android對單個應用所使用的最大內存做了限制,早期的一些版本可能是16MB,不同設備有不同的大小。

另一種情況是:當前應用需要向其他應用獲取數據,由於是兩個應用,所以必須採用跨進程的方式,來獲取所需的數據,甚至我們通過系統提供的 Contentprovider 去査詢數據的時候,其實也是一種進程間通信,只不過通信細節被系統內部屏蔽了,我們無法感知而已。

後續章節會詳細介紹 Contentprovider 的底層實現,這裏就先不做詳細介紹了。總之,不管由於何種原因,我們採用了多進程的設計方法,那麼應用中就必須妥善地處理進程間通信的各種問題。

 

2.2 Android中的多進程模式

在正式介紹進程間通信之前,我們必須先要理解 Android 中的多進程模式。通過給四大組件指定 android:process 屬性,我們可以輕易地開啓多進程模式,這看起來很簡單,但是實際使用過程中卻暗藏殺機,多進程遠遠沒有我們想的那麼簡單,有時候我們通過多進程得到的好處甚至都不足以彌補使用多進程所帶來的代碼層面的負面影響。下面會詳細分析這些問題。

 

2.2.1開啓多進程模式

正常情況下,在 Android 中多進程是指一個應用中存在多個進程的情況,因此這裏不討論兩個應用之間的多進程情況。首先,在Android中使用多進程只有一種方法,那就是給四 大組件 (Activity、Service、Receiver、ContentProvider) AndroidMenifest 中指定 android:process 屬性,除此之外沒有其他辦法,也就是說我們無法給一個線程或者一個實體類指定其運行時所在的進程。

其實還有另一種非常規的多進程方法,那就是通過 JNI 在 native 層去 fork 一個新的進程,但是這種方法屬於特殊情況,也不是常用的創建多進程的方式,因此我們暫時不考慮這種方式。下面是一個示例,描述瞭如何在Android中創建多進程:

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章