Android進程間通信全解析

一.概念

IPC(Inter-Process Communication)意為進程間通信或者跨進程通信

首選我們需要弄懂什么是進程?和我們常提及的線程又是什么關系?
線程:CPU調(diào)度的最小單元,同時線程是一種有限的系統(tǒng)資源瞧剖。
進程:一般指一個執(zhí)行單元,在PC和移動設備上指一個程序或一個應用可免。
一個進程可以包含多個線程抓于,因此進程與線程是包含與被包含的關系

Android是基于Linux內(nèi)核的移動操作系統(tǒng)浇借,它有著屬于自己的進程間通信方式捉撮,而其中,最有特色的進程間通信方式就是Binder了妇垢。

二.Android中的多進程模式

1.開啟多進程

在Android(此處指一個應用)中使用多進程只有一種方法巾遭,就是給四大組件在AndroidManifest中指定android:process屬性肉康,除此之外別無他法。

2.運行機制

Android為每一個應用分配了獨立的虛擬機灼舍,或者說為每個進程都分配了獨立的虛擬機吼和,不同的虛擬機在內(nèi)存分配上有不同的地址空間,這就導致在不同的虛擬機中訪問同一個類的對象會產(chǎn)生多份副本骑素。
一般來說炫乓,使用多進程會造成如下幾方面的問題:
(1)靜態(tài)成員和單例模式完全失效
(2)線程同步機制完全失效
(3)SharedPreferences的可靠性下降
(4)Application會多次創(chuàng)建
運行在不同進程中的組件是屬于不同的虛擬機和Application的。

三.IPC介紹

1.Serialiazable接口

Serializable是Java所提供的的一個序列化接口献丑,它是一個空接口末捣,為對象提供標準的序列化和反序列化操作。
通常情況我們只需要讓一個類實現(xiàn)Serializable接口并聲明一個serialVersionUID就可以讓這個類的對象實現(xiàn)序列化创橄。

public class User implements Serializable {
    
    private static final long serialVersionUID = 123456789L;
    
    public int id;
    
    public String name;

    ......
}

其中serialVersionUID用來輔助序列化和反序列化過程箩做,原則上序列化后的數(shù)據(jù)中的serialVersionUID只有和當前類的serialVersionUID相同才能夠正常的被反序列化。

如果不指定serialVersionUID的話妥畏,系統(tǒng)會通過計算當前類的hash值邦邦,自動賦給
serialVersionUID。通過手動指定serialVersionUID醉蚁,可以很大程度上避免反序列化過程的失敗圃酵。
如:在版本升級后,可能刪除或添加了類中的成員變量馍管,此時仍能成功的反序列化。

2.Parcelable接口

Parcelable也是一個接口薪韩,只要實現(xiàn)這個接口确沸,一個類的對象就可以實現(xiàn)序列化并可以通過Intent和Binder傳遞。

public class User implements Parcelable {
    
    public int id;

    public String name;
    
    public int age;

    public User() {
    }

    //幾乎所有情況下都返回0俘陷,可以忽略該方法罗捎。
    @Override
    public int describeContents() {
        return 0;
    }
    //實現(xiàn)序列化
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeString(this.name);
        dest.writeInt(this.age);
    }
    
    //實現(xiàn)反序列化
    protected User(Parcel in) {
        this.id = in.readInt();
        this.name = in.readString();
        this.age = in.readInt();
    }

    public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
        //調(diào)用反序列化方法
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}

Android系統(tǒng)中IntentBundle拉盾、Bitmap等類已經(jīng)實現(xiàn)了Parcelable接口桨菜。

Serializable和Parcelable比較:

Serializable是Java中的序列化接口,其使用起來簡單但是開銷很大捉偏。
Parcelable是Android中的序列化方式倒得,效率更高,缺點是使用較為麻煩夭禽。
此外霞掺,Parcelable主要用在內(nèi)存序列化上;通過序列化實現(xiàn)存儲和網(wǎng)絡傳輸還是建議用Serializable讹躯。

3.Binder

Binder是Android中的一個類菩彬,它實現(xiàn)了IBinder接口缠劝。

  • 從IPC的角度來說,Binder是Android中的一種跨進程通信方式骗灶。
  • 從Android Framework角度來說惨恭,Binder是ServiceManager連接各種-Manager(ActivityManager、WindowManager等等)和相應ManagerService的橋梁耙旦。
  • 從Android應用層來說脱羡,Binder是客戶端和服務端進行通信的媒介,如Activity綁定Service母廷。

Binder運行機制:
服務端中的Service給與其綁定的客戶端提供Binder對象轻黑,客戶端通過AIDL接口中的asInterface()將這個Binder對象轉(zhuǎn)換為代理Proxy,并通過它發(fā)起RPC請求琴昆∶ケ桑客戶端發(fā)起請求時會掛起當前線程,并將參數(shù)寫入data然后調(diào)用transact()业舍,RPC請求會通過系統(tǒng)底層封裝后由服務端的onTransact()處理抖拦,并將結(jié)果寫入reply,最后返回調(diào)用結(jié)果并喚醒客戶端線程舷暮。

Binder運行機制.png

四.Android中的IPC

各種方式IPC比較圖.png

AIDL文件的本質(zhì)是系統(tǒng)為我們提供了一種快速實現(xiàn)Binder的工具态罪,僅此而已。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末下面,一起剝皮案震驚了整個濱河市复颈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沥割,老刑警劉巖耗啦,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異机杜,居然都是意外死亡帜讲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門椒拗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似将,“玉大人,你說我怎么就攤上這事蚀苛≡谘椋” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵堵未,是天一觀的道長译红。 經(jīng)常有香客問我,道長兴溜,這世上最難降的妖魔是什么侦厚? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任耻陕,我火速辦了婚禮,結(jié)果婚禮上刨沦,老公的妹妹穿的比我還像新娘诗宣。我一直安慰自己,他們只是感情好想诅,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布召庞。 她就那樣靜靜地躺著,像睡著了一般来破。 火紅的嫁衣襯著肌膚如雪篮灼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天徘禁,我揣著相機與錄音诅诱,去河邊找鬼。 笑死送朱,一個胖子當著我的面吹牛娘荡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驶沼,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼炮沐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了回怜?” 一聲冷哼從身側(cè)響起大年,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玉雾,沒想到半個月后鲜戒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抹凳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伦腐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赢底。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柏蘑,靈堂內(nèi)的尸體忽然破棺而出幸冻,到底是詐尸還是另有隱情,我是刑警寧澤咳焚,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布洽损,位于F島的核電站,受9級特大地震影響革半,放射性物質(zhì)發(fā)生泄漏碑定。R本人自食惡果不足惜流码,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望延刘。 院中可真熱鬧漫试,春花似錦、人聲如沸碘赖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽普泡。三九已至播掷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撼班,已是汗流浹背歧匈。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留权烧,地道東北人眯亦。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像般码,于是被迫代替她去往敵國和親妻率。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 大學第一學期結(jié)束了板祝,和室友在一起的每一天都快樂并難得宫静。我們一起努力,我永遠愛你??
    somido閱讀 326評論 0 0
  • 立在人行橫道前 綠燈未亮起 走還是不走 我選了停留 可身邊的人都漸漸走遠了 我待在原地 五秒過去了 十秒又過去了 ...
    JSJSjwj閱讀 189評論 0 0
  • 越長大越發(fā)現(xiàn)自己可以責怪的人越少,因為每一個人都有他的難處橘洞。 芋頭先生總在我們產(chǎn)生分歧的時候問我:“錢真的有那么重...
    梨黎閱讀 314評論 0 0
  • 大雪過后捌袜,空氣清新,陽光微暖炸枣,整個世界大有歲月靜好之感虏等。
    一箋閱讀 299評論 0 1