● 로컬 서비스 - 액티비티와 큰 차이없으나 UI 없이 백그라운드로 수행되는 객체.
명시적으로 서비스 클래스를 통해 구동하는 것을 로컬 서비스,
묵시적으로 액션 및 인텐트 필터를 사용하는 서비스를 리모트 서비스라 한다.
리모트 서비스에 대해서는 다음에 다룰 예정 ... -_-;; 헉헉
서비스 구동 :
startService(new Intent(SampleActivity.this, SampleService.class));
서비스 중지 :
stopService(new Intent(SampleActivity.this, SampleService.class));
● 샘플 : 로컬 서비스를 구동해 상태바에 알림문자 및 아이콘 보이기
서비스를 백그라운드로 구동하면 해당 상태를 알기가 어려운데, 이런경우 Notification을 활용하면
서비스의 상태를 판단하기 좋다.
1. 서비스 객체 구현 : Service 를 상속받아 구현한다.
public class SampleService extends Service {
NotificationManager mNM = null;
}
2. onCreate() 오버라이딩 - 상태바에 서비스 정보를 등록하는 부분.
public void onCreate() {
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// 상태바에 표시할 텍스를 얻는다.
CharSequence text = "어쩌구 저쩌구";
// 아이콘과 텍스트, 현재시간등으로 Notification을 설정한다.
Notification notification = new Notification(R.drawable.stat_sample, text,
System.currentTimeMillis());
// 해당 서비스는 상태바에 등록되는데
// 상태바를 활성화해 리스트 중 서비스를 클릭했을때의
// 처리를 이곳에 추가한다.
// 아래의 PendingIntent.getActivity는 startActivity(Intent)와 동일하다.
// 즉, 서비스 패널에서 이 서비스를 클릭하면, MySampleActivity를 시작시킨다.
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, MySampleActivity.class), 0);
// 위의 인텐트를 설정한다.
notification.setLatestEventInfo(this, "레이블",text, contentIntent);
// 서비스 관리자에게 id 1234로 notification 을 등록한다.
mNM.notify( 1234, notification);
}
3. onDestroy() : 해당 id 의 notification을 취소한다.
public void onDestroy() {
mNM.cancel(1234);
}
4. onBind() : 이 서비스에 바인딩을 요청하는 경우의 처리
우선 바인더를 상속받은 클래스를 하나 만들어 클라이언트에게 전달할 수 있도록한다.
클라이언트는 바인더를 전달받아 서비스 객체에 접근하도록 구성된다.
public class LocalBinder extends Binder {
SampleService getService() {
return SampleService.this;
}
}
private final IBinder mBinder = new SampleBinder();
public IBinder onBind(Intent intent) {
return mBinder;
}
이러면 대강 서비스 객체의 구현은 끝!!!!!!
● 이제 서비스 객체 구현은 이루어졌으니 이를 사용해야 한다.
private SampleService mBoundService;
1. 서비스 구동 및 제거 루틴 구현 : 별도의 액티비티나 모듈에서 서비스 구동하는 루틴
별거없다 -_-;;
startService(new Intent(MySampleActivity.this, SampleService.class));
stopService(new Intent(MySampleActivity.this, SampleService.class));
이를 원하는 루틴에 삽입하면 된다.
2. 바인딩 루틴 구현 : 이미 생성된 서비스에 연결하는 루틴
바인딩 역시 특이한건 없이 제공되는 바인딩 메쏘드를 사용한다.
아래 메쏘드는 서비스에 연결하고, 바인딩을 수행한다. 만약 서비스가 존재하지 않으면
자동으로 생성한다.
bindService(new Intent(MySampleActivity.this,
SampleService.class), mConnection, Context.BIND_AUTO_CREATE);
바인딩 해제는..
unbindService(mConnection);
두메쏘드에 mConnection 이 사용되었는데.. 요녀석은 ServiceConnection 객체이다.
이녀석은 서비스 연결에 관한 이벤트를 수신하기 위한 녀석이다.
두개의 추상 메쏘드를 구현해 주어야 한다. 위에 구현해 두었던 바인딩 객체를 사용해
서비스의 레퍼런스를 확보할 수 있다.
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mBoundService = ((SampleService.SampleBinder)service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
어떻게던 레퍼런스만 확보되면 뭔 짓이든 하면 된당...
● AndroidManifest.xml 에 서비스 추가
<service android:name=".app.LocalService" />
'프로그래밍 > Android' 카테고리의 다른 글
Android system 폴더에 쓰기 (0) | 2010.02.08 |
---|---|
에뮬레이터에서 data,system 디렉토리 가져오기 (0) | 2010.02.04 |
JNI 기본사항 (0) | 2010.01.15 |
플랫폼 make/ 모듈 추가 방법 (0) | 2010.01.15 |
커널 빌드하기 (0) | 2010.01.14 |
LayoutInflater를 사용해 레이아웃 구성하기 (0) | 2009.12.15 |
액티비티 변경 에니메이션 (0) | 2009.12.06 |
Animation 관련 샘플 (0) | 2009.12.06 |
ViewFlipper로 뷰 교체하기 (0) | 2009.12.06 |
에니메이션 interpolater (0) | 2009.12.06 |