美文网首页
Android AIDL通信开发及遇到的问题

Android AIDL通信开发及遇到的问题

作者: 孙科技 | 来源:发表于2018-11-13 17:29 被阅读7次

    AIDL 是什么

    AIDL(Android 接口定义语言) 是 Android 提供的一种进程间通信 (IPC) 机制。

    我们可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。

    在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。

    AIDL 支持的数据类型

    1. Java 的基本数据类型
    2. List 和 Map
      1. 元素必须是 AIDL 支持的数据类型
      2. Server 端具体的类里则必须是 ArrayList 或者 HashMap
    3. 其他 AIDL 生成的接口
    4. 实现 Parcelable 的实体

    AIDL 如何编写

    1. 创建 AIDL
    2. 创建要操作的实体类,实现 Parcelable 接口,以便序列化/反序列化
    3. 新建 aidl 文件夹,在其中创建接口 aidl 文件以及实体类的映射 aidl 文件
    4. Make project ,生成 Binder 的 Java 文件
    5. 服务端
    6. 创建 Service,在其中创建上面生成的 Binder 对象实例,实现接口定义的方法
    7. 在 onBind() 中返回
    8. 客户端
    9. 实现 ServiceConnection 接口,在其中拿到 AIDL 类
    10. bindService()
    11. 调用 AIDL 类中定义好的操作请求

    根据以上创建一个简单的aidl跨进程demo

    1、 创建接口 aidl 文件以及实体类的映射 aidl 文件(客户端和服务端须各一个AIDL接口文件所在的包必须相同)

    IPerson.aidl(测试参考)

      `interface IPerson {
    
        void setValue(String name);
    
        String getValue();
    
        }`
    

    2、 服务端创建一个service(必须一个Service类的配合)

    MyService.java(测试参考)

    public class MyService extends Service {
    
    private IPerson.Stub iPerson = new Person();
    
    @Override
    public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return iPerson;
    }
    }
    

    manifest.java(测试参考)

    <service android:name=".MyService"
    android:exported="true">
    <intent-filter>
    <action android:name="application.test.com.myapplication1.MyService" />
    </intent-filter>
    </service>
    

    3、 要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService()

    private ServiceConnection conn = new ServiceConnection() {
    //连接对象
    @Override
    public void onServiceDisconnected(ComponentName name) {
    // TODO Auto-generated method stub
    }
    
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    // TODO Auto-generated method stub
    iPerson = IPerson.Stub.asInterface(service);
    if (iPerson != null) {
    try {
    iPerson.setValue("AIDL TEST");
    } catch (RemoteException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    };
    
      /*绑定*/
    Intent intent = new Intent(MyActivity.this, MyService.class);
    bindService(intent, conn, Service.BIND_AUTO_CREATE);
    

    最近在研究Android通信,感觉aidl很有意思,拿来研究一下分享遇到的问题

    1、实现AIDL远程服务调用,建立C/S端通信,建立两个demo,运行连接报如下错误,一脸方!!!

    java.lang.SecurityException: Binder invocation to an incorrect interface这个错误

    解决办法

    image.png image.png

    aidl 必须相同,相同是指不同项目下相同包名下aidl进行通信

    相关文章

      网友评论

          本文标题:Android AIDL通信开发及遇到的问题

          本文链接:https://www.haomeiwen.com/subject/kyicfqtx.html