什么是AIDL
aidl的全称是Android Interface Definition Language,这是为了实现跨进程通信而在客户端和服务端编写的接口。
定义aidl文件
package com.geo.im.service;
import com.geo.bean.PersonalInfo;
import com.geo.bean.GRoomInfo;
interface CommunicationAIDL{
//登录
boolean startLogin();
//注册
boolean startRegister(String name,String paswd);
//添加朋友
boolean addFriend(String name,String nick);
//同意好友请求
boolean confirmFriendRequest(String username);
//删除朋友
boolean deleteFriend();
//添加分组
boolean addGroup();
//退出
boolean exit();
//清除登录状态
void clearLoginState();
//发送消息
boolean sendMessage(String user,String content);
//获取好友列表
List<PersonalInfo> getFriends();
//创建会议室
void createConferenceRoom(String roomName);
//加入会议室
void joinConferenceRoomChat(String username,String password,String roomname);
//查询会议室成员名称
void queryConferenceRoomUsers(String roomname);
//获取服务器上所有会议室
List<GRoomInfo> getConferenceRooms();
}
在Service中创建Binder类
private class CommnuicationServer extends CommunicationAIDL.Stub {
@Override
public boolean startLogin() throws RemoteException {
// 开始登录
mXppManager.startLoginTask();
return isLoginSucced;
}
@Override
public boolean startRegister(String name, String password)
throws RemoteException {
if (mXppManager.isConnected()) {
return mXppManager.getAccountGeoManager().register(name,
password);
}
// 注册
return false;
}
@Override
public boolean addFriend(String user, String nick)
throws RemoteException {
// 添加朋友
return mXppManager.getAccountGeoManager().addFriends(user, nick,
null);
}
@Override
public boolean deleteFriend() throws RemoteException {
// 删除朋友
return false;
}
@Override
public boolean addGroup() throws RemoteException {
// 添加分组
return false;
}
@Override
public boolean exit() throws RemoteException {
// 退出系统
return false;
}
...............................
}
在Service中创建那个CommunicationServer对象,并在onBinder()方法中返回。
创建ServerviceConnection对象并bindService
protected ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mServiceConnection = CommunicationAIDL.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName className) {
mServiceConnection = null;
}
};
注意mServiceConnection是一个CommunicationAIDL的实例,通过此实例就可以操作定义在aidl中的各种方法了,也就是在Service中由CommnuicationServer实现的方法,从而达到与Service通信的目的。绑定Service如下:
Intent intent = new Intent();
intent.putExtra("data", "Hello AIDL");
intent = new Intent();
intent.setClass(mContext, ConnectionService.class);
mContext.bindService(intent, mConnection, 1);
需要注意的是,aidl文件中只能传递基本类型、String类型的数据,如果要传递自己定义的实例对象数据,则需要实现Parcelable接口并且在aidl文件中声明,如下例子,一个PersonInfo类就实现了Parcelable接口:
public PersonalInfo(String ujid, String password, String username,
String extend, int online) {
this.ujid = ujid;
this.username = username;
this.password = password;
this.extend = extend;
this.online = online;
}
private PersonalInfo(Parcel in) {
this.ujid = in.readString();
this.username = in.readString();
this.password = in.readString();
this.extend = in.readString();
this.online = in.readInt();
}
public static final Parcelable.Creator<PersonalInfo> CREATOR = new Parcelable.Creator<PersonalInfo>() {
public PersonalInfo createFromParcel(Parcel in) {
return new PersonalInfo(in);
}
public PersonalInfo[] newArray(int size) {
return new PersonalInfo[size];
}
};
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(ujid);
out.writeString(username);
out.writeString(password);
out.writeString(extend);
out.writeInt(online);
}
主要就是通过writeToParcel写入,通过CREATOR读取数据,然后定义完实体类后需要新建一个和实体类同名的aidl文件,比如上述实体类叫做PersonalInfo.java,那么久需要在同包下建一个PersonalInfo.aidl文件,该文件内容如下:
package com.geo.bean;
parcelable PersonalInfo;
其实就是一个package和一个parcelable的申明,这样就可以了,然后我们去服务的aidl中就可以传递此PersonalInfo实体类了,正如我们上面的CommunicationAIDL文件中的List<PersonalInfo> getFriends(); 方法,需要先import com.geo.bean.PersonalInfo;进来,如此即可。