티스토리 뷰
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 예제