[안드로이드] 서비스 컴포넌트란 ?
안드로이드에는 4대 컴포넌트가 존재한다.
액티비티, 서비스 브로드캐스트, 컨텐트 프로바이더..
그 중 서비스 컴포넌트에대해 알아보자
서비스는 기본적으로 백그라운드에서 실행되는 컴포넌트이다.
백그라운드하면 먼저 스레드가 떠오를 것이다.
스레드는 프로세스내의 실행되는 하나의 흐름 단위라고 정의 한다.
프로세스는 반드시 하나 이상의 스레드를 가지고있으며 여러 스레드를 동시에 실행 할 수도 있다. 여러 작업이 동시에 진행 되어지므로 효율적으로 처리가 가능하다.
하지만 이 스레드는 한계를 가진다.
임의의 시점에서 강제 종료당 할수도 있고, 앱 내에서 생성된 스레드는 앱 종료 후 재실행한다고 해도 재접근이 곤란하다.
그래서 보통 크지않은 작업이나 앱을 계속 실행하고 있는 동안엔 스레드를,
작업시간이 길고 앱을 종료해도 백그라운드에서 계속 처리하기위해선 서비스를 사용한다.
일단 서비스 클래스를 생성해야 한다.
onStartCommand 메소드 return 값은
- START_NAT_STICKY : 전달할 인텐트가 있을 때를 제외하고 서비스가 중단되면 재생성하지 않음
- START_STICKY : 중단된 서비스를 재시작하지만 인텐트를 재전달하지는 않음( 미디어 플레이어처럼 무기한 도작하는 서비스에 사용됨)
- START_REDELIVER_INTENT : 인텐트와 함께 서비스를 재시작(다운로드처럼 무엇을 처리 했었는지 알아야할 때 사용됨)
그 다음 MainActivity에서 인텐트로 감싼다음 startService()로 실행, onStartCommand()를 호출하게 된다.
그리고 중요한건 메니페스트에 서비스를 꼭 명시해야한다.
그냥 Service는 자동 종료 되지않아 onDestroy()를 꼭 구현해준다.
인텐트 서비스는 서비스에서 파생되어진 것이기에 서비스의 특성을 가진다.
서비스와 다르게 작업스레드를 구현할 필요없이 내부적으로 생성되고
수행이 끝나면 자동적으로 종료되어진다. 하지만 한번에 하나의 인텐트만 처리된다.
여러번 실행되면 queue로 처리되어 차례대로 실행되어진다.
IntentService클래스를 상속 받아 구현. 순서대로 일을 처리한 후에 스스로 종료.
서버와 클라이언트 방식과 유사하다. 서비스 - 서버, 다른컴포넌트 - 클라이언트
바인드 중일 때에는 바인드 해제까지 서비스 종료가 불가하다.
물론 앱이 동작중일 때만 바인드될 것이다.
액티비티, 서비스 브로드캐스트, 컨텐트 프로바이더..
그 중 서비스 컴포넌트에대해 알아보자
서비스는 기본적으로 백그라운드에서 실행되는 컴포넌트이다.
백그라운드하면 먼저 스레드가 떠오를 것이다.
스레드는 프로세스내의 실행되는 하나의 흐름 단위라고 정의 한다.
프로세스는 반드시 하나 이상의 스레드를 가지고있으며 여러 스레드를 동시에 실행 할 수도 있다. 여러 작업이 동시에 진행 되어지므로 효율적으로 처리가 가능하다.
하지만 이 스레드는 한계를 가진다.
임의의 시점에서 강제 종료당 할수도 있고, 앱 내에서 생성된 스레드는 앱 종료 후 재실행한다고 해도 재접근이 곤란하다.
그래서 보통 크지않은 작업이나 앱을 계속 실행하고 있는 동안엔 스레드를,
작업시간이 길고 앱을 종료해도 백그라운드에서 계속 처리하기위해선 서비스를 사용한다.
서비스의 종류
1. 스타트 서비스
스타트 서비스는 다른 컴포넌트에 의해 실행 되어지며 서비스를 실행시킨 컴포넌트가 포그라운드에 있지 않거나 소멸되어져도 백그라운드에서 계속 작업이 진행되어 작업완료 후에 자동적으로 종료 되어 진다. 완전히 독립적으로 실행 된다.일단 서비스 클래스를 생성해야 한다.
public class MyService extends Service{ //Service 클래스 상속
public int onStartCommand(Intent intent, int flags, int startId){
//백그라운드로 작업할 스레드 코드 구현
return // 서비스가 중단 후 재실행 될 시 설정
}
}
- START_NAT_STICKY : 전달할 인텐트가 있을 때를 제외하고 서비스가 중단되면 재생성하지 않음
- START_STICKY : 중단된 서비스를 재시작하지만 인텐트를 재전달하지는 않음( 미디어 플레이어처럼 무기한 도작하는 서비스에 사용됨)
- START_REDELIVER_INTENT : 인텐트와 함께 서비스를 재시작(다운로드처럼 무엇을 처리 했었는지 알아야할 때 사용됨)
Intent intent = new Intent(this, MyService.class);
startService(intent);
그 다음 MainActivity에서 인텐트로 감싼다음 startService()로 실행, onStartCommand()를 호출하게 된다.
그리고 중요한건 메니페스트에 서비스를 꼭 명시해야한다.
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"
/>
그냥 Service는 자동 종료 되지않아 onDestroy()를 꼭 구현해준다.
2. 인텐트 서비스
인텐트 서비스는 서비스에서 파생되어진 것이기에 서비스의 특성을 가진다.
서비스와 다르게 작업스레드를 구현할 필요없이 내부적으로 생성되고
수행이 끝나면 자동적으로 종료되어진다. 하지만 한번에 하나의 인텐트만 처리된다.
여러번 실행되면 queue로 처리되어 차례대로 실행되어진다.
public class MyIntentService extends IntentService {
public MyIntentService(){super("MyIntentService")} // 디버깅시 사용되는 이름
protected void onHandleIntent(Intent intent){
//서비스 시작 시 자동 호출, 작업스레드로 동작
}
}
IntentService클래스를 상속 받아 구현. 순서대로 일을 처리한 후에 스스로 종료.
3. 바운드 서비스
바운드 서비스는 연결타입의 서비스이다. 다른 컴포넌트와 연결하며 연결된 컴포넌트의 상태에 따라 서비스의 동작을 제어한다. -> x 독립, 다른 컴포넌트에 의존적이다.서버와 클라이언트 방식과 유사하다. 서비스 - 서버, 다른컴포넌트 - 클라이언트
바인드 중일 때에는 바인드 해제까지 서비스 종료가 불가하다.
public MyService extends Service{
//............................
public class MyBinder extends Binder{
public MyService getService(){
return MyService.this;
}
}
private IBinder mBinder = new MyBinder();
public IBinder onBind(Intent intent){ //서비스가 바인딩되면 호출된다.
return mBinder; // 이 객체로 통신 한다.
}
Binder를 상속받은 MyBinder는 MyService의 서브클래스로 작성한다.public class MainActivity extends AppCompatActivity {
private Myservice mservice = null;
private boolean mBound = false;
//......................................
private ServiceConnection mConnection = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service){
MyService.MyBinder binder = (MyService.MyBinder) service;
mService = binder.getService();
mBound = true;
//연결되었을 때
}
public void onServiceDisConnected(ComponentName name){
//예기치 않은 종료에 대한 처리
}
}
onServiceConnected에 바인드를 위한 코드를 구현, 연결을 위한 mConnection객체를 생성
protected void onStart(){
Intent intent = new Intent(this, MyService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE);
}
protected void onStop(){
if(mBound){
unbindService(mConnection);
mBound = false;
}
}
MainActivity의 onStart, onStop 메소드에 서비스시작을 위한 코드를 구현한다.물론 앱이 동작중일 때만 바인드될 것이다.
댓글
댓글 쓰기