目錄
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應用程序如下: