Android IPC(Inter-Process Communication)
就是Android
的跨進程通信,Android
開發有時需要進行多進程的開發,要進行多進程之間的通信,那樣就需要 IPC
的知識了 。下面先介紹一下多進程使用場景,再分別介紹一下幾種 IPC
方式。
多進程使用場景:
- 分擔主進程的內存壓力。
- 防止主線程被殺死,創建一個守護進程,守護主進程。
-
Android
開發中有些特殊的模塊需要在一個單獨的進程中。 - 當前應用需要向另外一個應用獲取數據。
介紹幾種IPC
方式之前要先介紹一下Binder
:
從IPC
角度來看,Binder
是 Android
中的一種跨進程通信方式,從Android
應用層來看,Binder
是客戶端與服務端進行通信的媒介,當bindService
時,服務端就會返回一個包含了服務端業務調用的Binder
對象,通過這個Binder
對象,客戶端就可以獲取服務端的數據或調用服務端的AIDL
接口中的方法。下面的Messenger
,AIDL
等IPC
方式底層都是通過Binder
來實現進程間通信的。
幾種IPC
方式:
Bundle
- 文件共享
Messenger
AIDL
ContentProvider
-
Socket
以上幾種IPC
方式各有優缺點,使用場景也各有不同,使用時應該考慮這些選擇合適的IPC
方式來進行跨進程通信。
幾種IPC
方式的具體分析:
一,Bundle
Intent
可以啟動其他進程中的四大組件,所以Intent+Bundle(Intent.putExtras(Bundle))
可以方便地向其他進程的四大組件傳遞一些數據,不過局限性也出來了,只能在啟動時向四大組件傳遞數據。
二 ,文件共享
文件共享就是在一個進程中將數據寫入文件中,然后在另外一個進程中去讀取那個文件,這樣就也可以進行跨進程通信。不過多線程直接對文件的讀寫,可能會出現問題,所以這種方式不適合高并發性的跨進程通信。
三, Messenger
Messenger
,信使,通過它可以在不同的進程中傳遞 Message
對象,在Message
中放入我們需要的傳遞的數據,用Handler
來處理 Message
,這樣就可以進行進程間數據傳遞了,Messenger
是一種輕量級IPC
方案,它的底層實現是AIDL
,Messenger
是只能用來傳遞消息的。
四,AIDL
AIDL(Android Interface Definition Language,Android接口定義語言)
是一種IDL
語言,是用來生成可以在 Android
設備上兩個進程之間進行進程間通信 (IPC
) 的代碼的,當然也可以不使用AIDL
,自己直接模仿著編寫這部分代碼,AIDL
也是使用Binder
來進行進程間通信的,這種 IPC
方式可以跨進程調用方法。AIDL
跨進程通信的大致流程是:創建一個Service作為服務端和一個AIDL
接口,接口中聲明要使用的方法,再創建一個類繼承自這個AIDL
接口中的 Stub
類并實現AIDL
接口中聲明的抽象方法,然后在onBind()
方法中返回這個類的對象給客戶端,就是一個Binder
對象,這樣在客戶端就可以通過這個Binder
對象調用服務端的中AIDL
接口中的方法了。
五,ContentProvider
ContentProvider
是系統提供的數據共享型組件,是用于不同組件乃至不同應用間共享數據的,所以也可以用來跨進程通信, ContentProvider
的底層實現的是Binder
,但是它的使用比 AIDL
的要簡單,根據``ContentProvider的特性,ContentProvider
適合要在大量數據中提取出一部分數據來進行跨進程通信的場景。
六,Socket
通過Socket
來進行跨進程通信,如果是同一手機中的兩個進程就直接進行局域網(localhost
)通信,如果兩個進程是處于不同手機就需要使用網絡來通信了。Socket
是一個抽象層,其實是封裝了TCP/IP
協議,然后提供一些API
來進行網絡通信,Socket
通信較為簡單,只需要提供 ip
和端口號就可以了。
參考 《Android開發藝術探索》