简单理解IPC机制和AIDL的使用

IPC机制:应用于android中的进程间通信


android中实现IPC机制的方法一共有以下几种:
1. AIDL
2. Messenger
3. ContentProvider
4. socket
其中前两者是基于Binder机制。第三个是基于AIDL, 那么, 首先我们来了解一下什么是Binder机制吧.

  • 什么是Binder机制?
    这绝对是个头疼的问题 , 因为涉及到Linux知识和C/C++, 我也很头疼, 但是这并不妨碍我们去使用它. 这里我引用老罗的一段话Android进程间通信(IPC)机制Binder简要介绍和学习计划, 从基本的层面去了解Binder:

    在Android系统的Binder机制中,由一系列系统组件组成,分别是ClientServerService ManagerBinder驱动程序,其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。Service Manager和Binder驱动已经在Android平台中实现好,开发者只要按照规范实现自己的Client和Server组件就可以了.

    Binder机制
    建议有时间一定要深入去学习了解Binder机制, Binder机制无论从系统开发还是应用开发的角度来看,都是Android系统中最重要的组成.

AIDL实现进程间的通信

先注明出处Android应用中通过AIDL机制实现进程间的通讯实例

在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在Android中,则采用AIDL(Android Interface Definition Language :接口定义语言)方式实现。

AIDL (Android Interface Definition Language)是一种IDL语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

AIDL IPC机制是面向接口的,它是使用代理类在客户端和实现端传递数据。

上面链接是使用AIDL实现IPC服务的基本步骤, 开发工具是Eclipse.

Android Studio实现AIDL小栗子

  • AIDL接口

    1. 首先,创建一个aidl文件, 文件后缀为.aidl , 它是一个接口, 这个接口里面定义了要对外提供的服务.
    2. 创建好后,Rebuild一下我们的项目,可以生成同名的java文件。这是一个接口,里面包含了一个名为Stub的静态抽象类,以及我们在aidl文件中定义的加减法函数。
      这里写图片描述
      AIDL接口的创建到这里就算完成了.
  • 服务端
    在service中,我们使用刚刚生成的IxxAIDL.Stub静态抽象类(系统在帮我们生成的时候继承了Binder并且实现了IxxAIDL,它在负责与客户端的Binder进行通信交互的同时,它也维护了service描述符与服务端service的映射) 创建了一个Binder对象(用于和客户端进行通信。),实现了接口中的方法,并在onBind方法中返回它。(别忘了注册哦)

  • 客户端
    调用AIDL服务首先要绑定服务,才能获得客户端的Binder对象(此Binder是用来与服务端进行通信), 但是绑定服务需要传入一个serviceConnection对象.

    • new一个ServiceConnection对象:

       private ServiceConnection mConnection=new ServiceConnection() {
          @Override
          public void onServiceConnected(ComponentName name, IBinder service) { //连接成功时调用
              Log.e(TAG,"connect");
              binded=true;
              mxxAIDL=IxxAIDL.Stub.asInterface(service); //获得客户端Binder对象
          }
      
          @Override
          public void onServiceDisconnected(ComponentName name) {
              Log.e(TAG,"disconnect");
              mxxAIDL=null;
              binded=false;
          }
      };
      
    • 值得注意的是:
      服务端onBind方法返回的Binder和客户端asInterface方法获得的Binder并不是同一个Binder对象.

**以上是AIDL的简单使用, 有任何问题欢迎留言交流指正.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIDL (Android Interface Definition Language) 是一种跨进程通信机制,它可以让不同进程间的组件进行通信。其中,callback 机制AIDL 的重要特性之一,它允许客户端向服务端注册回调,服务端可以在需要的时候调用客户端提供的回调方法。 下面是一个简单AIDL 回调机制的代码示例: 定义 AIDL 接口: ``` // IMyService.aidl interface IMyService { void registerCallback(IMyCallback cb); void unregisterCallback(IMyCallback cb); } interface IMyCallback { void onResult(int result); } ``` 服务端实现 AIDL 接口: ``` // MyService.java public class MyService extends Service { private List<IMyCallback> callbacks = new ArrayList<>(); private final IMyService.Stub binder = new IMyService.Stub() { @Override public void registerCallback(IMyCallback cb) throws RemoteException { callbacks.add(cb); } @Override public void unregisterCallback(IMyCallback cb) throws RemoteException { callbacks.remove(cb); } }; // 在需要的时候调用客户端提供的回调方法 private void notifyCallbacks(int result) { for (IMyCallback cb : callbacks) { cb.onResult(result); } } @Nullable @Override public IBinder onBind(Intent intent) { return binder; } } ``` 客户端调用 AIDL 接口并注册回调: ``` // MyActivity.java public class MyActivity extends Activity { private IMyService myService; private IMyCallback myCallback = new IMyCallback.Stub() { @Override public void onResult(int result) throws RemoteException { // 处理服务端传回来的结果 } }; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myService = IMyService.Stub.asInterface(service); try { myService.registerCallback(myCallback); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { myService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); // 绑定服务 Intent intent = new Intent(this, MyService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); // 解除回调注册 if (myService != null) { try { myService.unregisterCallback(myCallback); } catch (RemoteException e) { e.printStackTrace(); } } // 解绑服务 unbindService(connection); } } ``` 在客户端的代码中,我们首先绑定服务,并在连接成功后注册回调。当服务端需要通知客户端时,它会遍历回调列表并调用客户端提供的回调方法。在客户端的回调方法中,我们可以处理服务端传回来的结果。最后,在客户端销毁时,我们需要解除回调注册并解绑服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值