美文网首页
Binder概述与使用场景

Binder概述与使用场景

作者: AndroidHint | 来源:发表于2018-03-22 21:37 被阅读0次

    1、什么是Binder

    • 从Android代码的角度看,Binder是Android中的一个类,它实现了IBinder接口。
    • 从IPC的角度看,Binder是Android中的一种跨进程通信方式,Binder还是一种虚拟的物理设备,它的设备驱动是/dev/binder。
    • 从Android Framework的角度看,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager,等等,这些可看成是客户端)和相应的ManagerService(这可看成是服务端)的桥梁。
    • 从Android应用层的角度看,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或数据,这里的服务包括普通服务和基于AIDL的服务。

    2、Binder的使用过程

    从上面的Binder定义中可以知道,Binder是客户端和服务端进行通信的媒介。因此Binder的使用过程应该从客户端和服务端这两方面进行入手。

    • 客户端
      1、定义一个aidl文件,在里面我们定义一个接口,接口里面自定义了不同的方法,这些方法就是和服务端要进行的操作。
      如下编写了一个IBookManager.aidl文件,里面有一个接口,并且有两个方法:getBookList和addBook和服务端进行交互。
    package com.example.runningh.myapplication.aidl;
    
    import com.example.runningh.myapplication.aidl.Book;
    import com.example.runningh.myapplication.aidl.IOnNewBookArrivedListener;
    
    interface IBookManager {
    
        List<Book> getBookList();
    
        void addBook(in Book book);
    }
    

    由于接口中有使用到了自定义的Book类,所以必须有一个Book.java类,表示图书信息,它实现了Parcelable接口。
    如下所示:

    package com.example.runningh.myapplication.aidl;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Book implements Parcelable {
        public int bookId;
        public String bookName;
    
        public Book(int bookId, String bookName) {
            this.bookId = bookId;
            this.bookName = bookName;
        }
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(bookId);
            dest.writeString(bookName);
        }
    
        public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
    
            @Override
            public Book createFromParcel(Parcel source) {
                return new Book(source);
            }
    
            @Override
            public Book[] newArray(int size) {
                return new Book[size];
            }
        };
    
        private Book(Parcel in) {
            bookId = in.readInt();
            bookName = in.readString();
        }
    }
    

    同时,由于Book类在AIDL中使用了,所以必须要有一个同名的Book.aidl类,其作用是将Book类在AIDL中进行声明。

    package com.example.runningh.myapplication.aidl;
    
    parcelable Book;
    

    编译上述的代码,IDE自动给我们生成了IBookManager.java类,该类继承了IInterface这个接口,同时它也是个接口,所有可以在Binder中传输的接口都需要继承IInterface接口,它声明了两个方法getBookList和addBook,这两个方法是我们自定义的,同时还声明了两个整型的id分别用于标识这两个方法,这两个id用于标识在transact过程中客户端所请求的到底是哪个方法。接着,它声明了一个内部类Stub,Stub是一个Binder类,当客户端和服务端都位于同一个进程时,方法调用不会走跨进程的transact过程,而当两者位于不同进程时,方法调用需要走transact过程,这个逻辑由Stub的内部代理类Proxy来完成。

    3、Binder的工作场景

    在Android中,Binder主要运行在Service进程间的通信中。例如AIDL和Messenger都运用到了Binder。

    相关文章

      网友评论

          本文标题:Binder概述与使用场景

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