AIDL简单使用

文章介绍了如何使用AIDL(AndroidInterfaceDefinitionLanguage)在Android设备上实现进程间通信(IPC)。通过创建AIDL文件定义接口,服务端实现接口并公开,客户端绑定Service并调用接口方法来通信。在客户端和服务器端,都需要有AIDL文件的副本,以确保有权限访问接口。
摘要由CSDN通过智能技术生成

AIDL(Android Interface Definition Language)是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。 通过 AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。通常,暴露方法给其他应用进行调用的应用称为服务端,调用其他应用的方法的应用称为客户端,客户端通过绑定服务端的 Service 来进行交互。

下面介绍AIDL的使用方法。
1、创建AIDL文件
客户端和服务端都需要创建,我们先在服务端中创建,然后复制到客户端即可。在 Android Studio 中右键点击新建一个 AIDL 文件,系统就会默认创建一个 aidl 文件夹,文件夹下的目录结构即是工程的包名,AIDL 文件就在其中,如图所示:
在服务端创建aidl文件
文件名称为IImoocAidl,我们删除里面默认的basicTypes方法,新增个add方法,用来计算两个数的和。
add方法
2、实现接口
创建或修改过 AIDL 文件后需要 build 下工程,Android SDK 工具会生成以 .aidl 文件命名的 .java 接口文件(例如,IImoocAidl.aidl 生成的文件名是 IIImoocAidl.java),在进程间通信中真正起作用的就是该文件。
IIImoocAidl.java
3、在服务端公开接口
在为服务端实现接口后,需要向客户端公开该接口,以便客户端进行绑定。创建 Service 并实现 onBind(),从而返回生成的 Stub 的类实例。
IRemoteService
我们还需要在 Manefest 文件中注册我们创建的这个 Service,否则客户端无法绑定服务。
注册Service
4、客户端调用IPC方法
当客户端(如 Activity)调用 bindService() 以连接此服务时,客户端的 onServiceConnected() 回调会接收服务端的 onBind() 方法所返回的 binder 实例。

客户端还必须拥有接口类的访问权限,因此如果客户端和服务端在不同应用内,则客户端应用的 src/ 目录内必须包含 .aidl 文件(该文件会生成 android.os.Binder 接口,进而为客户端提供 AIDL 方法的访问权限)的副本。所以我们需要把服务端的 aidl 文件夹整个复制到客户端的 java 文件夹同个层级下,不需要改动任何代码。
复制aidl文件夹
我们在客户端的activity创建如下布局

<?xml version="1.0" encoding="utf-8"?>

<EditText
    android:id="@+id/edd_num1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="+" />

<EditText
    android:id="@+id/edd_num2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="=" />

<EditText
    android:id="@+id/edd_res"
    android:layout_width="match_parent"
    android:enabled="false"
    android:layout_height="wrap_content" />

<Button
    android:id="@+id/btn_add"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="AIDL远程计算" />

客户端代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private EditText mEtNum1;

private EditText mEtNum2;

private EditText mEtNumRes;

private Button mBtnAdd;

IImoocAidl iImoocAidl;

private ServiceConnection conn = new ServiceConnection() {
    // 绑定上服务
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 拿到了远程的服务
        iImoocAidl = IImoocAidl.Stub.asInterface(service);
    }

    // 断开服务
    @Override
    public void onServiceDisconnected(ComponentName name) {
        //回收资源
        iImoocAidl = null;
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    // 软件已启动就绑定服务
    bindService();
}

private void initView() {
    mEtNum1 = findViewById(R.id.edd_num1);
    mEtNum2 = findViewById(R.id.edd_num2);
    mEtNumRes = findViewById(R.id.edd_res);

    mBtnAdd = findViewById(R.id.btn_add);
    mBtnAdd.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    int num1 = Integer.parseInt(mEtNum1.getText().toString().trim());
    int num2 = Integer.parseInt(mEtNum2.getText().toString().trim());
    try {
        // 调用远程的服务
        if (null != iImoocAidl) {
            int res = iImoocAidl.add(num1, num2);
            mEtNumRes.setText(res + "");
        }
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

private void bindService() {
    // 获取到服务端
    Intent intent = new Intent();
    // 新版本 必须 显示Intent 启动绑定服务
    intent.setComponent(new ComponentName("com.example.aidl", "com.example.aidl.IRemoteService"));
    bindService(intent, conn, Context.BIND_AUTO_CREATE);
}


@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(conn);
}

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIDLAndroid Interface Definition Language)是一种用于 Android 平台的接口定义语言,它可以帮助不同进程之间的组件进行通信。下面是使用 AIDL 进行进程间通信的步骤: 1.定义 AIDL 接口 首先,在服务端和客户端之间定义一个 AIDL 接口。在 AIDL 文件中,定义需要向客户端公开的方法和参数。 2.实现 AIDL 接口 在服务端中,实现定义的 AIDL 接口,并在 onCreate() 方法中将其注册到系统中。 3.绑定服务端 在客户端中,使用 bindService() 方法绑定服务端。 4.获取 AIDL 接口实例 在客户端中,实现 ServiceConnection 接口,当服务端连接成功时,会回调 onServiceConnected() 方法。在此方法中,可以获取到 AIDL 接口实例。 5.调用 AIDL 接口方法 在客户端中,通过获取到的 AIDL 接口实例,即可调用服务端暴露的方法。 下面是一个简单的示例代码: 服务端: ``` //定义 AIDL 接口 interface IMyAidlInterface { int add(int a, int b); } //实现 AIDL 接口 class MyAidlInterfaceImpl extends IMyAidlInterface.Stub { @Override public int add(int a, int b) throws RemoteException { return a + b; } } //在 onCreate() 方法中注册 AIDL 接口 @Override public void onCreate() { super.onCreate(); Intent intent = new Intent(this, MyAidlInterfaceService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); Log.i(TAG, "MyAidlInterfaceService is created."); } //定义 ServiceConnection 对象,以便在客户端连接时获取 AIDL 接口实例 private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); Log.i(TAG, "MyAidlInterfaceService is connected."); } @Override public void onServiceDisconnected(ComponentName name) { mIMyAidlInterface = null; Log.i(TAG, "MyAidlInterfaceService is disconnected."); } }; ``` 客户端: ``` //定义 ServiceConnection 对象 private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //获取 AIDL 接口实例 mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); Log.i(TAG, "MyAidlInterfaceService is connected."); } @Override public void onServiceDisconnected(ComponentName name) { mIMyAidlInterface = null; Log.i(TAG, "MyAidlInterfaceService is disconnected."); } }; //使用 bindService() 方法绑定服务端 Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.myaidlservice", "com.example.myaidlservice.MyAidlInterfaceService")); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); //调用服务端暴露的方法 int result = mIMyAidlInterface.add(1, 2); ``` 希望这个简单的示例可以帮助你了解如何使用 AIDL 进行进程间通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值