검색결과 리스트
글
AIDL을 이용한 RPC 서비스를 구현해보자!
Mobile Programming/Android
2011. 1. 19. 12:07
앞선 포스팅에서 로컬 서비스를 구현해 보았다.
RPC 서비스는 Remote Procedure Call 의 Abbreviation(?) 로서 , 다른 프로세스들이 소비할 수 있는 서비스임을 뜻한다.
다른 플랫폼들과 마찬가지로 클라이언트에 공개될 인터페이스 정의를 위해 IDL (interface definition language) 을 사용한다.
안드로이드에서는 이를 Android IDL , 즉 AIDL 이라고 지칭한다 .
서론은 이쯤하고 , RPC 서비스를 구현해보자.
1. AIDL 파일 만들기. 인터페이스를 만들자. (구현할 필요는 없다.)
2.이 파일을 src 폴더안에 넣기.
3.컴파일하기.
4.res아래에 웬 자바파일이 생겼다!
5.service를 상속한 액티비티를 하나 만들자.
6.그 안에 1번의 인터페이스를 구현할 클래스를 만들자. 상속하는 클래스는 ~.Stub
7.6에 메서드들을 구현한다.
8.로컬서비스에서 바인더클래스를 만드는대신에 6의 클래스를 만들어준것이다. 이 클래스를 onBind()에서 리턴해주자.
9.나머지는 로컬과 같다!
소스는 다음과 같다.
public class LocalService extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ServiceConnection tserviceConnection = new ServiceConnection(){ public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.d("aidl","connected"); try { ((Service2.Service2impl)service).sayHello2(); } catch (RemoteException e) { // TODO Auto-generated catch block Log.d("aidl",e.getStackTrace().toString()); } } public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; startService(new Intent(LocalService.this, Service2.class)); bindService(new Intent(LocalService.this, Service2.class),tserviceConnection,0); Button btn_dis = (Button)findViewById(R.id.discon); btn_dis.setOnClickListener(new OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub stopService(new Intent(LocalService.this,Service2.class)); } }); } }다음은 구현부이다.
public class Service2 extends Service { public class Service2impl extends aidlService.Stub{ public void sayHello2() throws RemoteException { // TODO Auto-generated method stub Log.d("aidl","service2, sayHello2!"); } } Service2impl tb = new Service2impl(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return tb; } }
여기까지 적고 메니페스트에 서비스에 대한 정보 한줄만을 적어도 로컬에서는 잘 돌아가지만, 이 서비스를 외부에서 이용할 수 있도록 인텐트 필터를 더 넣어줄 필요가 있다.
여기까지하면 이제 외부에서 com.android.servicelocal 패키지안에 있는 aidlService를 접근할 수 있게된다 .
이제 새로운 프로젝트를 만들어서 이 서비스에 접근해보도록 하자 .
역시 이름 명명법이 좀 헷갈리긴 하지만.. 양해바랍니다.
TestService가 외부 액티비티로서 이 클래스는 com.android.testService 패키지 안에 존재한다.
앞서 aidl 파일을 이미 만들어 주었지만, 서비스에 접근할 이를테면, Client 프로세스에게도 일종의 계약서 같은 것이 필요하다.
따라서 생성해두었던 aidl 파일을 서비스가 존재하는 패키지경로로 패키지를 만들고 그안에 복사해 두도록 하자.
외부 서비스를 호출할때는 startService 대신에 bindService를 이용한다.
bindService의 첫번째 인자 intent는 이전 로컬에서 생성할때와는 다르게 인텐트 필터를 통해 서비스를 찾아갈수 있도록
getName() 을 호출해주어야한다 . (액션을 다른 스트링으로 주고 , 그 액션 인텐트를 넘겨주어도 OK!)
호출하는 외부 액티비티는 논거할 다른 기술은 없고 ,
bind할때 인텐트에 주의하고 , 그 서비스를 조작하기위해 서비스를 얻어올때 로컬과 같이 캐스팅을 통하지않고
자동으로 생성된 java 파일의 클래스 객체.Stub.asInterface(IBinder) 임을 확인하자.
public class TestService extends Activity { public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); final ServiceConnection serConn = new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.d("client","serviceConnected!"); aidlService aservice; aservice = aidlService.Stub.asInterface(service); try { aservice.sayHello2(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.d("client","disConnect"); } }; Button btn_bind = (Button)findViewById(R.id.btn_bind); Button btn_stop = (Button)findViewById(R.id.btn_stop); btn_bind.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub bindService(new Intent("com.neo" ),serConn,Context.BIND_AUTO_CREATE); } }); btn_stop.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub unbindService(serConn); } }); } }
'Mobile Programming > Android' 카테고리의 다른 글
Local Service를 이용해보자! (0) | 2011.01.18 |
---|---|
Android 입문자를 위한 Tutorial - 7. 탭뷰의 이용 (0) | 2010.11.10 |
Android 입문자를 위한 Tutorial - 6. 커스텀 위젯 (0) | 2010.11.09 |
Android 입문자를 위한 Tutorial - 5. ArrayList (0) | 2010.11.04 |
Android 입문자를 위한 Tutorial - 4. 라디오 버튼 (2) | 2010.10.21 |