🍎个人博客:个人主页
🏆个人专栏:Android
⛳️ 功不唐捐,玉汝于成
目录
正文
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博客
【Web开发】会话管理与无 Cookie 环境下的实现策略-CSDN博客
【Mybatis】Mybatis如何防止sql注入-CSDN博客