IPC机制

参考文章

Android Bander设计与实现 - 设计篇
http://blog.csdn.net/universus/article/details/6211589
Android面试题(二)——IPC机制
http://blog.csdn.net/a471893438/article/details/51878919
android跨进程通信(IPC):使用AIDL
http://blog.csdn.net/singwhatiwanna/article/details/17041691
《Android开发艺术探索》
Android进程间通信(IPC)机制Binder简要介绍和学习计划
http://blog.csdn.net/luoshengyang/article/details/6618363
Android aidl Binder框架浅析
http://blog.csdn.net/lmj623565791/article/details/38461079
关于Service的生命周期,以及ServiceConnection接口时注意的东东
http://www.iteye.com/topic/729291
深入理解Android的startservice和bindservice
http://www.cnblogs.com/yejiurui/p/3429451.html
绑定服务
https://developer.android.google.cn/guide/components/bound-services.html?hl=zh-cn#Basics

Android IPC常用方式对比

IPC常用方式对比

Binder工作机制

Binder工作机制

Binder 通信模型

Binder 通信模型

Binder的系统架构

Binder的系统架构

1,Client、Server和ServiceManager实现在用户空间中,Binder驱动程序实现在内核空间中
2,Binder驱动程序和ServiceManager在Android平台中已经实现,开发者只需要在用户空间实现自己的Client和Server
3,Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和ServiceManager通过open和ioctl文件操作函数与Binder驱动程序进行通信
4,Client和Server之间的进程间通信通过Binder驱动程序间接实现
5,ServiceManager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力

Binder原理

/**
直观来说,Binder是Android中的一个类,它实现了IBinder接口。

从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是 /dev/binder,该通信方式在Linux中没有;

从Android Framework 角度来说,Binder 是 ServiceManager 连接各种Manager (ActivityManager,WindowManager,等等)和相应 ManagerService 的桥梁;

从Android 应用层来说,Binder 是客户端和服务端进行通信的媒介,当 bindService 的时候,服务端会返回一个包含了服务端业务调用的 Binder 对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。

Android开发中,Binder主要用在Service中,包括AIDL和Messenger,其中普通Service中的Binder不涉及进程间通信,无法触及Binder核心,而Messenger的底层其实是AIDL,所以可以选择AIDL分析Binder的工作机制。
*/

绑定服务

绑定服务

创建绑定服务

创建绑定服务 创建提供绑定的服务时,您必须提供 IBinder,用以提供客户端用来与服务进行交互的编程接口。 您可以通过三种方法定义接口:

方式1,扩展 Binder 类
如果服务是供您的自有应用专用,并且在与客户端相同的进程中运行(常见情况),则应通过扩展 Binder 类并从
onBind() 返回它的一个实例来创建接口。客户端收到 Binder 后,可利用它直接访问 Binder 实现中乃至 Service
中可用的公共方法。 如果服务只是您的自有应用的后台工作线程,则优先采用这种方法。
不以这种方式创建接口的唯一原因是,您的服务被其他应用或不同的进程占用。

方式2,使用 Messenger
如需让接口跨不同的进程工作,则可使用 Messenger 为服务创建接口。服务可以这种方式定义对应于不同类型
Message 对象的 Handler。此 Handler 是 Messenger 的基础,后者随后可与客户端分享一个
IBinder,从而让客户端能利用 Message 对象向服务发送命令。此外,客户端还可定义自有 Messenger,以便服务回传消息。
这是执行进程间通信 (IPC) 的最简单方法,因为 Messenger
会在单一线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计。

方式3,使用 AIDL AIDL(Android
接口定义语言)执行所有将对象分解成原语的工作,操作系统可以识别这些原语并将它们编组到各进程中,以执行 IPC。 之前采用 Messenger
的方法实际上是以 AIDL 作为其底层结构。 如上所述,Messenger
会在单一线程中创建包含所有客户端请求的队列,以便服务一次接收一个请求。 不过,如果您想让服务同时处理多个请求,则可直接使用 AIDL。
在此情况下,您的服务必须具备多线程处理能力,并采用线程安全式设计。 如需直接使用 AIDL,您必须创建一个定义编程接口的 .aidl
文件。Android SDK 工具利用该文件生成一个实现接口并处理 IPC 的抽象类,您随后可在服务内对其进行扩展。

注:大多数应用“都不会”使用 AIDL 来创建绑定服务,因为它可能要求具备多线程处理能力,并可能导致实现的复杂性增加。因此,AIDL
并不适合大多数应用,本文也不会阐述如何将其用于您的服务。如果您确定自己需要直接使用 AIDL,请参阅 AIDL 文档。

允许绑定的已启动服务的生命周期

允许绑定的已启动服务的生命周期

总结

"IPC通信本质上是通过接口实现的。"

/** 实现IPC只需要如下三步

step1,定义一个‘拥有binder功能’的接口;
step2,Server实现接口,并将引用传给Android系统;
step3,Client获取的引用,调用Server函数。

接下来将使用aidl举例子详细说明下以上三点*/

step1,定义一个‘拥有binder功能’的接口

package com.ryg.chapter_2.aidl;
interface IBookManager {
     void addBook();
}
当我们写下这个aidl的时候,编译工具会自动在gen下面生成一个‘拥有binder功能’的接口(eclipse或ANDROID_STUDIO)
/** IBookManager extends android.os.IInterface ,继承了IInterface,也就表明IBookManager 实现了‘拥有binder功能’*/

interface IBookManager extends android.os.IInterface
{

/** IBookManagert提供了一个Stub。
1,这个Stub拥有android.os.Binder的功能(重写了android.os.Binder的asInterface,asBinder,onTransact函数)。
2,Stub也拥有IBookManager的功能(实现了IBookManager的addBook函数;Stub提供了一个内部类Proxy也叫代理类去实现IBookManager的addBook函数,看看Proxy这个类的头部声明
*/

    public static abstract class Stub 
    extends android.os.Binder 
    implements com.ryg.chapter_2.aidl.IBookManager
        {
        ...
            private static class Proxy 
            implements com.ryg.chapter_2.aidl.IBookManager
            {
                /**代理类去实现IBookManager*/
                public void addBook(){...}
            }

        /**Stub 重写android.os.Binder的asInterface,
        asBinder,onTransact函数*/
        @Override 
        public android.os.IBinder asBinder(){...}
        @Override 
        public boolean onTransact(...){...}         
        @Override 
        public boolean asInterface(...){...}

    }/**Stub 结束*/

    public void addBook();
}

step2,Server实现接口,并将引用传给Android系统;

'Server要提供Binder的实现类' 
'Server将实现类的引用mBinder 交给`Android`系统'
'Server将自己交给ServiceManager管理'
public class BookManagerService extends Service {
    /**提供Binder的实现*/
    private Binder mBinder = new IBookManager.Stub() {
            @Override
            public void addBook(Book book) 
            throws RemoteException {...}
    }


     @Override
     public IBinder onBind(Intent intent) {
         /**将‘Binder的实现’交给android系统,也就是Binder对象的
         实体的引用返回给了系统*/
         return mBinder;
     }
}

step3,Client获取的引用,调用Server函数。

private ServiceConnection 
mConnection = new ServiceConnection() {

            public void onServiceConnected(...) {
                /**获取Server端mBinder的引用*/
                IBookManager bookManager 
                = IBookManager.Stub.asInterface(service);

                /**调用Server端函数,实现IPC*/
                bookManager.add(...)
            }


            public void onServiceDisconnected(...) {
                ....
            }
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值