본문 바로가기

프로그래밍/Android

서비스1 - 로컬서비스

 

로컬 서비스 - 액티비티와 차이없으나 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" />