AIDL通讯机制

  

🍎个人博客:个人主页

🏆个人专栏Android

⛳️  功不唐捐,玉汝于成

目录

正文

1、接口定义

2、数据传输

3、Binder机制

4、使用场景

5、线程安全

 我的其他博客


正文

AIDL通讯机制

它是android平台上用于实现跨进程通信的一种机制。 在android中 不同的应用程序或者同一个应用程序的不同组件 运行在不同进程中,她们之间如果需要进行数据传递或者方法调用 就需要借助跨进程通信机制实现。

AIDL允许开发者定义接口,来描述一个进程中的服务接口,使其他进程可以通过这些接口来调用服务的方法或者传输数据。

1、接口定义

AIDL核心在于定义接口,允许一个进程通过该接口调用另一个进程的方法。接口定义过程包括

  • 创建AIDL文件

    • 在main/aidl目录下创建.aidl文件 ,定义接口。 adil文件的语言和java接口类似,包含接口名 方法签名 和参数类型

    interface IMyAidlInterface{
        void sendData(int data);
        String getData();
    }
    ​
    ​
  • 编译AIDL文件

    • 编译器会根据aidl文件生成相应的java接口和binder类用于进程通信

2、数据传输

AIDL支持传输基本数据类型,自定义Parcelable类型 list 和map

  • 基本数据类型

    • 支持int long boolean float double string

  • 自定义Parcelable类型

    • 需要Parcelable接口用于序列化和反序列化数据对象

    • public class MyData implements Parcelable {
          private int id;
          private String name;
      ​
          protected MyData(Parcel in) {
              id = in.readInt();
              name = in.readString();
          }
      ​
          public static final Creator<MyData> CREATOR = new Creator<MyData>() {
              @Override
              public MyData createFromParcel(Parcel in) {
                  return new MyData(in);
              }
      ​
              @Override
              public MyData[] newArray(int size) {
                  return new MyData[size];
              }
          };
      ​
          @Override
          public int describeContents() {
              return 0;
          }
      ​
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeInt(id);
              dest.writeString(name);
          }
      }
    • List和map

    3、Binder机制

    • binder是Android中实现进程间通信的核心机制。Binder工作原理

    • 服务端通过继承binder类创建binder对象 实现AIDL接口

    • // MyService.java
      package com.example.aidl;
      ​
      import android.app.Service;
      import android.content.Intent;
      import android.os.IBinder;
      import android.os.RemoteException;
      ​
      public class MyService extends Service {
          private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {
              @Override
              public void sendData(int data) throws RemoteException {
                  // Implementation
              }
      ​
              @Override
              public String getData() throws RemoteException {
                  return "Data";
              }
          };
      ​
          @Override
          public IBinder onBind(Intent intent) {
              return mBinder;
          }
      }
      ​
    • 客户端绑定服务

      • 客户端通过 bindService() 方法绑定到服务端,获取 AIDL 接口的代理对象。例如:

        • // ClientActivity.java
          package com.example.aidl;
          ​
          import android.content.ComponentName;
          import android.content.Context;
          import android.content.Intent;
          import android.content.ServiceConnection;
          import android.os.IBinder;
          import android.os.RemoteException;
          ​
          public class ClientActivity extends AppCompatActivity {
              private IMyAidlInterface mService;
          ​
              private ServiceConnection mConnection = new ServiceConnection() {
                  @Override
                  public void onServiceConnected(ComponentName name, IBinder service) {
                      mService = IMyAidlInterface.Stub.asInterface(service);
                  }
          ​
                  @Override
                  public void onServiceDisconnected(ComponentName name) {
                      mService = null;
                  }
              };
          ​
              @Override
              protected void onStart() {
                  super.onStart();
                  Intent intent = new Intent(this, MyService.class);
                  bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
              }
          ​
              @Override
              protected void onStop() {
                  super.onStop();
                  unbindService(mConnection);
              }
          }
          ​
  • 4、使用场景

    • AIDL常用于需要夸通信的场景,

      • 远程服务调用

        • 实现一个远程服务,让不同应用程序调用服务端的方法。例如音乐播放器应用提供远程控制接口,允许其他应用程序控制音乐播放。

      • 数据共享

        • 在不同应用程序之间共享数据。 例如在某个应用提供数据查询接口,其他应用通过该接口获取数据。

  • 5、线程安全

    • 由于aidl接口的方法调用可能发生在不同的线程中需要注意线程安全性。可以通过下面保证安全

      • 同步方法

        • 在aidl接口的实现方法中使用同步代码块,确保数据一致

      • Handler

        • 使用 Handler 将方法调用切换到主线程或指定线程,从而避免线程冲突。

        读写锁

        • 使用读写锁(如 ReentrantReadWriteLock)实现高效的线程安全访问。

 我的其他博客

【MySQL】数据库规范化的三大法则 — 一探范式设计原则-CSDN博客

【JAVA】线程的run()和start()有什么区别?-CSDN博客

【日常聊聊】程序员必备的面试技巧:如何在面试战场上脱颖而出-CSDN博客

【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁-CSDN博客

【JAVA】怎么确保一个集合不能被修改-CSDN博客

【Web开发】会话管理与无 Cookie 环境下的实现策略-CSDN博客

【Mybatis】Mybatis如何防止sql注入-CSDN博客

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓-CSDN博客

【Spring】理解IoC与AOP:构建灵活而模块化的软件架构-CSDN博客

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 10:54:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 10:54:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 10:54:05       58 阅读
  4. Python语言-面向对象

    2024-07-15 10:54:05       69 阅读

热门阅读

  1. SpringBoot,有哪些优点?

    2024-07-15 10:54:05       18 阅读
  2. Qt/QML学习-自定义CheckBox

    2024-07-15 10:54:05       26 阅读
  3. Django会话机制

    2024-07-15 10:54:05       21 阅读
  4. 计算机网络 TCP粘包问题

    2024-07-15 10:54:05       23 阅读
  5. 洛谷P8839~8841题解

    2024-07-15 10:54:05       19 阅读
  6. 机器学习-16-分布式梯度提升库XGBoost的应用

    2024-07-15 10:54:05       27 阅读
  7. hot100 | 九、图论

    2024-07-15 10:54:05       26 阅读
  8. day2 上下文Context

    2024-07-15 10:54:05       22 阅读
  9. 重学PyTorch,粗略笔记(一)

    2024-07-15 10:54:05       23 阅读
  10. 序列标注任务 - CRF条件随机场

    2024-07-15 10:54:05       18 阅读
  11. Python 字典(Dict)详解与实战应用

    2024-07-15 10:54:05       22 阅读
  12. 翁恺-C语言程序设计-07-3. 数素数

    2024-07-15 10:54:05       23 阅读