AIDL用法四 Binder連接池

前言

現(xiàn)在考慮一個(gè)情況,公司的項(xiàng)目越做越大了,有很多不同功能的業(yè)務(wù)模塊需要使用AIDL來(lái)進(jìn)行通信,如果還是按照原來(lái)的方式蹬敲,則需要?jiǎng)?chuàng)建很多service,這明顯不符合多態(tài)的特性莺戒。像寫接口一樣伴嗡,找出這些AIDL的共同點(diǎn)做出一個(gè)接口,那么AIDL的共同點(diǎn)就是他們底層都是用binder來(lái)通信的从铲。

我們將這些binder管理起來(lái)瘪校,通過(guò)接口來(lái)選擇性調(diào)用。當(dāng)然這個(gè)接口肯定是AIDL文件食店。

好渣淤,現(xiàn)在先建兩個(gè)業(yè)務(wù)模塊

// ISecurityCenter.aidl
package xxxxxxxxxxx;

interface ISecurityCenter {
    String encrypt(String content);
        String decrypt(String password);
}
// ICompute.aidl
package com.example.myapplication;

// Declare any non-default types here with import statements

interface ICompute {
    int add(int a, int b);
}

和一個(gè)管理binder的AIDL接口

interface IBinderPool {
   IBinder queryBinder(int binderCode);
}

接著赏寇,實(shí)現(xiàn)以上三個(gè)aidl的具體業(yè)務(wù)邏輯

public class ComputeImpl extends ICompute.Stub{
    @Override
    public int add(int a, int b) throws RemoteException {
        return a + b;
    }
}
public class SecurityCenterImpl extends ISecurityCenter.Stub{

    private static final char SECRET_CODE = '^';

    @Override
    public String encrypt(String content) throws RemoteException {
        return content+"haha";
    }

    @Override
    public String decrypt(String password) throws RemoteException {
        return password.toLowerCase();
    }
}
public class BinderPoolImpl extends IBinderPool.Stub {
    @Override
    public IBinder queryBinder(int binderCode) throws RemoteException {
        IBinder binder=null;
        switch (binderCode){
            case 1:
                binder=new SecurityCenterImpl();
                break;
            case 2:
                binder=new ComputeImpl();
                break;
            default:
                break;
        }

        return binder;
    }
}

創(chuàng)建一個(gè)binder連接池類吉嫩。在它的內(nèi)部,首先要去綁定遠(yuǎn)程服務(wù)嗅定,綁定成功后自娩,客戶端就可以通過(guò)useAidlByCode方法去獲取各自對(duì)應(yīng)的binder,拿到所需得到binder以后,不同業(yè)務(wù)模塊就可以進(jìn)行各自的操作忙迁。

public class BinderPoolUtil {

    private Context mcontext;
    private static  volatile BinderPoolUtil sInstance;
    private CountDownLatch mCountDownLatch;

    private IBinderPool binderPoolimpl=new BinderPoolImpl();

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            binderPoolimpl = IBinderPool.Stub.asInterface(iBinder);
            try {
                binderPoolimpl.asBinder().linkToDeath(mDeathRecipient,0);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
            mCountDownLatch.countDown();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };


    private  BinderPoolUtil(Context mcontext) {
        this.mcontext = mcontext;
        useThisBindService();
    }




    public static BinderPoolUtil getInstance (Context context){
        if(sInstance==null){
            synchronized (BinderPoolUtil.class){
                if(sInstance==null){
                    sInstance=new BinderPoolUtil(context);
                }
            }
        }
        return sInstance;
    }

    //使用這個(gè)類幫A綁定服務(wù)了
    private synchronized  void  useThisBindService(){
        mCountDownLatch = new CountDownLatch(1);
        Intent intent = new Intent(mcontext, MyService.class);

        mcontext.bindService(intent, mServiceConnection,Context.BIND_AUTO_CREATE);

        try {
            mCountDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     *      通過(guò)code來(lái)調(diào)用不同的Aidl模塊功能
     * @param binderCode
     * @return
     */

    public IBinder useAidlByCode(int binderCode){
        IBinder binder=null;
        try {
            if(binderPoolimpl!=null) {
                binder = binderPoolimpl.queryBinder(binderCode);
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }

        return binder;

    }


    private IBinder.DeathRecipient mDeathRecipient=new IBinder.DeathRecipient(){

        @Override
        public void binderDied() {
            binderPoolimpl.asBinder().unlinkToDeath(this,0);
            binderPoolimpl=null;
            useThisBindService();
        }
    };




}

服務(wù)的代碼則簡(jiǎn)單

public class MyService extends Service {



    @Override
    public void onCreate() {
        super.onCreate();
    }


    private BinderPoolImpl stub=new BinderPoolImpl();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }

}

然后在界面中調(diào)用binder連接池方法類查詢

public class MainActivity extends AppCompatActivity {



        private BinderPoolUtil binderPoolUtil;
        private IBinder scbinder;
        private IBinder cibinder;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    binderPoolUtil = BinderPoolUtil.getInstance(MainActivity.this);
                    scbinder = binderPoolUtil.useAidlByCode(1);
                    cibinder = binderPoolUtil.useAidlByCode(2);
                    ISecurityCenter iSecurityCenter = SecurityCenterImpl.asInterface(scbinder);
                    ICompute iCompute = ComputeImpl.asInterface(cibinder);
                    String s1 = iSecurityCenter.encrypt("sfeMHJI");
                    String s2 = iSecurityCenter.decrypt("sfeMHJI");
                    int add = iCompute.add(1, 2);

                    Log.e("yjm",s1+"--------"+s2+"--------"+add);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脐彩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姊扔,更是在濱河造成了極大的恐慌惠奸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恰梢,死亡現(xiàn)場(chǎng)離奇詭異佛南,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嵌言,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門嗅回,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人摧茴,你說(shuō)我怎么就攤上這事绵载。” “怎么了苛白?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵娃豹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丸氛,道長(zhǎng)培愁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任缓窜,我火速辦了婚禮定续,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禾锤。我一直安慰自己私股,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布恩掷。 她就那樣靜靜地躺著倡鲸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黄娘。 梳的紋絲不亂的頭發(fā)上峭状,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音逼争,去河邊找鬼优床。 笑死,一個(gè)胖子當(dāng)著我的面吹牛誓焦,可吹牛的內(nèi)容都是我干的胆敞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼移层!你這毒婦竟也來(lái)了仍翰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤观话,失蹤者是張志新(化名)和其女友劉穎予借,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體频蛔,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕾羊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帽驯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龟再。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尼变,靈堂內(nèi)的尸體忽然破棺而出利凑,到底是詐尸還是另有隱情,我是刑警寧澤嫌术,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布哀澈,位于F島的核電站,受9級(jí)特大地震影響度气,放射性物質(zhì)發(fā)生泄漏割按。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一磷籍、第九天 我趴在偏房一處隱蔽的房頂上張望适荣。 院中可真熱鬧,春花似錦院领、人聲如沸弛矛。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丈氓。三九已至,卻和暖如春强法,著一層夾襖步出監(jiān)牢的瞬間万俗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工饮怯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闰歪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓硕淑,卻偏偏與公主長(zhǎng)得像课竣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子置媳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 本文介紹Service與Activity之間的通信,文章包含以下內(nèi)容: 一寥袭、Service基本用法 二路捧、通過(guò)AID...
    developerzjy閱讀 10,252評(píng)論 7 27
  • 一、IPC簡(jiǎn)介 (1)IPC是Inter-Process Communication的縮寫传黄,含義為進(jìn)程間通信或者跨...
    遙遙的遠(yuǎn)方閱讀 7,195評(píng)論 0 3
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理杰扫,服務(wù)發(fā)現(xiàn),斷路器膘掰,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 在上一篇Window里提及過(guò)IPC章姓,本篇將詳細(xì)總結(jié)IPC,知識(shí)點(diǎn)如下: IPC基礎(chǔ)及概念多進(jìn)程模式序列化Seria...
    厘米姑娘閱讀 8,067評(píng)論 17 29
  • 文/Nico 1识埋、扔掉所有跟前任有關(guān)的所有東西 睹物思人凡伊,不管分手時(shí)的狀況如何,走在一起時(shí)必然會(huì)有甜蜜和幸福的瞬間...
    Nico尼可閱讀 3,613評(píng)論 3 15