首先让我解释一下 AIDL 文件是什么:
每个 Android 应用程序都在自己的进程中运行。所以一个应用程序不能访问另一个应用程序的内存空间,或者换句话说,一个进程不能访问另一个进程的内存。因此,为了让这种情况发生,我们需要将它们的对象分解为操作系统可以理解的原语,并为您跨边界编组对象。进行编组的代码编写起来很乏味,因此 Android 使用 AIDL 为您处理它 - 意思是,进程间通信 (IPC) 可以通过 AIDL 轻松处理。为了更好地理解,将其视为客户端和服务器应用程序之间的通信。客户端发送请求,服务器响应。本教程将通过清晰的示例和源代码以简单的方式解释这种进程间通信。为了使我们的示例简单,让我们接受计算请求。客户端应用程序将从用户那里获得两个号码并发送到服务器应用程序。服务器应用程序将执行这些数字的加法并将总和返回给客户端应用程序。
AIDL 可以按照以下步骤实现: 定义 AIDL 接口 - 与您的应用程序接口的 AIDL。实现接口 - 上面的接口将在服务中实现,以便客户端可以访问。向客户端公开接口 - 要为您的服务公开接口,请扩展 Service 并实现 onBind()
定义 AIDL 接口 该文件定义了带有方法签名的编程接口。AIDL 接口应在 .aidl 文件中定义。在我们的例子中,它的 IAdd.aidl 带有以下代码。
IAdd.aidl
package com.example.android_additionservice;
interface IAdd
{
int add(int num1, int num2);
}
当我们构建我们的应用程序时,Android SDK 会生成与这个 .aidl 文件对应的 .java 文件,该文件与 IAdd.java 同名。生成的接口包括一个名为 Stub 的子类,它是其父接口的抽象实现,并声明了 .aidl 文件中的所有方法
实现接口(AdditionService.java) 要实现从.aidl 生成的接口,扩展生成的Binder 接口并实现从.aidl 文件继承的方法。在我们的例子中,我们需要在这里实现 add 方法。现在 mBinder 是 Stub 类(一个 Binder)的实例,它定义了服务的 RPC 接口。
private final IAdd.Stub mBinder = new IAdd.Stub() {
@Override
public int add(int num1, int num2) throws RemoteException {
return (num1 + num2);
}
};
向客户端公开接口(AdditionService.java) 实现接口后,我们需要将其公开给其他应用程序以访问它。为此扩展服务并实现 onBind() 以返回实现生成的存根的类的实例。
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return mBinder;
}
加法服务.java
package com.example.android_additionservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import com.example.android_additionservice.IAdd;
public class AdditionService extends Service {
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return mBinder;
}
// IAdd definition is below
private final IAdd.Stub mBinder = new IAdd.Stub() {
@Override
public int add(int num1, int num2) throws RemoteException {
// TODO Auto-generated method stub
return (num1 + num2);
}
};
}
在 AndroidManifest.xml 中注册服务 由于服务器应用程序是一个服务,让我们在 AndroidManifest.xml 文件中注册它。
就是这样..我们完成了服务器应用程序。