android进程间通信:aidl使用及原理

android中,应用与应用、应用内不同进程之间需要做数据传递时,就需要用到进程间通信,常用的进程间通信有7种,而使用最多的便是aidl,aidl是基于binder来实现的。

传统IPC对比

名称 性能 特点 安全性
Binder 需要拷贝一次 基于C/S架构,易用性高 为每个App分配UID,同时支持实名和匿名
共享内存 无需拷贝 控制复杂,易用性差 依赖上层协议,访问接入点是开放的不安全的
Socket 需要拷贝两次 基于C/S架构,作为一款通用接口,其传输效率低开销大 依赖上层协议,访问接入点是开放的不安全的

aidl使用

1. 定义一个AIDL文件

类似于定义接口类型,这个AIDL文件将在本地和远端都要使用到

interface IMyAidlInterface {
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
    int sendData(String data);
    String getData();
}

2. 定义远程服务

在远程服务中的onBind方法,实现AIDL接口的具体方法,并且返回Binder对象

public class ServerService extends Service {
    private static final String TAG = "Zero";
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "onBind: " + intent);
        return new MyBinder();
    }

    static class MyBinder extends IMyAidlInterface.Stub{

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
        }

        @Override
        public int sendData(String data) throws RemoteException {
            Log.i(TAG, "sendData: "+ data);
            return 10;
        }

        @Override
        public String getData() throws RemoteException {
            Log.i(TAG, "getData: ");
            return "hello my aidl";
        }
    }
}

3. 本地创建连接对象

本地创建一个服务连接对象,实现ServiceConnection接口,在连接成功之后,会得到一个远端传递过来的Binder对象,就是上面的远端服务onBind方法返回的,得到Binder对象之后在进行转化就可以得到AIDL对象,然后即可调用方法

 private ServiceConnection mConn = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myAidlInterface = null;
        }
    };

4. 连接服务

Intent intent = new Intent(ACTION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        bindService(createExplicitFromImplicitIntent(MainActivity.this,intent), mConn, BIND_AUTO_CREATE);

binder数据传输模型

android进程间通信:aidl使用及原理_第1张图片

aidl通信过程

android进程间通信:aidl使用及原理_第2张图片

aidl方法调用流程图

android进程间通信:aidl使用及原理_第3张图片

binder原理

在了解原理之前,我们可能会有疑问,binder是什么?binder是一种虚拟的物理设备驱动,可以实现跨进程通信(IPC)。为了了解binder,我们先来看下面一张神图
android进程间通信:aidl使用及原理_第4张图片
上面这张神图,可能比较复杂,我们理解原理只需要关心以后几点就好了

  1. Server向Binder注册服务;
  2. Client从Binder获取服务;
  3. 获取到服务之后,可以直接使用了;
    神图看不懂的话,我们就看下面这张简图好了,不影响理解android进程间通信:aidl使用及原理_第5张图片

模型组成角色说明

android进程间通信:aidl使用及原理_第6张图片

模型原理步骤说明

android进程间通信:aidl使用及原理_第7张图片

你可能感兴趣的:(android,源码,framework)