游戏技术文章

Android 中基于 Binder的进程间通信

时间:2017-3-27 12:31:54  作者:棋牌资源网  来源:棋牌资源网  查看:7819  评论:0
内容摘要:    摘要:对  Binder 工作机制进行了分析。 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于Binder 进程间通信的过程分析 ...
    摘要:对  Binder 工作机制进行了分析。 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于Binder 进程间通信的过程分析 最后结合开发实例 (AIDL)了解 基于 Binder的进程间通信

 

 

1、Android 采用 Binder 作为 IPC (Internet Process Connection) 机制的优势

    Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道、信号和跟踪、插口、报文队列、共享内存和信号量。但是Linux 进程间通信方式存在着增加进程的开销、 进程过载和安全漏洞等方面的问题。在 Android 系统中,Binder IPC 进程间通信机制可以有效地解决这些问题

 

Binder的优势:

  ①高效率: Binder 传输只需要一次拷贝,而管道、消息队列、Socket都需要拷贝两次,对于移动设备,性能一直是个大问题;

  ②安全性高: Binder 机制对于通信双方的身份是内核进行校检支持的,socket 方式只需要知道地址都可以连接;

  ③易用性: B/S模式的通信,如果管道/消息队列还得进行包装,而Binder使用面向对象的方式设计,进行一次远程过程调用就像调用本地对象;

 

2、基于 Binder 进程间通信的过程分析

   Binder IPC 方式使得两个进程间的通信像是一个进程进入另外一个进程执行代码, 并带着运行结果返这类似于一个轻量级” 的远程调用过程 。

Binder 机制是通过 Server /Client 架构实现的,主要包括Server,Client,Service Manager以及Binder驱动。其中Server,Client,Service Manager运行于用户空间,驱动运行于内核空间。(如下图)

Android_中基于_Binder的进程间通信

 

 

 

3、结合开发实例 (AIDL)

 

 

3.1 案例需求假设

  一个应用的 Service 提供一本书名的信息的远程服务,作为服务端,另外一个应用中的 Activity 想获取 一本书名的信息。 Android的数据传递采用 Aidl 的方式。

 

3.2 案例分析
  Android 的不同应用不能共用数据, 因此如果有需要的话只能通过进程间通讯来完成应用共享数据。

进程间通讯(ipc)涉及到三个部分:客户端(调用方),传递数据,服务(被调用方)。其中服务端 Service 被同一个应用调用和不同应用调用原理是不同的。

因此分成以下两种:

①本地服务(Local Service):Service 被同一个应用中的 Activity 调用,用于实现应用程序自己的一些耗时任务。

②远程服务(Remote Sercie):可以被其他应用程序复用,比如 WiFi 服务,其他应用程序不需要再写这样的服务,调用已有的即可。

该案例选择本地服务即可。

 

3.3  AIDL案例实现原理

从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象。

通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据。(如下图)

Android_中基于_Binder的进程间通信

 

 

3.4 AIDL案例实现步骤

①创建一个BookInfo类 继承Service

②创建一个IBookInfo接口,写对应的AIDL文件的方法


 private String getNames(){
        Log.e("JianChengLoveBianCheng", "MyService.getName");
        return "《平凡的世界》";
    }

③在功能清单文件中注册服务

 <service android:name="com.example.aidl.BookInfo" >
            <intent-filter>
                <action android:name="com.JCLoveBiancheng.binder.action.AIDLService" />
            </intent-filter>
        </service>

④将AIDL 文件生成的类,在服务中绑定


复制代码
private final IBookInfo.Stub mBinder = new IBookInfo.Stub() {
        @Override
        public String getName() throws RemoteException {
            Log.e("JianChengLoveBianCheng", "MyService.AIDLService.getName");
            return getNames();
        }
    }; //找不到IBookInfo的话,rebuild project即可
复制代码

⑤绑定方式启动Service

复制代码
  private IBookInfo mService;//服务的代理类
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            Log.e("JCLoveBiancheng", "MainActivity.onServiceConnected");
            mService = IBookInfo.Stub.asInterface(service);
        }

        public void onServiceDisconnected(ComponentName className) {
            Log.e("JCLoveBiancheng", "MainActivity.onServiceDisconnected");
            mService = null;
        }
    };
复制代码

⑦开启服务

Intent intent = new Intent(MainActivity.this,BookInfo.class);
            intent.setAction("com.JCLoveBiancheng.binder.action.AIDLService");
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

⑧点击按钮即可从服务中获取信息(如下图)

Android_中基于_Binder的进程间通信

 

点击Bind服务打印出:Android_中基于_Binder的进程间通信

 

点击UnBind服务打印出:Android_中基于_Binder的进程间通信

 

点击获取信息打印出:Android_中基于_Binder的进程间通信

 

附加:

AIDL 支持的数据类型
    基本数据类型:int、long、char、boolean、double 、String 和 CharSequence
    List:
    只支持ArrayList,里面的每一个元素都必须能够被 AIDL 支持
    Map:
    只支持 HashMap,里面的每一个元素都必须能够被 AIDL 支持
    Parcelable:
    所有实现了 Parcelable 接口的对象
    AIDL:
    所有的 AIDL 接口本身也可以在 AIDL文件中使用。

标签:Android中基于Binder的进程间通信 

欢迎加入VIP,【VIP售价:只要288元永久VIP会员】畅享商业棋牌游戏程序下载,点击开通!

下载说明


☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,

☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!

☉唯一站长QQ:1004003180  [人格担保-本站注重诚信!]

☉购买建议E-mail:1004003180@qq.com   源码收购 E-mail:1004003180@qq.com    

☉本站文件解压密码  【文章内都自带解压密码,每个密码不同!】


本站提供的所有源码,均来源站长提供,仅学习交流 浙ICP备09009969号

由此产生不良后果和法律责任与本站无关,如果侵犯了您的版权,请来信告知 1004003180@qq.com 将及时更正和删除! 

Copyright © 2008-2021 棋牌资源网,你身边的棋牌资源下载站    All Rights Reserved