본문 바로가기

Linux/Android

Android IPC 통신 (바인더) [출처] Android IPC 통신 (바인더)|작성자 검린

출처: http://blog.naver.com/mirnae/100101468187

서비스는 필요한 경우 종료되지 않고 특정 액티비티와 관계없이 항상 동작하도록 만들어진 구성 요소이다. 서비스는 API 등을 호출해 수동으로 시작하거나 아니면 프로세스 간 통신IPC,Inter-Process Communication 방법을 사용해 서비스에 연결할 때 자동으로 시작 되기도 한다.

서비스 구현

Service 클래스를 상속받아 새로운 클래스를 만든다.



Service 클래스의 생명주기 메소드
1.onCreate() - 서비스가 생성될 때 호출된다.
2.onStart() - 다른 프로세스 에서 서비스를 수동으로 시작 시킬 경우,IPC 요청에 의해 시작될경우 
3.onDestory() - 서비스가 종료될 때 호출된다.

서비스는 일반적으로 액티비티나 안드로이드 내부의 다른 컴포넌트와 통신할 수 있는 방법으로 프로세스간 통신IPC 방법을 제공한다. IPC를 구현할때 핵심은 AIDL(Android Interface Description Language,즉 안드로이드 IDL 이다.)

IPC(Inter-Process Communication) 프로세스간 통신 구현 

Remote procedure calls

 




AIDL (Android interface definition language) 작성

package com.commonsware.android.service;
interface IWeather{  
String getForecastPage(); 
}

사용되는 DataType에 제한이 있다.
■ 기본 데이터 타입(int,float,double,boolean 등)
■ String 과 CharSequence 클래스
■ List 와 Map(java.util 패키지)
■ AIDL로 정의된 데이터 타입
■ Parcelable 인터페이스를 구현한 모든 클래스 (Parcelable 은 안드로이드에서 사용되는 직렬화 방법을 의미한다.)

또한 서비스 내부에서는 예외를 발생시켜서는 안된다. 서비스 내부에서 발생하는 모든 예외는 try-catch로 잡아서 처리하고, 오류 상황에 대한 결과는 에러 코드 등의 다른 방법을 사용해 전달해야한다.
작성된 AIDL 파일은 확장자를 .aidl로 지정하고, AIDL 파일에 지정한 패키지에 맞춰 적절한 디렉토리에 넣어둔다.이제 IDE 내부에서 또는 Ant를 사용해 프로젝트를 빌드하면 aidl이라는 프로그램이 해당 AIDL 파일을 분석해 서버 스텁stub 과 클라이언트 프록시proxy를 자동으로 생성한다.

인터페이스 구현
■ AIDL이 생성한 .Stub 클래스의 인스턴스를 생성한다.
■ AIDL에 정의했던 여러 메소드에 해당하는 실제 메소드를 구현한다.
■ Service를 상속받는 클래스의 onBind() 메소드에서 스텁 클래스의 인스턴스를 새로 생성해 리턴한다.
private final IWeather .Stub binder=new IWeather.Stub(){
public string getForecastPage()
{
return(getForecasetPageImpl());
}
};


AndroidManifest.xml 에 정의
인터페이스를 구현후 서비스를 AndroidManifest.xml 파일에 정의해야 해당 서비스를 사용할수 있도록 
안드로이드 시스템에 등록된다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android.service">
  <uses-permission android:name="android.permission.INTERNET" /> 
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".WeatherPlus" android:label="@string/app_name"> 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
    </activity> 
<service android:name=".WeatherPlusService" />
    </application>
    <uses-sdk android:minSdkVersion="2" />
</manifest>


구현된 서비스 사용

서비스를 사용하려면 먼저 SeriviceConnection 클래스를 상속받아 다음 두 메소드를 구현하여 새로운 클래스를 구현해야 한다.

1.onServiceConnected() 액티비티가 원하는 서비스와 연결됏을때 호출된다.
2.onServiceDisconnected() 서비스와의 연결이 정상적으로 종료됐을 때 호출된다.

액티비티를 특정 서비스와 연결하려면 액티비티의 bindService() 메소드를 호출한다.

bindService(serviceIntent, svnConn, BIND_AUTO_CREATE);
1.호출하려는 서비스를 가리키는 Intent
2.ServiceConnection 인스턴스
3.옵션 설정 플래그 

bindService()를 실행하면 ServiceConnection 클래스의 onServiceConnected()메소드가 호출된다.


서비스 호출


서비스 연결 해제
unbindService()를 호출한다.

수동 실행 

IPC를 사용하지 않는다 해도 수동으로 서비스를 시작시키거나 종료시킬 수 있다. 이렇게 수동으로 서비스를 실행시켜두면 액티비티 실행 여부와 관계없이 해당 서비스를 계속 실행 시킬 수 있다.
startService() 메소드를 호출한다.
stopService() 메소드를 호출하여 서비스 를 종료한다.