본문으로 바로가기

Android Service간 통신 #2

category 개발이야기/Android 2017. 10. 11. 01:00
반응형

IPC / Binder

Inter Process Communication의 약자로 process간 통신하는것을 말한다. 리눅스 커널에서 Binder을 이용하여 프로세스간 메시지를 주고 받으며, 안드로이드에서는 다른 프로세스의 함수를 호출 (RPC)하는 방법 또한 제공한다.

따라서 안드로이드에서는 독립된 process의 메모리 공간이 아닌 kernel의 공유된 공간을 이용하여 함수를 호출하며 이를 Binder Driver가 수행한다.


Parcel / Parcelable

Binder는 parcel 형태로 데이터를 전달 하므로, 개발자가 다른 process로 데이터를 전달하기 위해서는 전달하고자 하는 클래스에 parcelable을 implements 하여야 한다.

기존 리눅스 바인더는 primitive type만 전달 가능하나 android 에서는 parcelable을 이용하여 primitive / primitive array / parcelabel class 전달이 가능하다.
단 object의 경우 전부 다 지원하는것이 아니라 String 같이 parcelable을 구현한 객체만 전달 가능하다.


예제

1. 생성시 (마샬링)

public int describeContents() //구현 -> 보통 return 0;
public void wirteToParcel(Parcel dest, int flag) //구현 -> 정보 쓰는 순서 확인 필요

2. 복원시 (언마샬링)
public static final Parcelable.Creator<T> CREATOR = new Parceable.Creator<>() { ...}
T: 복원할 parcelable 객체

public static final Parcelable.Creator<T> CREATOR = new Parceable.Creator<>() {
    public T createFromParcel(Parcel soruce) {...}
    public T[] newArray(int size) {...}
}


좀더 자세한 전달 로직은 아래 링크를 참조하기 바란다.

참고: http://egloos.zum.com/windom/v/1865390


ServiceBind

android에서는 IPC또는 parcelable 객체를 intent로 object 전달시나, Service bind시 사용한다.
간단하게 Bind Service를 구성하는 방법은 아래와 같다.

1. .aidl 파일을 만든다.
    -> aidl 파일을 생성하여 interface가 생성되면, RPC로 사용할 함수를 정의한다.

aidl에서 지원하는 데이터 타입
 - Java primitive (boolean, byte, int...)
  - String
  - CharSequence
  - List - ArrayList
  - Map - HashMap
  - 다른 AIDL interface
  - Parcelable object - Parcelable을 구현한 obejct


2. complie(make)를 하면 .aidl파일이 자동으로 compile되면서 마샬링과 언마샬링을 위한 추가파
일들이 자동으로 생성된다.
3. service class에 생성된 interface의 stub 파일을 구현한다. -> RPC 함수를 override 하여 구현


4. service의 onbind() 함수 호출시 생성된 stub 파일을 return하도록 한다.(IBinder를 return)


5. client에서 service connection을 위한 ServiceConnection 객체를 생성한다.

    onServiceConnected() 을 override하여 함수에서는 생성된 interface를 binding 하도록 구현한다.
    onServiceDisconnected()도 override 한다.


6. client에서 bindService를 이용하여 service를 binding 한다.
7. client에서 bind된 service를 이용하여, RPC를 호출한다.



반응형

'개발이야기 > Android' 카테고리의 다른 글

Android Architecture Components #1 Guide to App Architecture  (2) 2017.10.13
Android Service간 통신 #3  (1) 2017.10.12
Android Service간 통신 #1  (6) 2017.10.10
Android 애니메이션#2 - Tweened Animation  (2) 2017.10.09
SSL  (0) 2017.10.08