<안드로이드/Android> 서비스(SERVICE) PART5

Posted by 앱해피
2015. 6. 18. 09:38 안드로이드 이론
Bound 서비스 생성하기(Creating Bound Service)

 

 

안드로이드 컴포넌트는 bindService() 메소드를 호출함으로써 Bound 서비스에 결속(Binding) 할 수 있다.

Bound 서비스를 사용하는 경우는 다음 상황에 해당한다.

 

1. 액티비티나 다른 컴포넌트를 이용해서 서비스와 상호 연동하고자 할 때

 

2. 나의 앱의 일부 기능을 IPC를 이용해서 다른 앱으로 하여금 이용할 수 있도록 하기 위해

 

Bound 서비스를 이용할 수 있게 하려면, 서비스의 인터페이스를 정의한 IBinder를 반환하는 onBind()라는 콜백 메소드를 구현해야만 한다. 서

 

비스를 이용하고자 하는 컴포넌트는 bindService()라는 메소드를 통해서 서비스가 제공하는 인터페이스를 전달 받을 수 있으며, 서비스에서 제공하는 인터페이스 기능을 사용할 수 있다.

 

Bound 서비스는 자신에게 결속(Binding)된 컴포넌트가 하나라도 존재하면 계속 작동 가능한 상태에 있는다. 그렇기 때문에 서비스에 연결된 컴포넌트가 하나라도 없으면, 시스템에서는 Bound 서비스를 종료하기 된다.

 

Bound 서비스만 이용했다면, stopSelf()나 stopService()와 같은 함수로 종료시키지 않아도 된다.

 

Bound 서비스를 생성하기 위해서, 가장 먼저 해야하는 것은 클라이언트가 서비스와의 통신을 위해 필요한 인터페이스를 정의하는 일이다.

 

서비스와 클라이언트사이의 인터페이스는 IBinder 형태로 구현되어야 하며, IBinder 객체는 서비스는 onBind()라는 콜백 메소드에서 클라이언트에게 제공되어야 한다. 클라이언트가 IBinder 객체를 전달받으면, IBinder에 정의된 인터페이스를 통해 서비스와 상호 동작이 가능하다.

 

다수의 클라이언트가 한번에 서비스와 결속(Binding)될 수 있다. 클라이언트가 서비스와 상호 동작할 때, 결속을 해제하고 하면 unBindService()를 호출하면 된다. 서비스와 결속된 클라이언트가 하나도 존재하지 않으면 시스템에서 Bound 서비스를 종료한다.

 

 

유저에게 노티피케이션(Notification) 보내기

 

서비스가 일단 동작하면, 서비스는 토스트 노티피케이션이나 상태바 노티피케이션을 통해 현재 발생된 이벤트 정보를 알려줄 수 있다.

 

토스트 노티피케이션은 스마트폰 창에 잠깐 나타났다가 사라지는 메시지다, 반면에 상태바 노티피케이션은 메시지와 함께 상태바안에 메시지 형태로 제공된다. 유저가 상태바 노티피케이션을 선택하면 해당 메시지와 관련된 기능이 수행된다.

 

보통, 상태바 노티피케이션은 백그라운드 상태에서 특정 작업이 완료되었을 때 알려주는 용도로 많이 사용된다. 유저가 노티피케이션을 클릭했을 때, 노티피케이션에서 그와 관련된 기능을 액티비티로 보여주게 된다.

 

 

포그라운드에서 서비스 동작시키기 

 

포그라운드 서비스는 서비스의 종류중에 하나다. 하지만 다른 백그라운드 서비스와는 다르게 유저가 현재 작동하고 있다는 것을 인식할 수 있는 서비스(ex 음악 재생 서비스)이기 때문에 시스템에서 자동으로 종료시키지 않는다.

 

포그라운드 서비스는 유저가 서비스의 존재 유무를 확인할 수 있도록 상태바에 노티피케이션을 제공해야만 한다. 유저가 직접 포그라운드 서비스를 멈추지 않는 한 노티피케이션은 제거되지 않는다.

 

예를 들어, 서비스를 이용해서 음악을 재생하는 음악 어플리케이션은 포그라운드에서 동작되어야만 한다, 그래야 사용자가 현재 그와 관련된 서비스가 동작하고 있다는 것을 인식해야 하기 때문이다.

 

상태바에 존재하는 노티피케이션은 현재 재생되는 노래를 보여줄 수 있어야 하고, 노티피케이션이 클릭되면 해당 어플리케이션 화면을 보여줌으로써, 사용자가 추가적인 기능을 활용할 수 있도록 해야한다.

 

포그라운드를 통해서 서비스를 동작시키기 위해서는, startForeground()메소드를 호출하면 된다. 이 메소드는 2개의 파라미터를 받는다. 하나는 노티피케이션을 유일하게 식별할 수 있는 식별자이며, 두번째는 상태바에서 사용하고자 하는 노티피케이션 객체다.

 

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
        System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
        getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);

포그라운드에서 서비스를 제거하기 위해선, stopForeground()를 호출하면 된다. 이 메소드는 서비스를 종료시키지 않는다.

하지만, 포그라운드 서비스가 동작하는 동안에 서비스만 제거하면 노티피케이션도 제거된다.

 

감사합니다. ^_^