Android - AIDL 使用

AIDL(Android Interface Definition Language)

程序員可以利用AIDL自定義編程接口喊衫,在客戶(hù)端和服務(wù)端之間實(shí)現(xiàn)進(jìn)程間通信(IPC)。在Android平臺(tái)上糯而,一個(gè)進(jìn)程通常不能訪(fǎng)問(wèn)另外一個(gè)進(jìn)程的內(nèi)存空間,因此谅河,Android平臺(tái)將這些跨進(jìn)程訪(fǎng)問(wèn)的對(duì)象分解成操作系統(tǒng)能夠識(shí)別的簡(jiǎn)單對(duì)象框都。并為跨應(yīng)用訪(fǎng)問(wèn)而特殊編排和整理這些對(duì)象。用于編排和整理這些對(duì)象的代碼編寫(xiě)起來(lái)十分冗長(zhǎng)霎箍,所以Android的AIDL提供了相關(guān)工具來(lái)自動(dòng)生成這些代碼寻狂。

例子:創(chuàng)建兩個(gè)apk,一個(gè)作為服務(wù)提供方朋沮,一個(gè)作為AIDL服務(wù)調(diào)用方。

android studio

AIDL服務(wù)方代碼

一共4步
1.先進(jìn)入服務(wù)方的工程缀壤,在com.rust.aidl包內(nèi)創(chuàng)建IMyService.aidl文件

// IMyService.aidl
package com.rust.aidl;

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

interface IMyService {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
    String helloAndroidAIDL(String name);// 此次使用的方法
}

2.在com.rust.service包內(nèi)創(chuàng)建MyService.java文件樊拓;有一個(gè)內(nèi)部類(lèi)MyServiceImpl實(shí)現(xiàn)接口的功能

package com.rust.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;

import com.rust.aidl.IMyService;

public class MyService extends Service {

    public class MyServiceImpl extends IMyService.Stub {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
                               double aDouble, String aString) throws RemoteException {

        }

        public String helloAndroidAIDL(String name) throws RemoteException {
            Log.d("aidl", "helloAndroidAIDL heard from : " + name);
            return "Rust: Service01 return value successfully!";
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyServiceImpl();// 返回內(nèi)部類(lèi)實(shí)例
    }
}

3.實(shí)現(xiàn)了MyService類(lèi)后,對(duì)此AIDL服務(wù)進(jìn)行配置塘慕;在AndroidManifest.xml文件中配置

        <service android:name="com.rust.service.MyService">
            <intent-filter>
                <action android:name="com.rust.aidl.IMyService" />
            </intent-filter>
        </service>

service寫(xiě)實(shí)現(xiàn)類(lèi)MyService筋夏;action里面寫(xiě)上AIDL文件
4.發(fā)布運(yùn)行此apk

AIDL調(diào)用方代碼

建立(或進(jìn)入)AIDL調(diào)用方的工程,這里是MyAIDLTest工程图呢。有如下3個(gè)步驟:
1.將AIDL服務(wù)端生成的Java文件復(fù)制到調(diào)用方工程里条篷,盡量保持這個(gè)Java文件的路徑與服務(wù)端的一致,便于識(shí)別
2.寫(xiě)代碼綁定服務(wù)蛤织,獲取AIDL服務(wù)對(duì)象
3.通過(guò)AIDL服務(wù)對(duì)象完成AIDL接口調(diào)用

本例中赴叹,生成的Java文件路徑為:服務(wù)端/app/build/generated/source/aidl/debug/com/rust/aidl/IMyService.java
將其復(fù)制到調(diào)用方工程下:MyAIDLTest/app/src/main/java/com/rust/aidl/IMyService.java
編寫(xiě)調(diào)用方MainActivity.java代碼

package rust.myaidltest;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.rust.aidl.IMyService;

public class MainActivity extends AppCompatActivity {

    Button aidlBtn;
    IMyService myService;// 服務(wù)
    String appName = "unknown";

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService = IMyService.Stub.asInterface(service);// 獲取服務(wù)對(duì)象
            aidlBtn.setEnabled(true);
        }// 連接服務(wù)

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

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

        aidlBtn = (Button) findViewById(R.id.aidl_1_btn);
        appName = getPackageName();
        
        // 我們沒(méi)辦法在構(gòu)造Intent的時(shí)候就顯式聲明.
        Intent intent = new Intent("com.rust.aidl.IMyService");
        // 既然沒(méi)有辦法構(gòu)建有效的component,那么給它設(shè)置一個(gè)包名也可以生效的
        intent.setPackage("com.rust.aboutview");// the service package
        // 綁定服務(wù),可設(shè)置或觸發(fā)一些特定的事件
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

        aidlBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // AIDL服務(wù)調(diào)用代碼如下:
                    String msg = myService.helloAndroidAIDL(appName);
                    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
效果

點(diǎn)擊調(diào)用端的按鈕指蚜,彈出Toast:Rust: Service01 return value successfully!
服務(wù)端apk打印log:helloAndroidAIDL heard from : rust.myaidltest
其中乞巧,rust.myaidltest就是調(diào)用端傳入的自身的包名
服務(wù)端更新后,如果aidl文件沒(méi)改動(dòng)摊鸡,不需要更新生成的Java文件
如果服務(wù)端apk被卸載绽媒,調(diào)用端使用此服務(wù)時(shí)會(huì)出錯(cuò)

最后編輯于
?著作權(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)店門(mén)牌芋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人松逊,你說(shuō)我怎么就攤上這事躺屁。” “怎么了经宏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵犀暑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我烁兰,道長(zhǎng)耐亏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任沪斟,我火速辦了婚禮广辰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘主之。我一直安慰自己择吊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布槽奕。 她就那樣靜靜地躺著几睛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粤攒。 梳的紋絲不亂的頭發(fā)上所森,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音夯接,去河邊找鬼焕济。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盔几,可吹牛的內(nèi)容都是我干的吼蚁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼问欠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肝匆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起顺献,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旗国,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后注整,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一惭婿、第九天 我趴在偏房一處隱蔽的房頂上張望不恭。 院中可真熱鬧,春花似錦财饥、人聲如沸换吧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至筋遭,卻和暖如春打颤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漓滔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 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)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評(píng)論 25 707
  • 一、概述 AIDL 意思即 Android Interface Definition Language琳骡,翻譯過(guò)來(lái)就...
    業(yè)志陳閱讀 118,080評(píng)論 45 174
  • 該文章只介紹AIDL的使用锅论,主要是自己平時(shí)工作的一個(gè)總結(jié),以防自己忘記楣号。 今天做這樣一件事:1.建立一個(gè)客戶(hù)端2....
    Cloverss閱讀 304評(píng)論 0 2
  • 本文介紹Service與Activity之間的通信剔猿,文章包含以下內(nèi)容: 一、Service基本用法 二嬉荆、通過(guò)AID...
    developerzjy閱讀 10,484評(píng)論 7 27
  • 童年是什么归敬?在我印象里,童年就像每日清晨喝的一杯蜂蜜水员寇,小時(shí)候除了能感覺(jué)到甜甜的味道其他的也嘗不出來(lái)什么了弄慰;童年就...
    三歲的世界閱讀 172評(píng)論 0 0