简介
1,AIDL的全称是Android Interface Definition Language
2,目的是为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信
3,建立一个扩展名为aidl的文件
4,如果aidl文件的内容是正确的,ide会自动生成一个Java接口文件(*.java)
5,在AndroidManifest.xml文件中配置AIDL服务
6,< action >标签的android:name属性值就是客户端要引用该服务的ID
使用aidl进行跨进程通讯
在项目中创建aidl文件
右键要创建文件的项目包名 -> new -> aidl -> aidl file
编写adil文件
// IHermesService.aidl
package com.xxx.hermes.bean;
// Declare any non-default types here with import statements
//这里需要自己手动添加,并且有与之对应的java文件和aidl文件
import com.xxx.hermes.bean.HermesBean;
interface IHermesService {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
HermesBean getHermesBean();
void setHermesBean(int id,String name,double money);
}
//对应的HermesBean的aidl文件
// HermesBean.aidl
package com.xxx.hermes.bean;
// Declare any non-default types here with import statements
parcelable HermesBean;
package com.xxx.hermes.bean;
import android.os.Parcel;
import android.os.Parcelable;
//HermesBean于之对应的HermesBean.aidl必须在同一个包名路径下
public class HermesBean implements Parcelable {
private int id;
private String name;
private double money;
//省略构造方法、序列化、反序列化、get/set方法、toString
}
实现adil的接口
package com.xxx.hermes.aidl;
import android.util.Log;
import com.xxx.hermes.bean.HermesBean;
import com.xxx.hermes.bean.IHermesService;
//实现adil的接口,暴露给客户端使用
public class HermesAidl extends IHermesService.Stub {
@Override
public HermesBean getHermesBean() {
return new HermesBean(1, "admin", 9999D);
}
@Override
public void setHermesBean(int id, String name, double money) {
HermesBean hermesBean = new HermesBean(id, name, money);
Log.i("appjson", "其他进程传递进来的:" + hermesBean.toString());
}
}
aidl服务端
package com.xxx.hermes.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import com.xxx.hermes.aidl.HermesAidl;
//跨进程通信的服务端
public class HermesService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new HermesAidl();
}
}
AndroidManifest.xml
<application>
<service
android:name="com.xxx.hermes.service.HermesService"
android:enabled="true"
android:process=":hermes" />
</application>
aidl客户端
public class MainActivity extends AppCompatActivity {
private IHermesService iHermesService = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这里开启aidl的服务端
Intent i = new Intent(this, HermesService.class);
startService(i);
}
@Override
protected void onStart() {
super.onStart();
//绑定这个客户端
Intent intent = new Intent(this, HermesService.class);
bindService(intent, hermesConnection, BIND_ABOVE_CLIENT);
}
@Override
protected void onDestroy() {
super.onDestroy();
//解绑这个客户端
if (hermesConnection != null)
unbindService(hermesConnection);
}
//服务链接
private ServiceConnection hermesConnection = new ServiceConnection() {
//服务链接
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
iHermesService = IHermesService.Stub.asInterface(iBinder);
Toast.makeText(MainActivity.this, "服务连接", Toast.LENGTH_SHORT).show();
}
//服务断开
@Override
public void onServiceDisconnected(ComponentName componentName) {
iHermesService = null;
Toast.makeText(MainActivity.this, "服务断开连接", Toast.LENGTH_SHORT).show();
}
};
//测试通信
public void onHermes(View view) throws RemoteException {
if (iHermesService != null) {
Toast.makeText(this, "服务已连接,获得HermesBean实例:" + iHermesService.getHermesBean().toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "服务断开连接", Toast.LENGTH_SHORT).show();
}
}
}