* Binder Framework

> 이를 이용해 Intent, Service Content Provider 는 IPC 기반으로 동작한다



* Android RPC


> Transaction

- 함수와 데이터 모두를 전송하는 원격 프로시저 호출


> Binder 를 통한 IPC



> Client Thread 는 onTransact() 가 완료될 때까지 차단된다

> Parcel 데이터로 전송되는데 이는 Serializable 보다 효율적이다

> Marshalling (Method Data 분해) & Unmarshalling (원격 Process 에 정보를 재구성) 을 지원



* AIDL (Android Interface Definition Language)


> 서버는 클라이언트가 호출할 수 있는 메소드 인터페이스를 .aidl 파일에 정의한다

- 컴파일 하면 IPC 를 지원하는 자바코드를 생성되고, 이는 서버와 클라이언트 App에 포함된다

- .aidl 파일은 Marshalling & Unmarshalling 그리고 Transaction까지 다루는 Proxy 와 Stub 2개의 내부 클래스를 정의한다




> 동기식 RPC

- 장점

: 단순하기 때문에 이해하고 구현하기 쉽다

- 단점

: Client 의 Call 이 많고 Job 시간이 오래 걸리는 경우, Binder Thread Pool 은 한계에 이르게 될 것이고 Binder Thread 를 할당받지 

못한 Thread 는 Binder Queue 에 들어가서 대기 상태가 될 것이다

: Client 의 Call 이 많고 차단하는 Job 이 있는 경우, 마찬가지로 Pool 이 한계에 이르고, Binder Thread 를 깨우지 못하게 될 것이다

따라서, Server 내부의 다른 Thread 를 통해 Binder Thread 를 깨우는 것이 필요하다


> 비동기식 RPC

- 동기식 RPC 의 issue 해결을 위해, 비동기를 이용한다

- 비동기 메소드는 반드시 void 를 반환 해야하며, 결과값이 필요하면 callback을 구현해야 한다


- 비동기 인터페이스

: 두 메서드 모두 비동기적으로 실행 된다


oneway interface IAsynchronizedInterface {

void method1();

void method2();

}


- 비동기 메소드

: 특정 메서드 (method1) 만 비동기적으로 실행된다


interface IAsynchronousInterface {

oneway void method1();

void method2();

}



* Binder 를 통한 Message 전달

> Message 를 Binder Framework 이용해 전달하면, Process 간 통신이 가능하다



> 예제) Activity ↔ Service

- Service

: Work Thread (Handler)

: Work Messenger


public void onBind() {

return messenger.getBinder();

}


private class WorkerThread extend Thread {


private Handler mWorkerHandler;


public void run() {

Looper.prepare();


mWorkerHandler = new Handler() {


public void handleMessage(Message msg) {

//twoWay

msg.replyTo.send(replyMsg);

}

}


Looper.loop();

}

};


- Activity


Messenger mRemoteSevcie ;


public void bind() {

Intent intent = new Intent();

bindService(intent, connection, Context.Bind_Auto_Create);

}


public void sendMsg() {

// twoWay

msg.replyTo = new Messenger(new Handler() {

@Override

public void handleMessage(Message msg) {

}

});


mRemoteService.send(msg);

}


ServiceConnection connection = new ServiceConnection() {


public void onServiceConnected(IBinder service) {

mRemoteService = new Messenger(service);

}


public void onServiceDisconnected() {

}

} ;


1) Activity → (Intent) → Service

: Binding  요청


2) Service → Activity

: onServiceConnected();


3-1) Activity → Service (One way)

: mRemoteSevcie .send(msg);


3-2) Activity → Service (Two way)

: msg.replyTo()

: mRemoteService.send(msg);


Service → Activity

: msg.replyTo.send(replyMsg); //activity 의 handler 에 전달됨



'SW > Android' 카테고리의 다른 글

//View  (0) 2020.06.20
//RecyclerView  (0) 2020.05.23
AsyncQueryHandler 와 Loader  (0) 2019.09.08
Asynchronization Task  (0) 2019.09.08
Thread, Looper And Handler  (0) 2019.09.07

+ Recent posts