Android AIDL使用

該文章只介紹AIDL的使用馆匿,主要是自己平時(shí)工作的一個(gè)總結(jié)抑胎,以防自己忘記。

今天做這樣一件事:
1.建立一個(gè)客戶端
2.再建立一個(gè)服務(wù)端
3.用客戶端來(lái)調(diào)用服務(wù)端的一個(gè)方法輸出一段字符串
這兩個(gè)APP屬于不同的進(jìn)程渐北,如果調(diào)用成功阿逃,則表示順利實(shí)現(xiàn)進(jìn)程之間的通信,別告訴我你不知道 AIDL 是干什么的赃蛛,打死你- -J扬薄!呕臂!

首先看下工程結(jié)構(gòu):

選區(qū)_002.png

稍作解釋吧破托,后面我會(huì)把代碼地址貼出來(lái)
第一個(gè)app---->是我們的客戶端,下面的那個(gè)myservice---->是我們的服務(wù)端
我們?cè)诳蛻舳说闹兄挥幸粋€(gè)調(diào)用的方法歧蒋,其他的全在服務(wù)端

啰嗦了一堆了土砂,趕緊開始吧。

服務(wù)端

1.首先在我們的項(xiàng)目中谜洽,new一個(gè)新的module萝映,就是我們的myservice這個(gè)myservice就是另一個(gè)程序,所以是在兩個(gè)進(jìn)程
2.在與java同級(jí)目錄中新建一個(gè)AIDL文件阐虚,名字是ICloverInterface,后綴是".aidl",

ICloverInterface.aidl完整代碼(你新建的時(shí)候會(huì)有一個(gè)void的一個(gè)方法序臂,直接無(wú)視就好)
可以發(fā)現(xiàn),這是一個(gè)接口实束,當(dāng)然我們需要在myservice中實(shí)現(xiàn)這個(gè)接口

// ICloverInterface.aidl
package cn.techscan.gd.myservice;

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

interface ICloverInterface {
    String helloWord();
}

這里需要注意一下:這個(gè)接口寫完需要重新build下我們的項(xiàng)目奥秆,
點(diǎn)擊 菜單欄Build ---->Make Moduld'xxx',這時(shí)會(huì)生成這樣一個(gè)文件,下圖

2017-04-10 20-34-43屏幕截圖.png

這是一個(gè)接口

3.在myservice實(shí)現(xiàn)這個(gè)接口咸灿,重寫onBind()方法构订,同時(shí),需要在Service中實(shí)現(xiàn)ICloverInterface接口
代碼如下

public class MyHelloService extends Service {

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

    private ICloverInterface.Stub iBinder = new ICloverInterface.Stub() {
        @Override
        public String helloWord() throws RemoteException {
            return "Hello World";
        }
    };
}

其中返回的iBinder是我們?cè)诳蛻舳说玫降膶?shí)例析显,return的字符串"Hello World"鲫咽,就是我們需要得到的,如果你需要其他邏輯谷异,就在接口中定義分尸,然后在這里實(shí)現(xiàn)它,都是一樣的歹嘹。
最后箩绍,注意的是:既然我們寫了Service就需要在manifest注冊(cè)

<service android:name=".MyHelloService"
                 android:exported="true">
</service>
到這我們服務(wù)端就寫完了,很簡(jiǎn)單尺上,就是調(diào)用這里一個(gè)方法材蛛,輸出"hello world"

客戶端

其實(shí)客戶端做的事情也不多圆到,主要就是調(diào)用,
1.首先卑吭,需要把服務(wù)端的aidl文件夾復(fù)制到我們客戶端的同樣的位置下芽淡,就是和java文件夾同級(jí),這里補(bǔ)充下:并不是必須在這里而是我們用AS建立aidl的時(shí)候豆赏,IDE自動(dòng)幫我們創(chuàng)建在這里挣菲,但是兩邊又必須在同樣的結(jié)構(gòu)中,所以這里直接復(fù)制就行掷邦。
結(jié)構(gòu)如下圖:

2017-04-10 20-41-21屏幕截圖.png

2.接下來(lái)就需要調(diào)用了白胀,我這里設(shè)置了一個(gè)Button,點(diǎn)擊就打印一個(gè)log抚岗,內(nèi)容是我們需要調(diào)用的"hello word"字符串或杠,代碼如下

public class MainActivity extends AppCompatActivity {

    private ICloverInterface mInterface;

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

        bindAidlService();

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    String info = mInterface.helloWord();
                    Log.d("MyApp", "onClick: " + info);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void bindAidlService() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("cn.techscan.gd.myservice", "cn.techscan.gd.myservice.MyHelloService"));
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mInterface = ICloverInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(conn);
    }
}

先運(yùn)行服務(wù)端,再運(yùn)行客戶端宣蔚,然后點(diǎn)擊button向抢,輸出log

2017-04-10 20-45-18屏幕截圖.png

大致就是這么個(gè)流程,底層實(shí)現(xiàn)也不是很清楚件已,后面會(huì)繼續(xù)學(xué)習(xí)笋额,就這樣哈!

該demo代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篷扩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茉盏,更是在濱河造成了極大的恐慌鉴未,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸠姨,死亡現(xiàn)場(chǎng)離奇詭異铜秆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)讶迁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門连茧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巍糯,你說(shuō)我怎么就攤上這事啸驯。” “怎么了祟峦?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵罚斗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我宅楞,道長(zhǎng)针姿,這世上最難降的妖魔是什么袱吆? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮距淫,結(jié)果婚禮上绞绒,老公的妹妹穿的比我還像新娘。我一直安慰自己榕暇,他們只是感情好蓬衡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拐揭,像睡著了一般撤蟆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堂污,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天家肯,我揣著相機(jī)與錄音,去河邊找鬼盟猖。 笑死讨衣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的式镐。 我是一名探鬼主播反镇,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娘汞!你這毒婦竟也來(lái)了歹茶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤你弦,失蹤者是張志新(化名)和其女友劉穎惊豺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禽作,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尸昧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旷偿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烹俗。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萍程,靈堂內(nèi)的尸體忽然破棺而出幢妄,到底是詐尸還是另有隱情,我是刑警寧澤尘喝,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布磁浇,位于F島的核電站,受9級(jí)特大地震影響朽褪,放射性物質(zhì)發(fā)生泄漏置吓。R本人自食惡果不足惜无虚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衍锚。 院中可真熱鬧友题,春花似錦、人聲如沸戴质。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)告匠。三九已至戈抄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間后专,已是汗流浹背划鸽。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戚哎,地道東北人裸诽。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像型凳,于是被迫代替她去往敵國(guó)和親丈冬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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