本篇主要是简单的演示了AIDL的基本使用,最终实现的效果是当app运行时有两个进程,从app进程发送数据到remoteapp进程,然后返回数据,在app进程展示。其实这就是一个跨进程的数据交互过程,下面介绍一下具体步骤。
新建工程,然后再新建一个module 命名为remoteapp 设置为com.android.library 做为新开的进程,然后开始具体的AIDL操作。
1,在remoroapp中创建AIDL文件IMyAidlInterface.aidl,Android Studio中很简单:
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
String test(String string);
}
创建完成后在Android Studio目录下(app->build->generated->source->aidl->debug)可以查看到对应的文件IMyAidlInterface,如果没有生产这个文件就build->make project
2,在remoteapp中创建远程service AIDLRemoteService
public class AIDLRemoteService extends Service {
private static final String TAG = "AIDLRemoteService";
private final IMyAidlInterface.Stub mBinder=new IMyAidlInterface.Stub(){
@Override
public String test(String string) throws RemoteException {
Log.d(TAG, "testMethod: "+string);
return "我是remoteapp返回的";
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
3,在AndroidManifest中注册:
<service android:name=".service.AIDLRemoteService"
android:process=":remote"/>
4,将remoteapp中aidl文件夹整体copy到app中去,然后make projects 查看是否有对应文件生成。到此整体项目的结构如下图:
5,在app中绑定service,
bindService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AidlActivity.this, AIDLRemoteService.class);
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
});
5,startService
startService.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Log.e("+++",mMyAIDL.test("我是app来的"));
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
这是我们在Android Device Monitor中查看可以看出app运行时有两个不同的进程:
查看打印结果:
在vico.xin.mvpdemo这端查看:
11-28 17:27:04.989 32383-32383/vico.xin.mvpdemo E/+++: 我是remoteapp返回的
然后切换到vico.xin.mvpdemo:remote查看:
11-28 17:27:04.989 32445-32460/vico.xin.mvpdemo:remote E/+++: 我是app来的
由此可以看到已经实现了文章开头描述的效果。由vico.xin.mvpdemo进程发送数据到vico.xin.mvpdemo:remote进程并且得到了返回的数据。