使用AIDL创建一个demo 主要参考文件, 以及其他地址
Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers
绑定服务概览 | Android 开发者 | Android Developers
Android 接口定义语言 (AIDL)
Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似。您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题。
注意: 只有在需要不同应用的客户端通过 IPC 方式访问服务,并且希望在服务中进行多线程处理时,您才有必要使用 AIDL。如果您无需跨不同应用执行并发 IPC,则应通过实现 Binder 来创建接口;或者,如果您想执行 IPC,但不 需要处理多线程,请使用 Messenger来实现接口。无论如何,在实现 AIDL 之前,请您务必理解绑定服务。
上面是官网对AIDL的描述,下面说了使用AIDL创建一个简单的dmeo
1 选中自己包名
2 点击鼠标右键 之后选择new ,之后再选择AIDL 在点击AIDL File
之后自己取一个名字点击finish
3 之后android studio 会自动生成一个AIDL包如下, 下面文件是自己刚才文件的,报名时工具生成
一般里面默认有一个方法,自己有添加了几个,1个void 和2个有返回值的方法,具体如下
// Declare any non-default types here with import statements
interface Information {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
// 自己定义的几个方法
void Infor(String name ,int age);
boolean isActive();
List<String> getList();
}
4 之后再点击工具栏上的Build
5 选择里面的Make Project
之后自己在app下面的build里面查看生成的文件,如果文件生成了,就可以接着下面的工作了
下面图是 Make Project 生成的
AIDL文件生成之后下面写代码
创建一个Service
public class InforService extends Service {
private final IBinder iBinder = new Information.Stub() {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
Log.d("******InforService", "Received data: " + anInt + ", " + aLong + ", " + aBoolean + ", " + aFloat + ", " + aDouble + ", " + aString);
}
@Override
public void Infor(String name, int age) throws RemoteException {
Log.d("******infor", "姓名=" + name + "," + "年龄=" + age);
}
@Override
public boolean isActive() throws RemoteException {
return true;
}
@Override
public List<String> getList() throws RemoteException {
return Arrays.asList("A", "B", "C", "D");
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d("******Bind service:", String.valueOf(intent));
return iBinder;
}
}
之后再AndroidManifest 文件里面注册下刚才创建的服务
<service
android:name="com.hly.aidldemo.InforService"
android:enabled="true"
android:exported="true" />
最后在Main里面使用ServiceConnection来获取AIDL连接成功和失败的方法
在连接成功的方法里面使用asInterface获取AIDL里面的方法
下面是自己放2个void方法里面传递一些参数,然后获取2个有返回值的方法,如下
public class MainActivity extends ComponentActivity {
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Information information = Information.Stub.asInterface(service);
try {
//传递参数
information.basicTypes(18,18L,true,18.88f,18.88,"HI");
information.Infor("张三丰",180);
//获取参数
Log.d("******isActive", String.valueOf(information.isActive()));
Log.d("******getList", String.valueOf(information.getList()));
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d("******onServiceDisconnected,","onServiceDisconnected:"+name);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity_layout);
Intent intent = new Intent(this,InforService.class);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
}
这样一个简答的AIDLdemo 流程就创建完成了。