一, 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
分享到:
相关推荐
android AIDL 完整DEMO ,简单易懂
Android项目之AidlDemo(简单的aidl的例子)。AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写。需要的小伙伴自请下载。
Android-AIDL,demo,代码简洁易懂,希望对大家有帮助,博客地址https://blog.csdn.net/u010775335/article/details/105541176
Android Aidl 包括了服务端和客户端demo,通过Aidl 客户端可以调用服务器中的方法
android aidl的使用及demoandroid aidl的使用及demo
Android移动开发中AIDL使用示例,内置模拟服务器端和客户端。
Android AIDL demo (Android Studio)
aidldemo android aidl demo 入门 简介。Android 中AIDL的使用与理解 (一)
关于aidl的实例,清晰易懂,相信你一定能看懂的。
android关于AIDL的使用demo
简单的aidl入门学习demo,大家可以通过这个简单的aidl demo学习到怎么入门使用
android aidl源码实例
Android AIDL 服务端与客户端实现Demo
Android AIDL通信--实现机制精简分析,案例demo源码:对应博客地址是: http://blog.csdn.net/czlove110/article/details/50736720
Android service服务、aidl接口demo Android service服务、aidl接口demo
Android下Aidl的使用,详细请参见博客:http://www.cnblogs.com/plokmju/p/android_Service_aidl_NormalType.html 和 http://www.cnblogs.com/plokmju/p/android_Service_aidl_CustomType.html
Android AIDL的使用 在Activity和Sevice之间跨进程通信获取自定义对象数据类型 http://blog.csdn.net/gdliweibing/article/details/68483406
Android AIDL Demo源码.包含Client端和Server端,Client调用aidl服务进行加法运算
压缩中有两个项目,一为客户端一为服务端,均为Android Studio项目,且均用git管理。...simple分支对应博客:Android:学习AIDL,这一篇文章就够了(上) 两篇博客均在:http://blog.csdn.net/luoyanglizi 处可找到。
安卓Android源码——AidlDemo(简单aidl的例子).7z