AIDL使用(一)

IPC的含义是指进程间通信或者跨进程通信,是两个进程之间进行数据的交流,AIDL就是其中一种方式,趁着今天星期六有空闲时间,就学习了一下,顺便做一下笔记。
这分为服务端和客户端两部分,服务器端创建一个Service,接着在客户端绑定这个服务,从而实现通信交互。
根据官方给出的文档,我们需要以下三步:

  • 创建aidl文件
  • 实现这个接口
  • 把这个接口暴露给客户端

  • 创建aidl文件
    在自己的项目右击->New->Folder->AIDL File,在自己新建的AIDL文件里面,New一个AIDL,如下
package com.example.xing.aidldemo;

// Declare any non-default types here with import statements

interface IMyAIDL {
    //自己定义的一个方法
   int add(int num1,int num2);
}
  • 实现这个接口

    private IBinder iBinder = new IMyAIDL.Stub(){
        @Override
        public int add(int num1,int num2) throws RemoteException {
            Log.d("TAG","收到远程的请求");
            return num1+num2;
        }
    };
  • 把接口暴露给客户端
public class IRemoteService extends Service {

    /**
     * 绑定时会执行
     * @param intent
     * @return
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    private IBinder iBinder = new IMyAIDL.Stub(){
        @Override
        public int add(int num1, int num2) throws RemoteException {
            Log.d("TAG","收到远程的请求");
            return num1+num2;
        }
    };
}

在onBind中返回的iBinder,其实就是第二步中我们实现的接口,当客户端绑定service的时候,就返回iBinder,客户端通过这个iBinder就可以操作aidl接口了。
通过以上几步,AIDL的服务器就基本完成了。

现在到客户端的实现

  1. 创建跟服务器一样的aidl文件,包名和类名也保持一致

    这个是服务端:
    这里写图片描述

    这个是客户端:
    这里写图片描述

2.绑定服务器

private ServiceConnection conn = new ServiceConnection(){

        //绑定上服务的时候
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //拿到远程的服务
            iMyAidl = IMyAIDL.Stub.asInterface(iBinder);
        }

        //当服务断开的时候
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            //回收资源
            iMyAidl = null;
        }
    };

private void bindService() {
        //获取服务端
        Intent intent = new Intent();
        //新版本必须显式Intent启动绑定服务
        intent.setComponent(new ComponentName("com.example.xing.aidldemo","com.example.xing.aidldemo.IRemoteService"));

        bindService(intent,conn, Context.BIND_AUTO_CREATE);
    }

在onServiceConnected中,
IMyAIDL.Stub.asInterface(iBinder)返回的就是一个aidl接口,拿到这个接口之后,就可以调用接口里面定义的方法,例如我们之前定义的add(num1,num2).

最后注意

  • 在服务器端注册声明service的时候,要加上这两句:
    android:exported=”true”
    android:process=”:remote”,
    否则就呵呵了!
  • 在启动客户端之前,必须先启动服务端。
  • 这个是在网上视频学习之后写,其实就是理顺一下视频的内容而已,重述一次如何使用而已!

猜你喜欢

转载自blog.csdn.net/lihuanxing/article/details/51866103