设计Server端很简单,从代码的角度来讲,只要基于Binder类新建一个Server类即可。以下以设计一个MusicPlayerService类为例。
假设该Service仅提供两个方法:start(String filePath)和stop(),那么该类的代码可以如下:
public class MusicPlayerService extends Binder {
@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
return super.onTransact(code, data, reply, flags);
}
public void start(String filePath) {
}
public void stop() {
}
}
当要启动该服务时,只需要初始化一个MusicPlayerService对象即可。比如可以在主Activity里面初始化一个MusicPlayerService,然后运行,此时可以在ddms中发现多了一个线程,如图所示。
如果不创建MusicPlayerService,则只有2个Binder对象对应的线程。
http://blog.csdn.net/manoel/article/details/39500351
定义了服务类后,接下来需要重载onTrasact()方法,并从data变量中读出客户端传递的参数,比如start()方法所需要的filePath变量。
然而,这里有个问题,服务端如何知道这个参数在data变量中的位置?因此,这就需要调用者和服务者双方有个约定。
这里假定客户端在传入的包裹data中放入的第一个数据就是filePath变量,那么,onTransact()的代码可以如下所示:
switch (code) {
case 1000:
data.enforceInterface("MusicPlayerService");
String filePath = data.readString();
start(filePath);
// replay.writeXXX();
break;
}
code变量用于标识客户端期望调用服务端的哪个函数,因此,双方需要约定一组int值,不同的值代表不同的服务端函数,该值和客户端的transact()函数中第一个参数code的值是一致的。这里假定1000是双方约定要调用start()函数的值。
enforceInterface()是为了某种校验,它与客户端的writeInterfaceToken()对应。
readString()用于从包裹中取出一个字符串。取出filePath变量后,就可以调用服务端的start()函数了。
如果该IPC调用的客户端期望返回一些结果,则可以在返回包裹reply中调用Parcel提供的相关函数写入相应的结果
分享到:
相关推荐
【Android内核剖析之Binder】 Binder是Android系统中核心的组件之一,它是实现Android进程间通信(IPC)的关键机制。它的名字来源于英文单词"别针",象征着它能够连接和协调不同进程间的通信,就像别针将多张纸张...
Binder通信协议定义了客户端和服务端之间交互的数据格式和流程。主要包括: - **Parcel:** 一种数据容器,用于序列化和反序列化对象。 - **Transaction:** 描述了一个请求-响应的过程,包括数据传输和处理逻辑。 -...
Binder引入了身份验证机制,每个进程都有唯一的UID/PID,数据包在传输时会附带发送方的UID/PID,接收方可以在内核级别验证,增强了安全性。此外,Binder支持实名和匿名通信,实名Binder提供明确的访问控制,而匿名...
3. Binder驱动:在内核层,负责管理Binder通信的底层实现,包括消息传递、线程调度等。 三、Binder通信流程 1. 创建服务:服务端通过AIDL(Android Interface Definition Language)定义接口,并实现接口类。 2. ...
Binder 的设计使得不同进程间的对象能够像在同一进程中那样进行通信,从而提供了高效且轻量级的远程过程调用(Remote Procedure Call, RPC)功能。本文将深入探讨 Android Binder 的工作原理及其内核中的实现细节。 ...
Binder是Android系统内核中的一个组件,它为应用程序提供了安全、高效的IPC方式。在Binder机制中,服务端(Server)运行在一个独立的进程中,而客户端(Client)则通过Binder接口与其通信。当客户端调用服务端的...
数据通过Parcel对象进行序列化和反序列化,服务端和客户端之间的方法调用则通过Binder接口的实现进行。 Binder通信协议允许跨进程的异步调用,支持回调和结果返回,使得远程调用如同本地调用一样简单。 **3. Binder...
Android Binder架构是Android系统中用于进程间通信(IPC)的一种机制,其设计目的是为了提供一种高效的、稳定的方式在不同的进程之间传输数据。Binder架构由一个轻量级的远程过程调用(RPC)机制实现,它将数据封装成...
Binder的设计和实现来源于OpenBinder项目,最初是由Be公司作为“下一代BeOS”开发的一部分。后来,PalmSource收购了Be公司,并在Palm Cobalt(一个基于微内核的操作系统)中首次实现了Binder。当Palm转向使用Linux...
5. Binder对象和引用:Binder对象是指服务端提供的具体服务,而Binder引用是指客户端对服务对象的引用。Binder对象可以是任意复杂度的对象,通过Binder引用,客户端可以远程调用服务端的方法。 Binder机制的通信...
3. **简洁性**:Binder的设计较为简单明了,易于理解和实现。 4. **统一性**:Binder机制不仅适用于C/C++环境,还适用于Java环境,使得整个Android平台的IPC机制更加统一和一致。 #### Binder机制的关键组成部分 -...
1. **Binder驱动**:内核空间中的Binder驱动负责处理来自用户空间的Binder操作,包括建立连接、发送和接收数据、处理事务等。 2. **ServiceManager**:在C++层,`ServiceManager`负责管理所有服务的注册和查找,...
Binder是Android系统内核中的一个组件,它充当了进程间通信的桥梁。与其他IPC方式相比,Binder具有高效、安全和可管理性等优点。在Android中,许多系统服务,如Activity Manager、Content Provider等,都是通过...
Binder驱动程序位于内核空间,负责进程间的通信。 6. **服务端接收**:服务端的Binder线程接收到Parcel数据后,反序列化并调用对应的服务端实现类的方法。这里的实现类通常由AIDL生成,继承自IBinder。 7. **执行...
3. Binder Driver:位于Linux内核层,负责Binder的调度和数据传输。 4. System Server:Android系统服务,负责管理所有的Binder连接和服务注册。 三、C++实现Binder 1. 创建Binder类:在C++中,我们需要继承自...
5. Binder驱动:位于内核层,负责管理Binder通信的管道,处理数据传输和线程调度。 三、Binder工作流程 1. Client通过AIDL(Android Interface Definition Language)定义接口,并生成Java代码。 2. Server实现接口...
尽管如此,Android系统依然引入了Binder作为其主要的IPC方式,这反映了Binder在设计上的一些独特优势。 在讨论Binder的设计细节前,我们需要明确Binder通信模型和协议。Binder通信模型基于Client-Server架构,也...
- **Binder驱动**:运行在内核空间,负责管理用户空间中的Binder实体,并处理它们之间的通信请求。 - **Binder代理**:每个Binder对象在其他进程中都有一个代理对象,用于代表远端的Binder实例。 #### 3. 示例解析 ...
设计服务端主要涉及创建继承自Binder类的自定义服务类,例如设计一个`MusicPlayerService`类,提供`start(String filePath)`和`stop()`两种服务。服务端需要重写`onTransact()`方法,解析客户端传入的`Parcel`数据,...