在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.
AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
Android开发中实现跨进程通讯的具体步骤如下:
1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 如: ITaskBinder.adil
package com.cmcc.demo;
import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
boolean isTaskRunning();
void stopRunningTask();
void registerCallback(ITaskCallback cb);
void unregisterCallback(ITaskCallback cb);
}
其中: ITaskCallback在文件ITaskCallback.aidl中定义:
package com.cmcc.demo;
interface ITaskCallback {
void actionPerformed(int actionId);
}
注意: 理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数, 据说用Ant编译可以, 我没做尝试.
2、Android开发中编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.
3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.
ITaskBinder.aidl中接口的实现, 在MyService.java中接口以内嵌类的方式实现:
private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
public void stopRunningTask() {
//@TODO
}
public boolean isTaskRunning() {
//@TODO
return false;
}
public void registerCallback(ITaskCallback cb) {
if (cb != null) mCallbacks.register(cb);
}
public void unregisterCallback(ITaskCallback cb) {
if (cb != null) mCallbacks.unregister(cb);
}
};
在MyActivity.java中ITaskCallback.aidl接口实现:
private ITaskCallback mCallback = new ITaskCallback.Stub() {
public void actionPerformed(int id) {
//TODO
printf("callback id=" + id);
}
};
4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。这个地方返回的mBinder,就是上面通过内嵌了定义的那个. (MyService.java)
public IBinder onBind(Intent t) {
printf("service on bind");
return mBinder;
}
在Activity中, 可以通过Binder定义的接口, 来进行远程调用.
5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数在:MyService.java中:
void callback(int val) {
final int N = mCallbacks.beginBroadcast();
for (int i=0; i<N; i++) {
try {
mCallbacks.getBroadcastItem(i).actionPerformed(val);
} catch (RemoteException e) {
// The RemoteCallbackList will take care of removing
// the dead object for us.
}
}
mCallbacks.finishBroadcast();
}
分享到:
相关推荐
总结,Android多进程通讯AIDL传递Parcelable对象是一种强大的技术,可以实现复杂的跨进程数据交换。正确理解和使用AIDL能够帮助开发者构建健壮的、具有扩展性的Android应用。在实际开发中,应结合具体需求选择合适的...
### Android开发中实现跨进程通讯的关键知识点 #### 一、跨进程通讯背景及必要性 在Android系统中,为了确保应用程序的安全性和独立性,每个应用通常运行在其自己的进程中。这意味着不同进程之间的对象不能直接...
首先,创建一个继承自`Binder`的类,并实现AIDL接口中的所有方法。然后,在服务(`Service`)中,将这个`Binder`实例返回给`onBind()`方法。 ```java class DemoServiceImpl extends Binder implements ...
标题"Android多进程通讯AIDLDemo"指出我们将探讨如何使用AIDL来实现Android应用间的多进程通信。AIDL的基本思路是定义一个接口,该接口包含应用程序需要共享的方法。系统会自动生成与该接口对应的 Binder 类,使得在...
在Java代码中,Android会自动生成对应的Binder类,这个类实现了AIDL接口,并处理进程间的通信细节。你需要创建这个类的实现,将实际业务逻辑写入其中: ```java public class MyInterfaceImpl extends IMyInterface...
在Android系统中,进程间通信...总之,Android Aidl是实现不同进程间通信的重要手段,通过定义接口和服务,可以方便地实现跨进程调用,提升应用的功能性和交互性。理解和掌握Aidl对于开发复杂的Android应用至关重要。
在Android系统中,由于安全性和资源隔离的考虑,不同应用程序之间的内存是不能直接共享的,因此需要通过特定的方式来实现跨进程通信(IPC, Inter-Process Communication)。Android SDK提供了四种主要的IPC机制,...
总结来说,通过AIDL,我们可以方便地在Android应用中实现进程间的通信。AIDL服务端定义接口,生成相应的Binder类,服务端实现接口并返回Binder对象。客户端通过绑定服务获取Binder实例,然后就可以调用服务端的方法...
本篇文章将深入探讨如何使用AIDL来实现跨进程通信,主要分为以下几个部分: 1. **AIDL简介**: AIDL是Android特有的一种接口定义语言,它的作用类似于Java中的接口,但主要用于解决进程间通信的问题。通过AIDL,...
开发者通过定义AIDL接口,可以创建可以在不同进程中调用的方法。框架可能会提供自动生成AIDL相关的工具或类库,简化开发过程。 3. **ContentProvider**:ContentProvider是Android系统提供的一种通用的跨进程数据...
本示例源码是关于如何利用Android Interface Definition Language (AIDL)来实现跨进程通信,创建一个音乐播放器应用。AIDL是Android提供的一种接口定义工具,用于生成允许不同进程之间进行方法调用的代理类。 1. **...
通过"AIDLdemo"的实践,开发者可以深刻理解AIDL的工作原理,掌握如何在Android中实现高效、安全的跨进程通信。AIDL虽然相比其他通信方式(如BroadcastReceiver、ContentProvider、LocalBroadcastManager等)较为复杂...
AIDL(Android Interface Definition Language)是Android提供的一种机制,专门用于定义和实现跨进程的通信接口。本篇文章将深入探讨AIDL的工作原理、使用步骤以及其在手机进程间通讯中的作用。 **AIDL的基本概念**...
3. **服务端实现**:在服务端,你需要实现AIDL接口。在上面的例子中,创建一个`MyService`类,实现`IService`接口,并重写`sendMessage`方法。 ```java public class MyService extends Service implements IService...
在Android开发中,服务(Service)是应用程序组件之一,它可以在后台长时间运行,即使用户界面已经关闭。有时,我们可能需要在不同的应用之间或者在服务与应用之间进行数据交互,这时就需要一种机制来实现这种跨进程...
总的来说,AIDL在Android开发中扮演着重要的角色,它是实现跨进程通信的关键工具,让不同组件可以相互协作,提升了Android应用的灵活性和可扩展性。通过分析`AidlServer`和`AidlClient`的代码,开发者可以深入理解...
本文将深入探讨AIDL在Android进程间通讯中的应用。 ### 一、AIDL概述 AIDL是一种接口定义语言,它的主要任务是定义服务接口,使得服务端(服务器进程)和客户端(调用者进程)可以通过 Binder 机制进行进程间通信...
综上所述,"AIDL进程间通讯测试小程序"是一个用于验证和理解Android进程间通信的实例,通过AIDL接口定义,实现了客户端和服务端的通信。开发者可以通过调试这个小程序,深入了解AIDL的工作原理,提升Android IPC开发...
本文将深入探讨" Messenger-比AIDL简单的跨进程通讯"这一主题,详细介绍如何利用Messenger进行跨进程通信,并与AIDL进行对比。 **Messenger简介** Messenger是Android提供的一种轻量级的IPC解决方案,它基于Binder...
Service跨进程通讯是Android开发中的一个重要概念,当一个Service需要在不同的应用程序进程中运行,或者一个应用程序需要与另一个应用程序的Service进行交互时,就需要用到跨进程通讯。Android提供了多种跨进程通讯...