Binder概述與使用場(chǎng)景

1选侨、什么是Binder

  • 從Android代碼的角度看,Binder是Android中的一個(gè)類,它實(shí)現(xiàn)了IBinder接口吕漂。
  • 從IPC的角度看,Binder是Android中的一種跨進(jìn)程通信方式尘应,Binder還是一種虛擬的物理設(shè)備,它的設(shè)備驅(qū)動(dòng)是/dev/binder吼虎。
  • 從Android Framework的角度看犬钢,Binder是ServiceManager連接各種Manager(ActivityManager、WindowManager思灰,等等玷犹,這些可看成是客戶端)和相應(yīng)的ManagerService(這可看成是服務(wù)端)的橋梁。
  • 從Android應(yīng)用層的角度看洒疚,Binder是客戶端和服務(wù)端進(jìn)行通信的媒介歹颓,當(dāng)bindService的時(shí)候,服務(wù)端會(huì)返回一個(gè)包含了服務(wù)端業(yè)務(wù)調(diào)用的Binder對(duì)象油湖,通過這個(gè)Binder對(duì)象巍扛,客戶端就可以獲取服務(wù)端提供的服務(wù)或數(shù)據(jù),這里的服務(wù)包括普通服務(wù)和基于AIDL的服務(wù)乏德。

2撤奸、Binder的使用過程

從上面的Binder定義中可以知道,Binder是客戶端和服務(wù)端進(jìn)行通信的媒介喊括。因此Binder的使用過程應(yīng)該從客戶端和服務(wù)端這兩方面進(jìn)行入手胧瓜。

  • 客戶端
    1、定義一個(gè)aidl文件郑什,在里面我們定義一個(gè)接口府喳,接口里面自定義了不同的方法,這些方法就是和服務(wù)端要進(jìn)行的操作蘑拯。
    如下編寫了一個(gè)IBookManager.aidl文件钝满,里面有一個(gè)接口肉津,并且有兩個(gè)方法:getBookList和addBook和服務(wù)端進(jìn)行交互。
package com.example.runningh.myapplication.aidl;

import com.example.runningh.myapplication.aidl.Book;
import com.example.runningh.myapplication.aidl.IOnNewBookArrivedListener;

interface IBookManager {

    List<Book> getBookList();

    void addBook(in Book book);
}

由于接口中有使用到了自定義的Book類舱沧,所以必須有一個(gè)Book.java類妹沙,表示圖書信息,它實(shí)現(xiàn)了Parcelable接口熟吏。
如下所示:

package com.example.runningh.myapplication.aidl;

import android.os.Parcel;
import android.os.Parcelable;

public class Book implements Parcelable {
    public int bookId;
    public String bookName;

    public Book(int bookId, String bookName) {
        this.bookId = bookId;
        this.bookName = bookName;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(bookId);
        dest.writeString(bookName);
    }

    public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {

        @Override
        public Book createFromParcel(Parcel source) {
            return new Book(source);
        }

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

    private Book(Parcel in) {
        bookId = in.readInt();
        bookName = in.readString();
    }
}

同時(shí)伟恶,由于Book類在AIDL中使用了盼铁,所以必須要有一個(gè)同名的Book.aidl類,其作用是將Book類在AIDL中進(jìn)行聲明。

package com.example.runningh.myapplication.aidl;

parcelable Book;

編譯上述的代碼曙蒸,IDE自動(dòng)給我們生成了IBookManager.java類,該類繼承了IInterface這個(gè)接口盟猖,同時(shí)它也是個(gè)接口绣夺,所有可以在Binder中傳輸?shù)慕涌诙夹枰^承IInterface接口,它聲明了兩個(gè)方法getBookList和addBook黎休,這兩個(gè)方法是我們自定義的浓领,同時(shí)還聲明了兩個(gè)整型的id分別用于標(biāo)識(shí)這兩個(gè)方法,這兩個(gè)id用于標(biāo)識(shí)在transact過程中客戶端所請(qǐng)求的到底是哪個(gè)方法势腮。接著联贩,它聲明了一個(gè)內(nèi)部類Stub,Stub是一個(gè)Binder類捎拯,當(dāng)客戶端和服務(wù)端都位于同一個(gè)進(jìn)程時(shí)泪幌,方法調(diào)用不會(huì)走跨進(jìn)程的transact過程,而當(dāng)兩者位于不同進(jìn)程時(shí)署照,方法調(diào)用需要走transact過程祸泪,這個(gè)邏輯由Stub的內(nèi)部代理類Proxy來完成。

3建芙、Binder的工作場(chǎng)景

在Android中没隘,Binder主要運(yùn)行在Service進(jìn)程間的通信中。例如AIDL和Messenger都運(yùn)用到了Binder岁钓。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末升略,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子屡限,更是在濱河造成了極大的恐慌品嚣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钧大,死亡現(xiàn)場(chǎng)離奇詭異翰撑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門眶诈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涨醋,“玉大人,你說我怎么就攤上這事逝撬≡÷睿” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵宪潮,是天一觀的道長(zhǎng)溯警。 經(jīng)常有香客問我,道長(zhǎng)狡相,這世上最難降的妖魔是什么梯轻? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮尽棕,結(jié)果婚禮上喳挑,老公的妹妹穿的比我還像新娘。我一直安慰自己滔悉,他們只是感情好伊诵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氧敢,像睡著了一般日戈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孙乖,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音份氧,去河邊找鬼唯袄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜗帜,可吹牛的內(nèi)容都是我干的恋拷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼厅缺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔬顾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起湘捎,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤诀豁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后窥妇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舷胜,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年活翩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烹骨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻伺。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沮焕,靈堂內(nèi)的尸體忽然破棺而出吨岭,到底是詐尸還是另有隱情,我是刑警寧澤峦树,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布辣辫,位于F島的核電站,受9級(jí)特大地震影響空入,放射性物質(zhì)發(fā)生泄漏络它。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一歪赢、第九天 我趴在偏房一處隱蔽的房頂上張望化戳。 院中可真熱鬧,春花似錦埋凯、人聲如沸点楼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掠廓。三九已至,卻和暖如春甩恼,著一層夾襖步出監(jiān)牢的瞬間蟀瞧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工条摸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悦污,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓钉蒲,卻偏偏與公主長(zhǎng)得像切端,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顷啼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • 一踏枣、IPC簡(jiǎn)介 (1)IPC是Inter-Process Communication的縮寫,含義為進(jìn)程間通信或者跨...
    遙遙的遠(yuǎn)方閱讀 7,202評(píng)論 0 3
  • Jianwei's blog 首頁 分類 關(guān)于 歸檔 標(biāo)簽 巧用Android多進(jìn)程钙蒙,微信茵瀑,微博等主流App都在用...
    justCode_閱讀 5,905評(píng)論 1 23
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)仪搔,斷路器瘾婿,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,769評(píng)論 25 707
  • 村里的大喇叭發(fā)通知:“大家伙們注意了!明天高壓停電一天,需要充電的東西充滿了偏陪,需要儲(chǔ)水備足水抢呆。” 小姑子聽到了笛谦,去...
    痞子妞閱讀 140評(píng)論 2 0