android aidl客户端与服务端,android – 如何使用AIDL远程服务来处理不同客户端的并发请求?...

这可以通过HandlerThread with Looper实现,无论是从100个应用程序收到的还是维护和服务所有请求.

为此,还需要添加AIDL回调接口,因为请求将通过这些回调提供.

服务器应用程序

IAidlService.aidl

interface IAidlService {

void getStockInfo(IAidlCallback callback);

}

IAidlCallback.aidl

oneway interface IAidlCallback {

void handleStockInfo(in Stock stockinfo);

}

Stock.aidl

parcelable Stock;

Stock.java

public class Stock implements Parcelable {

String stockName;

public String getStockName() {

return stockName;

}

public void setStockName(String stockName) {

this.stockName = stockName;

}

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(stockName);

}

public static final Creator CREATOR = new Parcelable.Creator() {

@Override

public Stock createFromParcel(Parcel in) {

return new Stock(in);

}

@Override

public Stock[] newArray(int size) {

return new Stock[size];

}

};

public Stock(Parcel in) {

this.stockName = in.readString();

}

public Stock() {}

}

AidlService.java

这是主要的Service类,它覆盖AIDL Service方法并实现它们.它还处理请求的返回,输出到请求它的特定应用程序.

public class AidlService extends Service {

private static final int MSG_STOCK_INFO = 53;

private ArrayList mRemoteCallbacks;

private ServiceHandler mHandler = null;

HandlerThread mHandlerThread = new HandlerThread("AidlServiceThread");

@Override

public void onCreate() {

super.onCreate();

mRemoteCallbacks = new ArrayList<>();

}

@Override

public IBinder onBind(Intent intent) {

// Handler Thread handling all call back methods

mHandlerThread.start();

mHandler = new ServiceHandler(mHandlerThread.getLooper());

return mBinder;

}

/**

* Stub implementation for Remote service

*/

IAidlService.Stub mBinder = new IAidlService.Stub() {

@Override

public void getStockInfo(IAidlCallback callback) throws RemoteException {

sendMsgToHandler(callback, MSG_STOCK_INFO);

}

};

/**

* Create handler message to be sent

*

* @param callback

* @param flag

*/

void sendMsgToHandler(IAidlCallback callback, int flag) {

mRemoteCallbacks.add(callback);

Message message = mHandler.obtainMessage();

message.arg1 = mRemoteCallbacks.size() - 1;

message.what = flag;

mHandler.sendMessage(message);

}

/**

* Handler class sending result in callback to respective

* application

*/

private class ServiceHandler extends Handler {

int callbackIndex = 0;

ServiceHandler(Looper looper) {

super(looper);

}

@Override

public void handleMessage(Message msg) {

callbackIndex = msg.arg1;

switch (msg.what) {

case MSG_STOCK_INFO:

Stock stock = new Stock();

stock.setStockName("Apple Inc");

try {

mRemoteCallbacks.get(callbackIndex).handleStockInfo(stock);

} catch (RemoteException e) {

e.printStackTrace();

}

break;

}

}

}

}

客户端应用程序

在任何客户端应用程序中创建一个ServiceConnection,一旦绑定到服务,您只需要为’IAidlCallback`创建Stub类,并发送对象以及getStockInfo调用.喜欢:

IAidlCallback.Stub callback = new IAidlCallback.Stub() {

@Override

public void handleStockInfo(Stock stockinfo) throws RemoteException {

// do what ever you want with stock info :)

}

};

希望能帮助到你 :)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值