美文网首页
【读书笔记】AIDL的使用

【读书笔记】AIDL的使用

作者: 成1111 | 来源:发表于2019-03-03 16:38 被阅读0次

    AIDL的使用

    创建aidl

    image.png

    创建aidl文件后会自动在java同级目录下生成一个aidl文件夹,里边存放的就是aidl文件。
    注意:直接创建Book.java的同名Book.aidl文件时会报错,需要先随便写一个xx.aidl文件然后再修改为Book.aidl文件

    1. 一个实现Parcelable接口的 Book.java类
    package com.cheng.chapter_2;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Book implements Parcelable {
    
    
        public int bookId;
        public String name;
    
        public Book(int bookId, String name) {
            this.bookId = bookId;
            this.name = name;
        }
    
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(this.bookId);
            dest.writeString(this.name);
        }
    
        protected Book(Parcel in) {
            this.bookId = in.readInt();
            this.name = in.readString();
        }
    
        public static final Creator<Book> CREATOR = new Creator<Book>() {
            @Override
            public BookcreateFromParcel(Parcelsource) {
                return new Book(source);
            }
    
            @Override
            public Book[] newArray(int size) {
                return new Book[size];
            }
        };
    }
    
    
    

    两个aidl文件

    // Book.aidl
    package com.cheng.chapter_2;
    
    
    parcelable Book;
    
    
    
    // IBookManager.aidl
    package com.cheng.chapter_2;
    
    import com.cheng.chapter_2.Book;
    
    interface IBookManager{
         List<Book>  getBookList();
         
         //in表示输入型参数
         //out表示输出型参数
         //inout表示输入输出型参数
         void addBook(in Book book);
    }
    
    

    都创建完成后点击make project 后会自动在generatedJava文件夹下生成 IBookManager.java文件

    1. IBookManager.java解析

    DESCRIPTOR :是Binder的唯一标识,一般用当前的类名+包名表示
    如:


    image.png

    asInterface(android.os.IBinder obj): 用于将服务端的Binder对象转换成客户端所需的AIDL接口类型的对象,这个转换过程是区分进程的,如果客户端和服务端位于同一进程,那么此方法返回的就是服务端的Stub对象本身,否则的话返回的就是系统封装后的 Stub.proxy对象

    asBinder:返回当前对象本身

    onTransact:这个方法运行在服务端中Binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由此方法来处理

    Proxy.getBookList:运行在客户端,当客户端远程调用此方法
    Proxy.addBook:运行在客户端

    图片来源 Android Studio中如何创建AIDL - 技术丶从积累开始 - 博客园

    binder运行原理.jpg
    1. 客户端和服务端进行通信
      在创建一个module,包名和服务端一样,把服务端的aidl文件夹直接复制到客户端的main文件夹下,服务端的Book.java文件复制到客户端,然后点击make project,会在gen目录下生成IBookMainager.java文件

    在MainActivity中添加以下代码

    IBookManager mIBookManager;
    TextViewmTv;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv = findViewById(R.id.tv);
    
        Intent intent = new Intent();
        intent.setAction("com.cheng.chapter_2.BookService");
        intent.setPackage("com.cheng.chapter_2");
    
        bindService(intent, connection, BIND_AUTO_CREATE);
    }
    
    ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //通过asInterface方法获得  IBookManager实例
            mIBookManager = IBookManager.Stub.asInterface(service);
            if(mIBookManager != null) {
                try{
                    mIBookManager.addBook(new Book(1, "初识AIDL"));
    
    
                    mTv.setText(mIBookManager.getBookList().toString());
                } catch(RemoteException e) {
                    e.printStackTrace();
                }
            }
        }
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
    
        }
    };
    
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
    }
    
    

    之后先启动服务端,然后再运行客户端 即可成功调用服务端方法

    相关文章

      网友评论

          本文标题:【读书笔记】AIDL的使用

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