使用AIDL(一)調(diào)用方法

AIDL(Android Interface Definition Language洞焙,Android接口定義語言)姓赤,它可以用于讓某個Service與多個應用程序組件之間進行跨進程通信院水,從而可以實現(xiàn)多個應用程序共享同一個Service的功能击孩。
  Messenger實現(xiàn)跨進程通信焙压,其實也是基于AIDL作為底層結(jié)構(gòu)忆家。Messenger創(chuàng)建的一個消息隊列是在一個單獨的線程中段审,所以服務一次僅處理一個請求全蝶,然而,如果想要服務同時處理多個請求,就需要使用到AIDL抑淫,但是這種情況下就要考慮多線程和線程安全的問題了绷落。

注意:如果只需要IPC(跨進程通信)、不需要多線程使用Messenger即可始苇;如果只需要IPC砌烁、不需要多線程、有多個應用程序則使用Binder即可催式;只有當需要IPC函喉,有多個應用程序,多線程時才使用AIDL荣月。

示例:在客戶端調(diào)用服務端的方法

1管呵、服務端

1)創(chuàng)建AIDL接口,先在app/src/main目錄下創(chuàng)建aidl文件夾哺窄,再在jun.server(程序的包名)包下創(chuàng)建AIDL接口文件IStudent.aidl捐下。
app/src/main/aidl/jun.server/IStudent.aidl

// IStudent.aidl
package jun.server;

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

interface IStudent {
    String getName();
}

2)創(chuàng)建AIDL接口文件之后系統(tǒng)是不會自動幫我們編譯的,需要手動點擊編譯堂氯,之后會生成相應的Java文件蔑担。
app/build/generated/source/aidl/debug/jun.server/IStudent.java
  3)創(chuàng)建服務
RemoteService.java

public class RemoteService extends Service {

    // 解釋:Stub是繼承Binder的
    IStudent.Stub studentBinder = new IStudent.Stub() {

        // 獲取學生名字
        @Override
        public String getName() throws RemoteException {
            return "Tom";
        }
    };

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 服務銷毀前將Binder置空,方便垃圾回收器回收資源咽白。
        studentBinder = null;
    }
}

4)記得注冊Service

<service android:name=".RemoteService">
    <intent-filter>
        <action android:name="jun.server.RemoteService"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</service>
2啤握、客戶端

1)直接將服務端的AIDL接口文件拷貝到客戶端,并手動編譯晶框。
app/src/main/aidl/jun.server/IStudent.aidl
注意:包名一樣
  2)創(chuàng)建Activity的布局
activity_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/bind_service"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="綁定服務"/>

    <Button
        android:id="@+id/unbind_service"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="解除綁定"/>

    <Button
        android:id="@+id/invoke_method"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="調(diào)用遠程服務的方法"/>
</LinearLayout>

添加了三個按鈕便于操作排抬。
  3)在Activity中綁定遠程服務并調(diào)用它的方法
MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private IStudent mIStudent;

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 拿到遠程服務的代理
            mIStudent = IStudent.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mIStudent = null;
        }
    };

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

        findViewById(R.id.bind_service).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 設置Intent目標是jun.server包的RemoteService
                Intent intent = new Intent("jun.server.RemoteService");
                // 設置包名
                intent.setPackage("jun.server");
                bindService(intent, serviceConnection, BIND_AUTO_CREATE);
                Toast.makeText(MainActivity.this, "已綁定服務", Toast.LENGTH_SHORT).show();
            }
        });

        findViewById(R.id.unbind_service).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (serviceConnection != null) {
                    unbindService(serviceConnection);
                    // 解除綁定時需要回收mIStudent連接資源
                    mIStudent = null;
                    Toast.makeText(MainActivity.this, "已解除綁定", Toast.LENGTH_SHORT).show();
                }
            }
        });

        findViewById(R.id.invoke_method).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mIStudent != null) {
                    try {
                        String name = mIStudent.getName();
                        Log.i(TAG, "Name: " + name);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                } else {
                    Toast.makeText(MainActivity.this, "請先綁定服務", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}
3、運行

先運行服務端再運行客戶端授段,點擊“綁定服務”按鈕讓客戶端綁定服務端的服務蹲蒲,再點擊“調(diào)用遠程服務的方法”按鈕調(diào)用服務端的getName()方法,最后點擊“解除綁定”按鈕解除綁定侵贵。運行結(jié)果如下:

I/MainActivity: Name: Tom

參考

Android--Service之綁定服務交互
Android Service完全解析届搁,關(guān)于服務你所需知道的一切(下)
墨客網(wǎng):AIDL-小白成長記(視頻教程)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窍育,隨后出現(xiàn)的幾起案子卡睦,更是在濱河造成了極大的恐慌,老刑警劉巖漱抓,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件表锻,死亡現(xiàn)場離奇詭異,居然都是意外死亡乞娄,警方通過查閱死者的電腦和手機瞬逊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門显歧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人确镊,你說我怎么就攤上這事士骤。” “怎么了骚腥?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵敦间,是天一觀的道長。 經(jīng)常有香客問我束铭,道長廓块,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任契沫,我火速辦了婚禮带猴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懈万。我一直安慰自己拴清,他們只是感情好,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布会通。 她就那樣靜靜地躺著口予,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涕侈。 梳的紋絲不亂的頭發(fā)上沪停,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音裳涛,去河邊找鬼木张。 笑死,一個胖子當著我的面吹牛端三,可吹牛的內(nèi)容都是我干的舷礼。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼郊闯,長吁一口氣:“原來是場噩夢啊……” “哼妻献!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起团赁,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤育拨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后然痊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡屉符,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年剧浸,在試婚紗的時候發(fā)現(xiàn)自己被綠了锹引。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡唆香,死狀恐怖嫌变,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躬它,我是刑警寧澤腾啥,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站冯吓,受9級特大地震影響倘待,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜组贺,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一凸舵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧失尖,春花似錦啊奄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仪吧,卻和暖如春庄新,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑商。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工摄咆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人人断。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓吭从,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恶迈。 傳聞我的和親對象是個殘疾皇子涩金,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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