1.基于前面写的aidl使用,这段时间准备研究ActivityManager框架,对aidl进行了更深入的研究,因为android框架大量使用了进程通信机制,所以,在研究android framework前认真研究一下AIDL的实现机制十分有必要的
2.前面讲了aidl是 Android Interface definition language的缩写,它是一种进程通信接口的描述,通过sdk解释器对器进行编译,会把它编译成java代码在gen目录下,类路径与aidl文件的类路径相同。
3.aidl接口
package com.cao.android.demos.binder.aidl;
import com.cao.android.demos.binder.aidl.AIDLActivity;
interface AIDLService {
void registerTestCall(AIDLActivity cb);
void invokCallBack();
}
它编译后生成的java文件如下
AIDLService.java详细描述了aidl接口的实现,看上面图示,AIDLActivity.aidl编译成了一个接口AIDLActivity,一个存根类Stub,一个代理类Proxy
public interface AIDLService extends android.os.IInterface//与AIDLActivity.aidl中定义的接口对应的java接口实现
public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService
//继承android.os.Binder,在onTransact完成对通信数据的接收,通过不同通信参数code调用AIDLService接口方法,并回写调用返回结果AIDLService接口方法需要在
//服务端实现
private static class Proxy implements com.cao.android.demos.binder.aidl.AIDLService
//实现AIDLService接口方法,但是方法只是执行代理远程调用操作,具体方法操作在远端的Stub存根类中实现
总的来说,AIDLActivity.aidl编译会生成一个AIDLActivity接口,一个stub存根抽像类,一个proxy代理类,这个实现其实根axis的wsdl文件编译生成思路是一致的,
stub存根抽像类需要在服务端实现,proxy代理类被客户端使用,通过stub,proxy的封装,屏蔽了进程通信的细节,对使用者来说就只是一个AIDLActivity接口的调用
4.根据以上思路使用aidl再看一下AIDLService调用实现代码
--1.在服务端实现AIDLService.Stub抽象类,在服务端onBind方法中返回该实现类
--2.客户端绑定service时在ServiceConnection.onServiceConnected获取onBind返回的IBinder对象
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
Log("connect service");
mService = AIDLService.Stub.asInterface(service);
try {
mService.registerTestCall(mCallback);
} catch (RemoteException e) {
}
}
注意mConnection在bindservice作为调用参数:bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
--3.AIDLService.Stub.asInterface(service);
public static com.cao.android.demos.binder.aidl.AIDLService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
//如果bindService绑定的是同一进程的service,返回的是服务端Stub对象本省,那么在客户端是直接操作Stub对象,并不进行进程通信了
if (((iin!=null)&&(iin instanceof com.cao.android.demos.binder.aidl.AIDLService))) {
return ((com.cao.android.demos.binder.aidl.AIDLService)iin);
}
//bindService绑定的不是同一进程的service,返回的是代理对象,obj==android.os.BinderProxy对象,被包装成一个AIDLService.Stub.Proxy代理对象
//不过AIDLService.Stub.Proxy进程间通信通过android.os.BinderProxy实现
return new com.cao.android.demos.binder.aidl.AIDLService.Stub.Proxy(obj);
}
--4.调用AIDLService接口方法,如果是同一进程,AIDLService就是service的Stub对象,等同直接调用Stub对象实现的AIDLService接口方法
如果是一个proxy对象,那就是在进程间调用了,我们看一个客户端调用的例子:
public void onClick(View v) {
Log("AIDLTestActivity.btnCallBack");
try {
mService.invokCallBack();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
--mService.invokCallBack()等同调用Proxy.invokCallBack,这个时候是进程间调用,我们看代理方法的实现
public void invokCallBack() throws android.os.RemoteException
{
//构造一个Parcel对象,该对象可在进程间传输
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
//DESCRIPTOR = "com.cao.android.demos.binder.aidl.AIDLService",描述了调用哪个Stub对象
_data.writeInterfaceToken(DESCRIPTOR);
//Stub.TRANSACTION_invokCallBack标识调用Stub中哪个接口方法,mRemote在是构造Proxy对象的参数obj,也就是public void onServiceConnected(ComponentName className, IBinder service)
//中的service参数,它是一个BinderProxy对象,负责传输进程间数据。
mRemote.transact(Stub.TRANSACTION_invokCallBack, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
--5.BinderProxy.transact 该方法本地化实现
public native boolean transact(int code, Parcel data, Parcel reply,
int flags) throws RemoteException;
//对应实现的本地化代码 /frameworks/base/core/jni/android_util_Binder.cpp->static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj,
jint code, jobject dataObj,
jobject replyObj, jint flags)
//具体进程通信在c代码中如何实现,以后再深入研究。
--6.服务端进程数据接收
--调用堆栈
##AIDLService.Stub.onTransact
##AIDLService.Stub(Binder).execTransact
##NativeStart.run
--AIDLService.Stub.onTransact
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_registerTestCall:
{
data.enforceInterface(DESCRIPTOR);
com.cao.android.demos.binder.aidl.AIDLActivity _arg0;
_arg0 = com.cao.android.demos.binder.aidl.AIDLActivity.Stub.asInterface(data.readStrongBinder());
this.registerTestCall(_arg0);
reply.writeNoException();
return true;
}
//TRANSACTION_invokCallBack由前面客户端调用的时候transact方法参数决定,code==TRANSACTION_invokCallBack,执行
//invokCallBack方法,方法由继承Stud的服务端存根类实现。
case TRANSACTION_invokCallBack:
{
data.enforceInterface(DESCRIPTOR);
this.invokCallBack();
reply.writeNoException();
return true;
}
5.里面设置本地C代码的调用,我没有深入研究,随着后面我对android框架的深入,我会发blog进一步说民底层C代码是如何实现进程通信的,关于AIDL进程通信,暂时研究到这里。
分享到:
相关推荐
Android AIDL Binder 实现与详解。此资源实现了 Android AIDL 通信,自定义 AIDL 数据类型。同时演示了定向 Tag 『inout in out』的区别。并且配有博文详细解释相关知识点以及需要注意的细节。
**Android aidl Binder框架浅析** 在Android系统中,服务间的通信是通过Binder机制实现的,它是Android系统中进程间通信(IPC)的核心组件。Binder框架允许不同进程间的对象互相调用方法,使得数据和操作可以在不同...
Android远程接口之AIDL——Parcelable、in、out、inout简例 Parcelable in out inout AIDL例子中体现使用方式 详细介绍: http://blog.csdn.net/yangzhaomuma/article/details/50576017
在Android系统中,由于进程隔离的特性,不同进程之间的数据交换和方法调用需要特殊的机制来支持,AIDL正是为此而设计。通过AIDL,开发者能够定义跨进程通信的接口,让服务端进程(Server Process)和服务请求者...
本示例"安卓Android源码——AidlDemo"提供了一个简单的AIDL使用教程。 1. **AIDL简介** AIDL是Android系统提供的接口定义语言,它类似Java中的接口,但主要是为了解决Android进程间的通信问题。通过AIDL,服务端...
AIDL允许我们在不同Android进程之间定义接口,使得服务可以暴露方法给其他应用调用,实现跨进程通信。当一个应用需要与另一个应用的组件进行交互时,AIDL就变得尤为重要,因为它解决了Android中不同进程之间的数据...
Android Aidl(Android Interface Definition Language)是Android提供的一种强大的IPC机制,它允许两个不同进程之间的服务进行接口调用,实现了类似远程方法调用(RPC,Remote Procedure Call)的效果。下面将详细...
而Android Interface Definition Language(AIDL)是Google提供的一种用于处理进程间通信的语言,它允许应用程序之间透明地交换数据。当我们需要在不同的应用之间传递复杂的对象时,AIDL就显得尤为重要。本文将深入...
AIDL(Android Interface Definition Language)就是Android提供的一种机制,它使得不同进程间的对象能够相互调用方法,实现了跨进程的数据交换和功能调用。本文将详细介绍AIDL的工作原理、使用步骤以及相关知识点。...
下面我们将详细探讨AIDL在Android IPC中的应用和实现过程。 首先,AIDL是一种简单的接口描述语言,它的主要作用是定义接口,使得Android系统可以自动生成对应的Java绑定类,以便于两个不同进程间的对象调用对方的...
本篇文章将深入探讨如何在Android中使用AIDL来实现进程间通信。 首先,理解AIDL的基本概念。AIDL是一种接口定义语言,类似于Java中的接口,但它的目的是跨越进程边界。通过AIDL,我们可以定义一个接口,该接口会被...
当你在服务端定义了一个AIDL接口后,Android编译器会自动生成相应的Java代码,这些代码实现了进程间的通信协议。 **服务端实现** 1. **创建AIDL文件**: 在项目的`src/main/aidl`目录下,创建一个新的AIDL文件,...
通过"android AidlDemo(简单aidl的例子)"这个示例,开发者可以学习如何创建AIDL接口,实现服务端和客户端的交互,从而掌握Android中的进程间通信技术,提高应用的可扩展性和灵活性。实践中,开发者应根据实际需求...
在Android开发中,AIDL(Android Interface Definition Language)是一种用于实现进程间通信(IPC, Inter-Process Communication)的工具。本教程将详细讲解如何在Android Studio中创建并使用AIDL,以便不同进程间的...
"安卓Android源码——AidlDemo(简单aidl的例子)"这个标题指出,这是一份关于Android操作系统的源代码示例,重点在于Aidl(Android Interface Definition Language)技术的应用。Aidl是Android系统中用于进程间通信...
Android AIDL(Android Interface Definition Language)是Android系统中用于实现进程间通信(IPC,Inter-Process Communication)的一种机制。在Android应用开发中,当需要在不同进程之间共享数据或调用服务时,...
Android AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于实现不同应用程序进程间的通信(IPC,Inter-Process Communication)。AIDL允许我们定义服务和服务客户端之间交互...
AIDL 文件是用于定义服务端和客户端之间的接口,用于实现远程过程调用(RPC)。但是, 当服务端和客户端的 AIDL 文件不一致时,可能会引起调用出错的问题。 在 Android 应用程序中,AIDL 文件用于定义服务端和...
在Android系统中,AIDL(Android Interface Definition Language)是一种用于跨进程通信(IPC,Inter-Process Communication)的机制,使得应用程序的不同组件可以在不同的进程中相互通信。本篇文章将详细讲解如何...