AIDL是通过Binder 实现的进程间通信,默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,除了这些类型之外的数据类型,在使用之前必须导包,就算目标文件与aidl 文件在同一个包下。
默认支持的数据类型包括: Java中的八种基本数据类型;String 类型;CharSequence类型;定义的parcelable(传递对象时,类要实现pacelable接口,android studio可自动生成);List类型:List中的所有元素必须是AIDL支持的类型之一;Map类型:Map中的所有元素必须是AIDL支持的类型之一。
Gradle 在构建项目的时候通过 sourceSets 来配置不同文件的访问路径,Gradle 默认是将 java 代码的访问路径设置在 java 包下的,如果 java 文件是放在 aidl 包下的话访问不到,做如下设置:
修改 module的build.gradle 文件,在 android{} 中加上下面的内容:
sourceSets {
main {
java.srcDirs = [“src/main/java”, “src/main/aidl”]
}
}
如此做,我们可以把java文件和aidl文件放到同一包下,创建的aidl文件默认在aidl文件夹下。
示例:A应用从B应用获取一个图书列表
B应用创建的文件
如果要传递对象,创建的类要实现parcelable接口,还要创建与之对应的aidl,做如下声明:
// Book.aidl
package com.hao.www.aidlserver;
parcelable Book;
这样才可以在IBookManager.aidl中调用:
// IBookManager.aidl
package com.hao.www.aidlserver;
// Declare any non-default types here with import statements
import com.hao.www.aidlserver.Book;
interface IBookManager {
List<Book> getBooks();
}
将aidl文件夹复制到A应用:
包名要与B应用一致,然后rebuild重新编译一下,可自动生成对应的java文件,如图:
A应用调用如下:
public class MainActivity extends AppCompatActivity {
private Button byId;
private List<Book> books;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
byId = (Button) findViewById(R.id.button);
byId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
ComponentName componentName = new ComponentName("com.hao.www.aidlserver", "com.hao.www.aidlserver.RemoteService");
intent.setComponent(componentName);
bindService(intent,new MyServiceConnection(), Service.BIND_AUTO_CREATE);
}
});
}
class MyServiceConnection implements ServiceConnection{
private static final String TAG = "MyServiceConnection";
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IBookManager iBookManager = IBookManager.Stub.asInterface(service);
try {
books = iBookManager.getBooks();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < books.size(); i++) {
sb.append(books.get(i).getName()+":"+books.get(i).getPrice()+",");
}
Toast.makeText(MainActivity.this,new String(sb),Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
示例地址:点击打开链接,导入后分别运行aidlserver module和app module