티스토리 뷰

안드로이드/프로그래밍

통신(intent, IPC)

에어버스 2011. 1. 5. 03:49

Intent
단방향 Broadcast, 서비스 1 : n 클라이언트

IPC (Inter Process Communication)
1:1

AIDL (Android Interface Definition Language)
바인더로 사용할 Binder class 코드를 자동으로 만들어주는데 사용하는 언어

1 . 서비스 용 프로젝트 만들기
New Android project(서비스 용, 서버) - Activity 는 없음
ProjectName : GPSLocatorService
BuildTarget : Android 2.1
ApplicationName : GPSLocatorService
PackageName : kr.test.GPSLocatorService
MinSDKVersion : 7

2. 새 Package 추가
프로젝트 탐색기에서 프로젝트명 안의 src 선택 후 마우스 우측버튼 눌로 New/Package 선택
Name : kr.test.GPSLocatorService_Interface

3. 새파일 추가
kr.test.GPSLocatorService_Interface 선택 후 마우스우측버튼 눌러 New/File 선택
File Name : iGPSLocatorService.aidl

package kr.test.GPSLocatorService_Interface;

import android.content.ComponentName;

interface IGPSLocatorService {
 int getGPSDataLat(/*in int a, in int b*/); // 서비스 함수로 인수 전달 방법
 int getGPSDataLng();
}

4. 프로젝트 빌드 수행
프로젝트명/gen/패키지명(Interface)/iGPSLocatorService.java 파일이 만들어짐.
(메뉴 Project/Build Automatically 체크 되어 있으면 aidl 파일 저장하면 java파일 자동 생성됨)

5. 서비스해줄 자바 파일 만들고 서비스 함수 구현
Manifest.xml 에서 Application 탭/Application Nodes/Add.../Service,OK버튼/Name*/Name:GPSLocatorService,Finish버튼

프로젝트명/src/패키지명/GPSLocatorService.java 파일 만들어짐.

package kr.test.GPSLocatorService;

import android.app.*;

public class GPSLocatorService extends Service {
// 서비스 구현 부분

@Override
 public void onCreate() { // 서비스 시작하면 표시해줌, 꼭 구현할 필요 없음
  // TODO Auto-generated method stub
  super.onCreate();
  Toast.makeText(CalcService.this, new String("서비스 시작..."), Toast.LENGTH_SHORT).show();
 }

@Override
 public IBinder onBind(Intent arg0) {
  // TODO Auto-generated method stub
  return mBinder;
 }

 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
 }
 IGPSLocatorService.Stub mBinder = new IGPSLocatorService.Stub() {
 
  @Override
  public int getDataLat(/* int a, int b /*) throws RemoteException {
   // TODO Auto-generated method stub
   int lat;
   Geocoder geocoder = new Geocoder(this);
   addresses = geocoder.getFromLocationName(a[1], 1);
   lat  = addresses.get(0).getLatitude() * 1E6;
   return lat; //위도 값을 Client 에 전달
  }

}

6. manifest.xml 에 <service> 추가


<application android:icon="@drawable/icon" android:label="@string/app_name">
     <service android:name="GPSLocatorService" android:process=":remote" android:enabled="false">
      <intent-filter>
       <action android:name="kr.test.GPSLocatorService_Interface.IGPSLocatorService"/>
      </intent-filter>
  </service>
 </application>

7. java 패키지 Export
IGPSLocatorService.java 파일을 포함하는 패키지(gen/kr.test.GPSLocatorService_Interface) 선택 후 마우스 우측버튼 눌러 Export...
Java JAR file/Jar file:C:\AndroidSRC1\GPSLocatorService.jar, Finish버튼

8. 클라이언트 용 프로젝트 만들고 Lib 추가하기
클라이언트 프로젝트 선택 후 마우스 우측버튼 눌러 Properties/Java Build Path/Libraries탭/Add External JARs.../7번에서 만든 jar 파일 선택
프로젝트/Referenced Libraries/GPSLocatorService.jar 파일이 추가됨.
(jar 파일이 폴더이동하면 이동한 폴더위치로 다시 추가해야 함)

9. Client 에서 서버 연결
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import exam.service_interface.IGPSLocatorService;


private IGPSService mGPSService;
ServiceConnection srvConn = new ServiceConnection(){
  @Override // 서비스 연결 시 자동 호출됨
  public void onServiceConnected(ComponentName name, IBinder service) {
   // TODO Auto-generated method stub
   mGPSService = IGPSLocatorService.Stub.asInterface(service);
// mGPSService 로 서비스 함수를 호출한다
  }

  @Override // 서비스 끊길때 자동 호출됨
  public void onServiceDisconnected(ComponentName name) {
   // TODO Auto-generated method stub
   mGPSService = null;
  } 
    };

@Override
 protected void onResume() { // 사용자와 상호작용 직전 호출됨 (onCreate() 다음에 호출)
  // TODO Auto-generated method stub
  super.onResume();
  Intent intent = new Intent("kr.test.GPSLocatorService_Interface.IGPSLocatorService"); // 다른 패키지에서 호출 시 클래스 명 대신 액션명을 써야 함
// 같은 패기지인 경우 Intent intent = new Intent(this, GPSLocatorService.class);
        bindService(intent, srvConn, BIND_AUTO_CREATE);
 } // BIND_AUTO_CREATE : 서비스를 자동 기동 시킨다-서버(서비스)를 Client 실행하기 전에 실행시킬 필요 없음
 @Override
 protected void onPause() { // Activity가 가려질때 호출됨
  // TODO Auto-generated method stub
  super.onPause();
  unbindService(srvConn); // 서비스 연결 끊음
 }

Button btnGPSData = (Button)findViewById(R.id.btnData);
       
        btnGPSData.setOnClickListener(new Button.OnClickListener(){
         public void onClick(View v){
          int Lat = 0;
          try{
           Lat = mGPSService.getGPSDataLat(); // 서비스 함수 호출
          }
          catch(RemoteException e){
           e.printStackTrace();
          }
          mResult.setText("위도 : " + Lat);
         }
        });
 
10. Client 실행하면 서비스 프로그램도 자동으로 실행되어 위도값을 받아 오게된다.

서비스(Server) & Client 예제

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31