AS中使用AIDL

AIDL 介紹:

AIDL 是 Android Interface definition language的縮寫(xiě),它是一種android內(nèi)部進(jìn)程通信接口的描述語(yǔ)言,通過(guò)它我們可以定義進(jìn)程間的通信接口。

新建兩個(gè)小demo

server.png

client.png

這里新建兩個(gè)工程,一個(gè)服務(wù)端,一個(gè)客戶(hù)端,用于實(shí)踐。

AIDL文件

在server端新建一個(gè)aidl文件,操作如下:


新建aidl文件.png

新建之后的目錄結(jié)構(gòu)如下:


新建后的目錄結(jié)構(gòu).png

打開(kāi)剛才新建的aidl文件:
aidl文件.png

如果需要定義一些非基本類(lèi)型的類(lèi),也需要放在和AIDL文件同目錄下。

將整個(gè)AIDL文件拷貝到客戶(hù)端同樣的目錄下面:


拷貝到客戶(hù)端.png

兩端都編譯一下,系統(tǒng)會(huì)生成對(duì)應(yīng)的接口類(lèi):


生成的接口類(lèi).png

Server端開(kāi)發(fā)

在Server端,創(chuàng)建一個(gè)Service:


新建的Service.png

在配置文件中注冊(cè)一下:


注冊(cè)Service.png

Client端開(kāi)發(fā)

在Clinet端簡(jiǎn)單的隱式啟動(dòng)剛才的Service,然后取得那個(gè)IBinder對(duì)象,轉(zhuǎn)換為IMyAidlInterface對(duì)象,再調(diào)接口:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private Button clickButton;
    private TextView showTextView;

    private String action = "net.wyf.myaidlserver.service.MyService";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        clickButton = findViewById(R.id.clickId);
        showTextView = findViewById(R.id.answerId);
        bind();
        clickButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (aidlInterface != null) {
                    try {
                        double add = aidlInterface.add(1.3, 2.4);
                        Log.d(TAG, "onClick: "+ add);
                        showTextView.setText(add + "");
                    } catch (RemoteException e) {
                        e.printStackTrace();
                        showTextView.setText("fail");
                    }
                } else {
                    Log.e(TAG, "fail");
                    showTextView.setText("fail");
                }

            }
        });
    }

    IMyAidlInterface aidlInterface;

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            aidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.e(TAG, "onServiceDisconnected: ");
        }
    };

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

    private void bind() {
        Intent intent = new Intent(action);
        intent.setPackage("net.wyf.myaidlserver");
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);
    }
}

注意:隱式啟動(dòng)Service的時(shí)候千萬(wàn)不要忘記加包名。

運(yùn)行結(jié)果

客戶(hù)端打印.png
服務(wù)端打印.png

一個(gè)簡(jiǎn)單的例子實(shí)現(xiàn)了。
MyAIDLClient:https://gitee.com/xiaobindegushi/MyAIDLClient
MyAIDLServer:https://gitee.com/xiaobindegushi/MyAIDLServer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,813評(píng)論 25 708
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評(píng)論 18 139
  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2、Andro...
    隔壁老李頭閱讀 10,808評(píng)論 13 43
  • 前言 在決定用這個(gè)標(biāo)題之前甚是忐忑,主要是擔(dān)心自己對(duì)AIDL的理解不夠深入,到時(shí)候大家看了之后說(shuō)——你這是什么玩意...
    lypeer閱讀 38,170評(píng)論 22 289
  • 想長(zhǎng)的更高更大 根就要扎地更深更密 享受更多的陽(yáng)光 也會(huì)承受更多的風(fēng)雨 蔑視小草的軟弱 經(jīng)枯榮卻不能快樂(lè)重生
    蒼松立鶴閱讀 302評(píng)論 0 1