Android的IPC機(jī)制

什么是IPC機(jī)制?

IPC(Inter-Process Communication)是指進(jìn)程間通信或跨進(jìn)程通信,也可以說(shuō)兩個(gè)進(jìn)程進(jìn)行數(shù)據(jù)交換的過(guò)程。

什么是進(jìn)程?什么是線程?

進(jìn)程是指一個(gè)執(zhí)行單元在移動(dòng)設(shè)備中指一個(gè)應(yīng)用或一個(gè)程序

線程是CPU調(diào)度的最小單元,同時(shí)線程是一種有限的資源。

一個(gè)進(jìn)程中可以只有一個(gè)線程,也就是主線程,在Android中主線程也被稱之為UI線程,UI線程里主要操作界面元素,但不能做耗時(shí)任務(wù)。如果做了就會(huì)出現(xiàn)界面無(wú)響應(yīng)。在Android中有一個(gè)特殊的名字叫做ANR(Application Not Responding)解決方法就是把一些耗時(shí)任務(wù)放在子線程中就可以。

IPC機(jī)制可不只是Android中獨(dú)特有的,任何操作系統(tǒng)都會(huì)有相應(yīng)的IPC機(jī)制,說(shuō)到IPC使用的場(chǎng)景就要提到多進(jìn)程,因?yàn)橹饕獮榱诉M(jìn)程與進(jìn)程之間通信。Android 是多進(jìn)程模式的。


如何開啟多進(jìn)程

在Android中多進(jìn)程是指一個(gè)應(yīng)用中存在多個(gè)進(jìn)程的現(xiàn)象。我先說(shuō)說(shuō)一個(gè)應(yīng)用進(jìn)程之間的通信。如何使用定義多進(jìn)程,主要在Android四大組件中開啟進(jìn)程這需要在AndroiMenifest中具體的四大組件制定android:process屬性,除此之外? 別無(wú)他法。

一般來(lái)說(shuō),使用多進(jìn)程會(huì)造成如下幾方面的問(wèn)題:

? ? ? ?(1) 靜態(tài)成員和單例模式完全失效

? ? ? ? (2)線程同步機(jī)制完全失效

? ? ? ? (3)SharedPreferences的可靠性下降

? ? ? ? (4)Application會(huì)多次被創(chuàng)建

講到IPC就必須知道三方面內(nèi)容 :Serializable接口 ,Parcelable接口, Binder

1.Serializable接口

? ? ? ?這是Java提供的一個(gè)序列化接口。它是一個(gè)空接口,為對(duì)象提供標(biāo)準(zhǔn)的序列化 和反序列化。怎樣實(shí)現(xiàn)序列化呢 ,實(shí)現(xiàn)Serializable接口并申明serialVersionUID,這樣我們就可輕松的實(shí)現(xiàn)序列化了。但實(shí)際上我們也可忽略serialVersionUID這樣也能正確實(shí)現(xiàn)序列化。

? ? ? ?那問(wèn)題就又來(lái)了,為什么會(huì)有serialVersionUID呢?它是做什么的?

? ? ? ? ? ? ? 可以理解為這是反序列化的一個(gè)標(biāo)識(shí) 只有標(biāo)識(shí)相同才能被正常反序列化,可以手動(dòng)指定,也可以根據(jù)類名的哈希值。

2.Parcelable接口

這是Android 提供的一個(gè)實(shí)現(xiàn)序列化的接口,實(shí)現(xiàn)也可通過(guò)Intent ,Binder傳輸


3.Binder

Binder在Android中是一個(gè)類,它實(shí)現(xiàn)了IBinder接口。從IPC機(jī)制來(lái)說(shuō)它是一種跨進(jìn)程通信的方式,它主要在Service中應(yīng)用,包括AIDL和Messenger。



Android 中的IPC方式:

1.使用Bundle

四大組件中三大組件都是在intent中利用bundle來(lái)傳輸數(shù)據(jù),由于Bundle實(shí)現(xiàn)了Parcelable,所以可以方便地進(jìn)行傳輸。

2.使用后文件共享

共享文件是不錯(cuò)的進(jìn)程間通信的方式,兩個(gè)進(jìn)程讀寫同一文件夾數(shù)據(jù),

3.使用Messenger

顧名思義翻譯成中文為信息管理者,就是在不同的進(jìn)程中傳遞Messenger對(duì)象,在里面放入我們需要傳遞的數(shù)據(jù),就可進(jìn)行傳遞數(shù)據(jù),是一種輕量級(jí)的IPC方案,底層是AIDL

服務(wù)端進(jìn)程

首先,我們需要在服務(wù)端創(chuàng)建一個(gè)Service來(lái)處理客戶端的連接請(qǐng)求,同時(shí)創(chuàng)建Handler并通過(guò)Handler來(lái)創(chuàng)建一個(gè)Messenger,然后在Service的onBind中返回這個(gè)messenger對(duì)象的底層Binder

客戶端進(jìn)程

首先綁定服務(wù)端的Service,綁定成功后用服務(wù)器返回的IBinder對(duì)象創(chuàng)建一個(gè)Messenger,并把這個(gè)Message對(duì)象通過(guò)Message對(duì)象的replyTo參數(shù)傳遞給服務(wù)器。

4.使用AIDL

AIDL可以來(lái)實(shí)現(xiàn)跨進(jìn)程調(diào)用服務(wù)的方法

服務(wù)端:

服務(wù)端首先創(chuàng)建一個(gè)Service用來(lái)監(jiān)聽(tīng)客戶端的連接請(qǐng)求,然后創(chuàng)建一個(gè)AIDL文件,將暴露給客戶端的接口在此申明,Service實(shí)現(xiàn)AIDL接口

客戶端:

客戶端所做的事情就簡(jiǎn)單,首先需要綁定服務(wù)端的Service,返回的Binder對(duì)象轉(zhuǎn)為AIDL接口所屬的類型,接著掉AIDL中的方法。

注意AIDL對(duì)數(shù)據(jù)類型有要求:

基本數(shù)據(jù)類型(int,long,char,boolean,double等);

String和CharSequence;

List:只支持ArrayList,里面的每個(gè)元素都必須被支持;

Map:只支持HashMap,里面的每個(gè)元素都必須被支持,包括Key和value

Parceable:所有都實(shí)現(xiàn)了Parceable接口對(duì)象;

AIDL:AIDL文件中的接口都可在AIDL文件中使用;

5.使用ContentProvider

ContentProvider是Android專門為不同應(yīng)用進(jìn)行數(shù)據(jù)共享的方式。它的底層還是Binder使用卻簡(jiǎn)單 因?yàn)橄到y(tǒng)進(jìn)行了封裝。

ContentProvider就相當(dāng)于一個(gè)數(shù)據(jù)庫(kù),它主要是以表格的形式,除此之外還有文件數(shù)據(jù)如:圖片,視頻,音頻。

6.使用Socket

Socket也稱之為套接字是網(wǎng)路通信的一種概念,它分為流式套接字和用戶數(shù)據(jù)報(bào)套接字兩種,分別對(duì)應(yīng)于網(wǎng)絡(luò)的傳輸控制層中的TCP和UDP協(xié)議。TCP協(xié)議是面向連接的協(xié)議,提供穩(wěn)定的雙向通信功能,TCP要經(jīng)過(guò)三次握手才能完成,為了提供穩(wěn)定的數(shù)據(jù)傳輸功能,具有很高的穩(wěn)定性;UDP是無(wú)連接的 提供不穩(wěn)定的單向通信功能,UDP也可以實(shí)現(xiàn)雙向通信 但是不穩(wěn)定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容