AIDL的使用

什麼是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;進來,如此即可。

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章