티스토리 뷰

개발자 배배/Android

[Android] Service 기본

사연있는 배배 2017. 2. 8. 18:39

꽤 자주 쓰기도 했고 익숙하지만, Beacon 사용하면서 background에서 돌릴 필요성이 있어서, Service를 다시한번 정리해봤다! 서비스를 시작하는 방법은 아래 2가지 이다.




< Service의 분류 >

  1. startService() 를 이용하는 방법
  2. bindService() 를 이용하는 방법


이렇게 시작방법이 다른 애들은 다른 life cycle 을 갖는다.

startService() 로 시작된 service 는 혼자서 잘 돌다가 stopSelf() 를 호출해서 스스로 멈춰야만 한다. 

다른쪽에서 stopService() 를 이용해서 이 service 를 멈출 수도 있다. 

bindService() 를 통해서 생성된 service 는 조금 다르다. 

보통 이 bindService() 를 호출하는 쪽을 client 라 부르는데, 이 client 와 service 는 IBinder interface 를 통해서 통신하게 된다. client 와 service 간의 통신은 unbindService() 로 끝낼 수 있고, bindService 를 이용해서 여러 client 가 하나의 service 에 bind 해서 사용할 수 있다. 그렇기 때문에 unbindService() 를 호출하는 것만으로는 system 이 service 를 destroy 하지 않으며, 모든 bindService() 했던 client 가 unbind되어야만 비로소 service 를 destroy 하게 된다.


-> 이하 startService()를 사용하는 방법을 다루겠다. 




< Service의 사용 >

그렇다면 Service는 주로 언제 사용하나? 

  1. 네트워킹을 통해 서버에 데이터를 요청하고, 응답을 기다리는 비동기 작업을 Service로 분리하여 구현하면, user가 보는 화면과 관계없이 서버와 통신이 가능하며, 서버로부터 응답이 왔을때 원하는 화면을 띄워주는 기능도 매우 자연스럽게 구현할 수 있다.
  2. 알림창에 띄워 진행상황을 알리거나
  3. 파일 다운로드 등 여러 상황에서 유용하게 쓰임. 
-> Service에서는 networking, UI update를 위한 뒷작업들이 주로 일어나기 때문에 onStartCommand()에서 thread를 돌리는 경우가 많습니다




< Service의 구현 >


1. Service class 정의 

extends Service를 해서 서비스 class를 만들고, 사용하는 쪽에서는 intent(this, MyService.class);  startService(intent); 이런식으로. 



public class KbService extends Service implements Runnable {

private int count = 0;

@Override
public void onCreate() {
super.onCreate();
// service에서 가장 먼저 호출됩니다 (최초에 한번!)

Thread thread = new Thread(this);
thread.start();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
// process가 죽거나하면 service는 자체적으로 다시 돌기 시작하는데,
// 그때마다 onCreate()가 아닌 얘가 항상 call됨!
// 그래서 중요한 작업은 주로 여기서 정의되고, onCreate()는 setting하는 코드들이 들어감!
}

@Override
public IBinder onBind(Intent intent) {
return null;
// service 객체 <-> 화면단(Activity) 사이에 data를 주고받을때 사용됨!
}

@Override
public void onDestroy() {
super.onDestroy();
// service가 종료될때(stopService() call된 후) 실행
}

@Override
public void run() {

}
}



2. Manifest에 등록



<service android:name=".KbService" />


3. startService() / stopService()



serviceIntent = new Intent(this, KbService.class);
serviceIntent.putExtra("count", "1");
startService(serviceIntent); // stopService(serviceIntent);







출처 : 

1. http://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-Service-%EC%82%AC%EC%9A%A9%EB%B2%95

2. http://bitsoul.tistory.com/147

3. http://i5on9i.blogspot.kr/2013/01/service-bind-local-service.html


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함