반응형
링크 : http://cafe.naver.com/aphone.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=6853&social=1
위의 링크에는 소스코드를 다운로드 할 수 있습니다. 저 역시 이 소스를 보고 따라 구현을 해보았습니다. 소스의 내용은 차이가 없지만, 추가적으로 작성한 글이 도움이 되었으면 합니다. 또한 실행을 해보면 좀 더 보기가 쉬울 것 이라고 생각이 들어서 링크를 겁니다.
안드로이드에서는 프로세스간에는 RPC통신을 한다고 합니다. App과 Service사이에서 통신을 하려면 RPC통신을 하도록 해야겠죠? 그래서 안드로이드에서 지원하는 aidl 툴을 이용하면 서비스를 쉽게 구현 할 수 있습니다. 이 툴은 서비스 스텁(stub)과 서비스 프록시(proxy) 클래스를 자동으로 생성해줍니다.
실습 순서를 간단하게 나열하자면,
① HelloService 프로젝트를 생성합니다.
② IMyService.adil를 작성합니다. (인터페이스)
③ MyService.java를 작성합니다. (서비스)
④ AndroidManifest.xml에서 service를 등록합니다.
⑤ 실행하여 에뮬레이터에 올립니다.
⑥ HelloServiceClient 프로젝트를 생성합니다.
⑦ HelloService의 IMyService 파일을 복사합니다.
⑧ HelloServiceClient의 Activity 클래스에서 서비스를 연결합니다.
⑨ 실행하여 에뮬레이터에 올리면 서비스와 통신하는 것을 알 수 있습니다.
저희 개발환경은 Eclipse를 사용하였고, Android 2.2 SDK를 사용하였습니다.
이제 aidl을 연습해보겠습니다.
○ HelloService 프로젝트
1. HelloService 프로젝트 생성
- 안드로이드 프로젝트를 생성하세요.
MyService를 작성 할 때 Activity를 Service로 수정 할 것입니다.
2. IMyService.adil 파일을 추가합니다. (따로 package를 만들어서 추가해도 가능합니다)
3. IMyService.adil 파일을 작성합니다.
package com.dhna.service.hello;
interface IMyService {
void test();
int getSize(in String name);
}
interface IMyService {
void test();
int getSize(in String name);
}
4. MyService.java 파일을 작성합니다.
package com.dhna.service.hello;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.birdland.service.hello.IMyService.Stub;
public class MyService extends Service {
public static String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "## onBind ##");
if(IMyService.class.getName().equals(intent.getAction())) {
Log.i(TAG, "## return " + mBinder);
return mBinder;
}
Log.i(TAG, "## return null ##");
return null;
}
IMyService.Stub mBinder = new IMyService.Stub() {
@Override
public void test() throws RemoteException {
Log.d("MyService", "text() call");
}
@Override
public int getSize(String name) throws RemoteException {
return name.length();
}
};
}
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.birdland.service.hello.IMyService.Stub;
public class MyService extends Service {
public static String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "## onBind ##");
if(IMyService.class.getName().equals(intent.getAction())) {
Log.i(TAG, "## return " + mBinder);
return mBinder;
}
Log.i(TAG, "## return null ##");
return null;
}
IMyService.Stub mBinder = new IMyService.Stub() {
@Override
public void test() throws RemoteException {
Log.d("MyService", "text() call");
}
@Override
public int getSize(String name) throws RemoteException {
return name.length();
}
};
}
5. AndroidManifest.xml 파일을 수정 합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.birdland.service.hello"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<service android:name="MyService"
android:label="@string/app_name">
<intent-filter>
<action android:name="com.dhna.service.hello.IMyService" />
</intent-filter>
</service>
</application>
</manifest>
6. 실행하여 apk파일을 에뮬레이터에 올립니다.
○ HelloServiceClient 프로젝트
1. HelloServiceClient 프로젝트를 생성합니다.
- HelloService와 동일
2. HelloService의 IMyService.aidl 파일을 복사합니다.
3. HelloServiceClientActivity.java 파일을 구현합니다.
package com.dhna.app.hello;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.birdland.service.hello.IMyService;
public class HelloServiceClientActivity extends Activity {
IMyService mMyService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bindService(new Intent("com.birdland.service.hello.IMyService"), mMyConnection, Context.BIND_AUTO_CREATE);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
int length = mMyService.getSize("hello");
Toast.makeText(HelloServiceClientActivity.this, "string length : " + length, Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
ServiceConnection mMyConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMyService = IMyService.Stub.asInterface(service);
Toast.makeText(HelloServiceClientActivity.this, "service connected!", Toast.LENGTH_LONG).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(HelloServiceClientActivity.this, "service disconnected!", Toast.LENGTH_LONG).show();
}
};
}
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.birdland.service.hello.IMyService;
public class HelloServiceClientActivity extends Activity {
IMyService mMyService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bindService(new Intent("com.birdland.service.hello.IMyService"), mMyConnection, Context.BIND_AUTO_CREATE);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
int length = mMyService.getSize("hello");
Toast.makeText(HelloServiceClientActivity.this, "string length : " + length, Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
ServiceConnection mMyConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMyService = IMyService.Stub.asInterface(service);
Toast.makeText(HelloServiceClientActivity.this, "service connected!", Toast.LENGTH_LONG).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(HelloServiceClientActivity.this, "service disconnected!", Toast.LENGTH_LONG).show();
}
};
}
4. 실행하여 apk파일을 에뮬레이터에 올립니다. Service와 통신하는 것을 알 수 있습니다.
반응형
'안드로이드' 카테고리의 다른 글
[안드로이드] SQLite db 구조 보기 ( SQLite Manager 사용하기 ) (0) | 2011.06.08 |
---|---|
[안드로이드] 유니코드 문자(특수문자)를 코드에서 사용하는 방법 (0) | 2011.06.08 |
JDK Old Version(1,2, 1,3, 1,4, 1,5) download. (JDK 이전버전 다운로드) (0) | 2011.06.05 |
[안드로이드] repo init을 할 경우 connection timed out / read error 애러 (1) | 2011.06.03 |
[안드로이드] repo sync를 할 경우 read error 발생 (0) | 2011.06.03 |
[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 애러 (0) | 2011.05.27 |
ProgressBar 사용하기 (원형 프로그래스바와 막대 프로그래스바) (0) | 2011.05.26 |
Android Weather AppWidget 소스코드 (0) | 2011.05.22 |
[안드로이드] xml에서 특수문자(&) 사용하기 (2) | 2011.05.04 |
Android – Dialog, AlertDialog, ProgressDialog, DatePickerDialog, TimePickerDialog (0) | 2011.04.26 |