* 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 |