원격 서비스를 정의하고 타사 개발자를위한 AIDL 인터페이스를 제공하는 플러그인을 작성하고 있습니다.AIDL 원격 서비스를 사용하여 다른 클라이언트의 동시 요청을 처리 할 수 있습니까?
이 원격 서비스를 사용하여 특정 클라이언트의 동시 요청을 처리하는 방법은 무엇입니까?
서비스 apk의 활동은 각 클라이언트의 상태를 서로 바꿀 때 어떻게 유지할 수 있습니까?
감사합니다.
원격 서비스를 정의하고 타사 개발자를위한 AIDL 인터페이스를 제공하는 플러그인을 작성하고 있습니다.AIDL 원격 서비스를 사용하여 다른 클라이언트의 동시 요청을 처리 할 수 있습니까?
이 원격 서비스를 사용하여 특정 클라이언트의 동시 요청을 처리하는 방법은 무엇입니까?
서비스 apk의 활동은 각 클라이언트의 상태를 서로 바꿀 때 어떻게 유지할 수 있습니까?
감사합니다.
멀티 스레드 서버 작성과 크게 다르지 않습니다. 각 클라이언트에 대한 스레드 로컬 상태를 유지하고 세션 ID의 일종을 제공하여 대화 상대를 알 수 있습니다.
이것은 100 개의 응용 프로그램에서받은 모든 요청을 유지 관리하고 서비스하는 Looper와 함께 HandlerThread를 사용하여 수행 할 수 있습니다.
이러한 콜백을 통해 요청이 제공되므로 AIDL 콜백 인터페이스도 추가해야합니다.
APP 서버
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<Stock> CREATOR = new Parcelable.Creator<Stock>() {
@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
이것은 AIDL 서비스 방법을 무시하고이를 구현하는 주요 서비스 클래스입니다. 또한 출력을 요구하는 요청을 특정 응용 프로그램에 요청하여 처리했습니다.
public class AidlService extends Service {
private static final int MSG_STOCK_INFO = 53;
private ArrayList<IAidlCallback> 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` '에 대한 스텁 클래스를 만들고 getStockInfo가 호출과 함께 개체를 보낼 필요가 서비스를 바인더 제본. 마찬가지로 :
IAidlCallback.Stub callback = new IAidlCallback.Stub() {
@Override
public void handleStockInfo(Stock stockinfo) throws RemoteException {
// do what ever you want with stock info :)
}
};
은 내가 비슷한 달성하기 위해 노력하지만 조금 혼란 스러워요 :)
도움이되기를 바랍니다. Stock.java & Stock.aidl을 넣을 위치는 어디입니까? 나는 모든 aidids가 안드로이드 스튜디오의 "main> aidl> 패키지 디렉토리에 있어야한다고 생각한다. 올바른가요? Stock.aidl은 Parcelable이지만 min은 Enum입니다. 차이가 있습니까? –
@ sam_0829 - https : /에서 내 프로젝트를 참조하십시오. /github.com/harneev/ATC ...당신은 sdk 모듈 아래 aidl과 해당 자바 파일의 배치를 찾을 수 있습니다. – harneev