2012-12-19 3 views
3

원격 서비스를 정의하고 타사 개발자를위한 AIDL 인터페이스를 제공하는 플러그인을 작성하고 있습니다.AIDL 원격 서비스를 사용하여 다른 클라이언트의 동시 요청을 처리 할 수 ​​있습니까?

이 원격 서비스를 사용하여 특정 클라이언트의 동시 요청을 처리하는 방법은 무엇입니까?

서비스 apk의 활동은 각 클라이언트의 상태를 서로 바꿀 때 어떻게 유지할 수 있습니까?

감사합니다.

답변

0

멀티 스레드 서버 작성과 크게 다르지 않습니다. 각 클라이언트에 대한 스레드 로컬 상태를 유지하고 세션 ID의 일종을 제공하여 대화 상대를 알 수 있습니다.

2

이것은 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 :) 
    } 
}; 

은 내가 비슷한 달성하기 위해 노력하지만 조금 혼란 스러워요 :)

+0

도움이되기를 바랍니다. Stock.java & Stock.aidl을 넣을 위치는 어디입니까? 나는 모든 aidids가 안드로이드 스튜디오의 "main> aidl> 패키지 디렉토리에 있어야한다고 생각한다. 올바른가요? Stock.aidl은 Parcelable이지만 min은 Enum입니다. 차이가 있습니까? –

+1

@ sam_0829 - https : /에서 내 프로젝트를 참조하십시오. /github.com/harneev/ATC ...당신은 sdk 모듈 아래 aidl과 해당 자바 파일의 배치를 찾을 수 있습니다. – harneev

관련 문제