一, AIDL 用来做什么?
进程之间的通讯
问题:有其他方式可以进行进程之间的通讯,为什么要用aidl
比如,两个进程之间,可以通过互相发送intent来实现通讯,但是具有局限性
问题:什么局限性
当有一个公共服务需要发布时,如何相互发送intent,一个服务需要应付各种各样的(n个)客户端时,随时有新的客户端来调用这个服务。 此时已经无能为力了!
解决:
把自己的服务当成一个接口公布出去!不管谁调用都不用管!双方按一定的规矩来办事就可以。
AIDL就是来做这事的!
做个例子看是最清晰了,我用了两工程,一个专门是service , 一个是调用的 activity:
二,服务端该如何动手?
好,一步一步来
1,aidl文件
这是个接口描述文件
ICommonService.aidl
package org.guoyu.service;
import org.guoyu.service.Data;
interface ICommonService{
boolean addStr(String str);
void addData(in Data data);
Data getData();
}
build一下工程,这可以使用eclipse,能生成ICommonService.java 文件
2,为这个公共接口做个实现。
RemoteService.java
public class RemoteService extends Service {
private static final String TAG = "RemoteService";
private Data data;
@Override
public IBinder onBind(Intent arg0) {
Log.i(TAG, "onBind");
return mBinder;
}
private ICommonService.Stub mBinder = new ICommonService.Stub() {
@Override
public boolean addStr(String str) throws RemoteException {
Log.i(TAG,"add String :"+ str);
return add(str);
}
@Override
public void addData(Data data) throws RemoteException {
Log.i(TAG,"add Data :"+ data);
setData(data);
}
@Override
public Data getData() throws RemoteException {
if(data == null)
data = new Data("Test" ,;
return data;
}
};
@SuppressWarnings("unused")
private boolean add(final String str){
if("ok".equals(str))
return true;
else
return false;
}
public void setData(Data data) {
this.data = data;
}
}
3,传输类的描述文件编写(上面有一个Data类,在进程之间是不能进行传输的,如果要传输的基本数据类型,String,CharSequence ,就无需3,4步骤,直接跳过)
Data.aidl
package org.guoyu.service;
parcelable Data;
4,传输类实体文件编写
Data.java
package org.guoyu.service;
import android.os.Parcel;
import android.os.Parcelable;
public class Data implements Parcelable {
//------
//1
public Data(Parcel source){
name = source.readString();
type = source.readInt();
}
//2
public static final Parcelable.Creator<Data> CREATOR = new Parcelable.Creator<Data>() {
@Override
public Data createFromParcel(Parcel source) {
return new Data(source);
}
@Override
public Data[] newArray(int size) {
return new Data[size];
}
};
//3
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(type);
}
//----------
private String name;
private int type;
public Data(){
}
public Data(String name ,int type){
this.name = name;
this.type = type;
}
...
}
5,service需要被远程调用,需要在xml文件中配置一下:然后给加上个action ,以便去调用
<service android:name=".RemoteService" android:process=":remote">
<intent-filter>
<action android:name="org.guoyu.service.RemoteService"></action>
</intent-filter>
</service>
=================服务器端算是完成了,那么客户端该做些什么呢?
客户端:
6,同样的,客户端也需要拥有这些aidl文件,然后还有Data对象,copy到客户端的工程下
7,首先是要获取一个远程对象的代理
在需要调用的类中,(我用的是activity)加入两个属性:
private ICommonService mRemoteSerivce;
private ServiceConnection mRemoteConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mRemoteSerivce = ICommonService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mRemoteSerivce = null;
}
};
8,让其连接对象能与我们相应的服务对得上号。本人是放在onCreate中
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
。。。。
bindService(new Intent("org.guoyu.service.RemoteService"),
mRemoteConnection ,
Context.BIND_AUTO_CREATE);
}
9,然后找个触发事件去调用即可
10,千万别忘了在activity退出的时候需要把连接给闭上噢
@Override
public void onDestroy(){
unbindService(mRemoteConnection);
super.onDestroy();
}
如有问题,请写在下面
代码我放在附件中了!eclipse project
分享到:
相关推荐
AidlDemo是一个典型的示例,它演示了如何在Android应用程序中有效地使用AIDL。这个压缩包包含了实现简单AIDL功能的全部源代码,帮助开发者理解这一技术。 首先,我们需要了解AIDL的基本概念。AIDL是一种接口定义...
**标题解析:** "AidlDemo(简单aidl的例子.zip" 这个标题表明这是一个关于Android应用程序开发的示例项目,特别关注了AIDL(Android Interface Definition Language)的使用。AIDL是Android系统中用于进程间通信...
本示例"Android-使用反射和aidl实现的电话拦截功能的demo"提供了一个利用反射和Android Interface Definition Language (AIDL)来拦截电话的解决方案。下面将详细介绍这个项目中的关键技术点。 1. **反射(Reflection...
AIDL是Android提供的一种编程工具,用于创建进程间通信接口。它允许开发者定义服务和客户端之间交互的数据类型和方法,使得跨进程调用成为可能。AIDL文件是文本文件,其语法类似于Java,但更简化,主要关注接口定义...
虽然现代的Android开发更倾向于使用Kotlin,但这个演示依然适用于Java开发者,因为AIDL与编程语言无关,无论是Java还是Kotlin,其使用方式基本相同。 总结来说,“android-aidl-demo”是一个学习和实践Android进程...
总结来说,AidlDemo提供了一个基础的AIDL使用示例,展示了如何在Android应用中实现进程间通信。通过学习和理解这个例子,开发者可以更好地理解如何设计和实现跨进程通信的服务,这对于开发大型、模块化的Android应用...
Android 接口定义语言 (AIDL) 类似于其他 IDL:它允许您定义客户端和服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。 在 Android 上,一个进程通常无法访问另一个进程的内存。为了实现语音交互,它们...
虽然在直接编程中Binder较为复杂,但许多Android组件如ContentProvider和AIDL(用于生成Binder接口)其实都是基于Binder的。 4. **AIDL(Android Interface Definition Language)**:AIDL是一种简化Binder使用的...
《Android开发实战经典课件笔记与Demo代码》是针对Android应用程序开发的一份宝贵资源,由知名讲师李兴华精心制作。这份资料集包含了详细的课件笔记和配套的Demo代码,旨在帮助学习者深入理解Android开发的核心概念...
这五个Demo覆盖了Android开发中的多个关键知识点,包括进程通信、系统服务、用户界面设计、网络编程和文件操作。通过深入研究和实践这些Demo,开发者不仅可以提升技能,还能更好地理解Android系统的运作机制。
通过对Android API Demo的深入学习和实践,开发者不仅可以掌握Android系统的各项功能,还能积累大量实战经验,提高编程技能。同时,这个资源也是初学者快速入门和高级开发者查找参考资料的宝贵财富。通过不断研究和...
本示例“Demo:使用java语言与c++语言通信”探讨的是如何让Java和C++这两种不同的编程语言之间进行有效的数据交换和功能调用。下面将详细阐述这个主题。 首先,Java和C++之间的通信主要依赖于Java的本地接口(Java ...
13. **Android组件间的通信**:BroadcastReceiver、ContentProvider、AIDL(Android Interface Definition Language)等可能被用来演示不同组件间如何进行通信。 14. **Gradle构建系统**:Android项目通常使用...
本篇将深入解析标题“IPC机制的demo”所涵盖的知识点,包括AIDL(Android Interface Definition Language)、Messenger、ContentProvider以及Socket,并结合压缩包内的“ipcTest”文件进行讲解。 1. AIDL(Android ...
Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 android开发环境之Logcat(日志)教程实例汇总 android网络通信之socket教程实例汇总 AsyncTask进度条加载网站数据到ListView 命令行开发、编译、打包...
在非root环境下,可以借助AIDL(Android Interface Definition Language)或者使用第三方库如Android-SerialPort-API来实现。同时,需要处理好线程同步,因为串口读写通常在后台线程进行,避免与UI线程冲突。 4. **...
总结来说,这个"Android进程间通信源码"项目展示了如何在Android中实现客户端-服务器通信,涉及到的关键技术包括Binder、AIDL、Service、网络编程和数据序列化。通过分析和理解这个Demo,开发者可以深入理解Android ...
8. **AidlDemo(简单aidl的例子)**:这个简单的AIDL示例有助于理解如何定义和实现跨进程的服务接口,是深入理解Android IPC机制的好起点。 9. **MyAppWeixin(仿微信界面)**:该项目模仿了微信的用户界面,提供了关于...
利用Google的feed屏方案,导入google官方定义了两个interface接口,ILauncherOverlay和ILauncherOverlayCallback通过aidl进程间通信,从Launcher向负一屏app传递scroll数据,负一屏使用WindowManager.addView的方式...