关于AIDL和Binder


AIDL是一种跨进程通信的方式,通信基于Binder。

直接继承Binder也可以实现跨进程通信。

Binder

Binder是一个类,它实现了IBinder接口,而IBinder接口定义了与远程对象的交互协议。通常在进行跨进程通信时,不需要实现IBinder接口,直接从Binder派生即可。

除了实现IBinder接口外,Binder中还提供了两个重要的接口。

  • transact(),客户端调用,用于发送调用请求
  • onTransact(),服务端响应,用于接收调用请求

因为以上的原因,Binder成为了客户端与服务端的通信媒介,其主要用在Service组件应用中。

AIDL

机制

AIDL的通信基于Binder。

下面写一个AIDL的demo讲解他的通信机制。

新建Book.aidl文件

package com.competition.pdking.ipcdemo;

parcelable Book;

然后创建一个IBookManager.aidl文件

// IBookManager.aidl
package com.competition.pdking.ipcdemo;

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

import com.competition.pdking.ipcdemo.Book;
interface IBookManager {
   

    List<Book> getBookList();
    void addBook(in Book book);
}

Android会生成一个java文件

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: C:\\Projects\\AndroidProjects\\AndroidDemoProject\\IPCDemo\\app\\src\\main
 * \\aidl\\com\\competition\\pdking\\ipcdemo\\IBookManager.aidl
 */
package com.competition.pdking.ipcdemo;

public interface IBookManager extends android.os.IInterface {
   
    /**
     * Local-side IPC implementation stub class.
     */
    public static abstract class Stub extends android.os.Binder implements com.competition.pdking.ipcdemo.IBookManager {
   
        private static final java.lang.String DESCRIPTOR = "com.competition.pdking.ipcdemo" +
                ".IBookManager";

        /**
         * Construct the stub at attach it to the interface.
         */
        public Stub() {
   
            this.attachInterface(this, DESCRIPTOR);
        }

        /**
         * Cast an IBinder object into an com.competition.pdking.ipcdemo.IBookManager interface,
         * generating a proxy if needed.
         */
        public static com.competition.pdking.ipcdemo.IBookManager asInterface(android.os.IBinder obj) {
   
            if ((obj == null)) {
   
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.competition.pdking.ipcdemo.IBookManager))) {
   
                return ((com.competition.pdking.ipcdemo.IBookManager) iin);
            }
            return new com.competition.pdking.ipcdemo.IBookManager.Stub.Proxy(obj);
        }

        @Override
        public android.os.IBinder asBinder() {
   
            return this;
        }

        @Override
        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply,
                                  int flags) throws android.os.RemoteException {
   
            java.lang.String descriptor = DESCRIPTOR;
            switch (code) {
   
                case INTERFACE_TRANSACTION: {
   
                    reply.writeString(descriptor);
                    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值