美文网首页
Binder 机制研究,demo + 解析

Binder 机制研究,demo + 解析

作者: 瀚海网虫 | 来源:发表于2020-03-18 08:27 被阅读0次

    github demo 地址:
    https://github.com/jjbheda/aidl_demo

    1. 基本定义

    1.1 IPC

    IPC (Inter Process Communication,进程间通信。指至少两个进程或线程间传送数据或信号的一些技术或方法。

    1.2 AIDL

    AIDL (Android Interface Definition Language)Android 接口定义语言。与您可能使用过的其他接口语言 (IDL) 类似。
    您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。
    在 Android 中,一个进程通常无法访问另一个进程的内存。进程通信操作的代码较为繁琐,因此 Android 使用 AIDL 简化处理该问题。

    2. 不同IPC 比较

    image.png

    3. 基本原理

    image.png image.png image.png

    4 大体流程

    image.png
    • 总体
      Client 端,主要通过 Proxy ,调用接口。
      Service端,Stub 接收后,主要通过自身的接口实现(通常是自己实现的Service),来处理客户端的接口请求。 然后通过binder机制返回数据给客户端。

    • 服务端
      主要是生成Binder 并发送给客户端,内部调用asBinder()

    public class PwdService extends Service {
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
        private IBinder binder = new IPwdInterface.Stub() {
            @Override
            public boolean verifyPwd(User user) throws RemoteException {
               if (user == null || user.name == null
                       || user.pwd == null) {
                   return false;
               }
               if (user.name.equals( "abc") && user.pwd.equals("123")) {
                   return true;
               }
                return false;
            }
        };
    }
    
    • 客户端
      拿到服务端的Binder(调用bindService),并转换成自身可以使用的接口,直接使用,调用asInterface()
     private ServiceConnection serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.w(TAG, "onServiceConnected: success ");
                pwdInterface = IPwdInterface.Stub.asInterface(service);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.w(TAG, "onServiceDisConnected! ");
                unbindService(serviceConnection);
            }
        };
    
     if (pwdInterface != null) {
                    try {
                        boolean verify = pwdInterface.verifyPwd(new User(name, pwd));
                        if (verify) {
                            Toast.makeText(this, "验证成功!!!", Toast.LENGTH_LONG).show();
                        } else {
                            Toast.makeText(this, "验证失败!!!", Toast.LENGTH_LONG).show();
                        }
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
    

    5. 存在意义

    1. Android四大组件通信方式。
    2. Binder 从整体上来说是一种 IPC 机制,Android 是Binder 消息驱动。

    相关文章

      网友评论

          本文标题:Binder 机制研究,demo + 解析

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