學習AIDL入門-一個簡單的小demo

目錄

 

1、簡介

2、AIDL實戰

2.1 創建一個Project

2.2 創建服務端

2.3 創建一個客戶端應用

2.4 測試

參考文獻


1、簡介

Android中跨進程數據傳輸方式有很多種,例如四大組件之一的ContentProvider、bundle及AIDL等等,本篇文章主要採用一個Demo的方式來講述AIDL的基本用法。

什麼是AIDL?

引用官方翻譯的一句話:AIDL(Android 接口定義語言),您可以利用它定義客戶端與服務使用進程間通信 (IPC) 進行相互通信時都認可的編程接口。再此之前,你如果沒有了解過AIDL,很難理解這句話的真正含義,這也是本文爲何從實現一個Demo入手來真正理解AIDL。

2、AIDL實戰

2.1 創建一個Project

使用Android Studio 創建一個Project,這一步十分簡單,這裏就不截圖展示了。

2.2 創建服務端

在通過Android Studio創建一個Project的時候,默認會爲我們創建一個app應用,在此我們就以app作爲服務端。

2.2.1 創建aidl文件

首先使用Android Studio 創建一個AIDL Folder,例如下圖:

注意選擇的是爲application的module,此時會在main目錄下看到一個aidl文件夾。然後再該文件夾下創建一個aidl文件,具體如下圖:

命名好文件名,我們會看到在aidl文件夾下會創建與應用程序相同的包,在包下會有對應的aidl文件,如下:

以上幾步,可能不同版本的Android Studio創建aidl的位置不一樣,但是最終都需要把aidl文件夾及文件都移至main文件夾下,並且aidl文件的包名必須和應用程序的包名一致。

編譯一下整個項目,我們就能夠在build文件夾下看到具體的.java文件,如下:

此文件是自動生成的,我們可以不用去理會。

2.2.2 爲aidl文件添加代碼

打開aidl文件,我們發現它其實就是一個接口,我們可以添加我們需要的方法,例如我添加如下:

2.2.3 創建一個Service

如果需要使用AIDL,它需要綁定在一個服務之上,因此需要創建一個Service來實現aidl中的具體接口。我實現的代碼如下:

此時我們的服務端已經編寫完成,接下來可以進行客戶端的實現了。

2.3 創建一個客戶端應用

2.3.1 創建一個moudle並拷貝aidl文件

在2.1中的project下,我們右鍵再次創建一個類型爲application的module,同時將app中我們創建好的aidl文件拷貝到相同的目錄下。例如下:

2.3.2 activity中綁定具體的服務

有關activity中的佈局文件,此處就不在粘貼,這裏將activity中的代碼全部粘貼如下:

public class AidlClientTestMainActivity extends AppCompatActivity {

    private EditText mEtData1;
    private EditText mEtData2;
    private TextView mTvShowResult;

    private IMyAidlInterface iMyAidlInterface;

    private ServiceConnection conn = new ServiceConnection() {

        // 綁定上服務
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder service) {
            Log.i("lvjie", "onServiceConnected()...");
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        }

        // 斷開服務
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.i("lvjie", "onServiceDisconnected()...");
            iMyAidlInterface = null;
        }
    };

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

        initView();
    }

    private void initView(){
        this.mEtData1 = (EditText) findViewById(R.id.et_data_1);
        this.mEtData2 = (EditText) findViewById(R.id.et_data_2);
        this.mTvShowResult = (TextView) findViewById(R.id.tv_show_result);
    }

    // Button綁定了此函數
    public void onClickConnectService(View view){
        bindAidlService();
    }

    // Button綁定了此函數
    public void onClickAidlTestBtn(View view){

        int num1 = 0;
        int num2 = 0;
        try {
            num1 = Integer.parseInt(this.mEtData1.getText().toString());
            num2 = Integer.parseInt(this.mEtData2.getText().toString());
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }

        try {
            int result = iMyAidlInterface.add(num1, num2);

            mTvShowResult.setText(""+num1+" + "+num2+" = "+result);
        } catch (RemoteException e) {
            Log.i("lvjie", e.toString());
            mTvShowResult.setText("出錯了...");
        }
    }

    private void bindAidlService() {
        // 獲取服務
        Intent intent = new Intent();
        // 顯示intent啓動服務, 需要注意此處的包名和MyAidlService類的全名
        intent.setComponent(new ComponentName("com.android.study.example", "com.android.study.example.aidl.MyAidlService"));

        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }


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

2.4 測試

首先我們需要運行app,將此應用程序安裝到手機或模擬器上,再次運行myaidlclient應用程序,最後演示myaidlclient應用程序如下:

 

 

參考文獻

https://developer.android.com/guide/components/aidl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章