AIDL
Android Interface Definition Language //安卓接口定义语言
语法
- 文件类型:用AIDL书写的文件的后缀是 .aidl,而不是 .java。
- 数据类型:AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包, 就算目标文件与当前正在编写的 .aidl 文件在同一个包下 ——在 Java 中,这种情况是不需要导包的。
默认支持的数据类型包括:
- Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char。
- String 类型。
- CharSequence类型。
- List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(下文关于这个会有详解)。List可以使用泛型。
- Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map是不支持泛型的。
- 定向tag:AIDL中的定向 tag 表示了在跨进程通信中数据的流向。用于非默认支持的数据类型,有三种 in代表数据可以从客户端流向服务端 ,out则相反,inout代表支持双向流动
支持自定义类的数据类型 ,但是必须实现Parcelable接口
/**
* 参数是一个Parcel,用它来存储与传输数据
* @param dest
*/
//**这样数据就能支持out流向了**
public void readFromParcel(Parcel dest) {
//注意,此处的读值顺序应当是和writeToParcel()方法中一致的
name = dest.readString();
price = dest.readInt();
}
使用AIDL实现跨进程通信
1.创建AIDL文件,一般所有AIDL用到的类要在同一个包里这样移植也比较方便
interface AIDLManager {
String getName();
void setName(String name);
}
==自定义类一定要导包==
如果不放在一起可以使用以下Gradle代码实现读取同包里的文件
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/aidl']
}
}
2.编写服务端代码
public class MyService extends Service {
private static final String TAG = "MainActivity";
private String name;
//重写方法
AIDLManager.Stub bookManager = new AIDLManager.Stub() {
@Override
public String getName() throws RemoteException {
return name;
}
@Override
public void setName(String name) throws RemoteException {
MyService.this.name = name;
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind: " + name);
//返回对象
return aidlManager;
}
@Override
public void onCreate() {
super.onCreate();
//初始化
name = "Android Interface Definition Language";
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
3.客户端代码
AIDLManager.Stub aidlManager;
ServiceConnection serviceConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
aidlManager = (AIDLManager.Stub)
AIDLManager.Stub.asInterface(service);
try {
String name1 = aidlManager.getName();
aidlManager.setName("sfsfsf");
Log.d(TAG, "onServiceConnected: " + name1);
Toast.makeText(MainActivity.this, "" + name1, Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("cn.gas.testaidl.aidl");
intent.setPackage("cn.gas.testaidl");
bindService(intent, serviceConn, BIND_AUTO_CREATE);
}