AIDL:接口定義語言(Android Interface definition language)
aidl是實現進程間通信的一種方法,習慣上用 服務端 和 客戶端 來區分通信的兩端
1、服務端:被調用的一端
步驟:
1、創建.aidl文件
2、實現接口
3、將接口暴露給客戶端
2、客戶端:調用的一端
步驟:
1、綁定服務
2、綁定服務後回調被綁定服務中的方法
下面是一個使用aidl進行加法運算的Demo
服務端:
1.1、創建.aidl文件,如下圖:
客戶端與服務端創建的.aidl文件應完全相同,包括包名,.aidl的文件名,以及.aidl文件中定義的接口,如下圖:
IMyAidlInterface.aidl:
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
int add(int num1,int num2);
}
在服務端中創建 IRemoteService ,如上圖,並將IRemoteService註冊到清單文件中:
創建 IRemoteService:
//創建.aidl文件---(將IRemoteService註冊到清單文件中)--->實現接口------>將接口暴露給客戶端
//1.2實現接口
private IBinder mIBinder = new IMyAidlInterface.Stub() {
@Override
public int add(int num1, int num2) throws RemoteException {
return num1 + num2;
}
};
//1.3將接口暴露給客戶端
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mIBinder;
}
}
註冊IRemoteService:
<service android:name=".IRemoteService"
android:exported="true"
android:process=":remote"/>
客戶端:activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal"
tools:context="com.viciy.aidlclient.MainActivity">
<EditText
android:id="@+id/et_num1"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+"
android:textColor="@android:color/black"
android:textSize="30dp"/>
<EditText
android:id="@+id/et_num2"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="="
android:textColor="@android:color/black"
android:textSize="30dp"/>
<EditText
android:id="@+id/et_num3"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"/>
<Button
android:id="@+id/bt_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="add"/>
</LinearLayout>
MainActivity.class:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView num1;
private TextView num2;
private TextView num3;
private Button btAdd;
private int num4;
IMyAidlInterface myAidlInterface;
//2.2服務綁定後的回調
private ServiceConnection conn = new ServiceConnection() {
/**
* 服務綁定成功後調用,獲取服務端的接口;
* 這裏的service就是服務端onBind返回的,
* 已實現的IBinder接口
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
/**
* 解除綁定時調用;
* 清空接口,防止內存溢出
*/
@Override
public void onServiceDisconnected(ComponentName name) {
myAidlInterface = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//2.1綁定服務
bindService();
//初始化界面
initView();
}
//綁定服務
private void bindService() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.viciy.aidlserver",
"com.viciy.aidlserver.IRemoteService"));
bindService(intent,conn, Context.BIND_AUTO_CREATE);
}
private void initView() {
num1=(TextView)findViewById(R.id.et_num1);
num2=(TextView)findViewById(R.id.et_num2);
num3=(TextView)findViewById(R.id.et_num3);
btAdd=(Button)findViewById(R.id.bt_add);
btAdd.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int num1 = Integer.parseInt(this.num1.getText().toString());
int num2 = Integer.parseInt(this.num2.getText().toString());
try {
num4 = myAidlInterface.add(num1,num2);
} catch (RemoteException e) {
e.printStackTrace();
}
num3.setText(num4+"");
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除綁定
unbindService(conn);
}
}