Efficient Android Threading #10 인텐트 서비스
이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.
자세한 내용은 책을 구입해서 보세용.
12.1. 기본 사항
-
IntentService 는 싱글 백그라운드 스레드에서 태스크를 실행한다.
서비스가 실행 중인 경우, 인텐트는 백그라운드 스레드가 처리를 위해 준비될 때까지 큐에서 대기한다.
실행 중이 아닌 경우 새로운 구성요소 생명주기가 시작되고, 더 이상 처리할 인텐트가 없을 때 구성요소의 생명주기가 끝난다. ( stopSelf 로 중지시킬 필요가 없다. 내부적으로 수행된다. )
즉 실행할 태스크가 있는 동안에만 인텐트 서비스가 실행된다.
-
IntentSevice 에서 백그라운드 태스크 실행자는 핸들러 스레드다.
AsyncTask 기본 실행자와 달리 인텐트 서비스 실행자는 앱 단위가 아닌 인스턴스 단위이다.
따라서 앱은 여러 IntentService 인스턴스를 가질 수 있다.
모든 인스턴스가 순차적으로 태스크를 실행하지만 다른 IntentService 와는 독립적이다.
-
프로세스가 죽은 경우 인텐트 서비스가 복원되어야 하는지 생성자에서 지정할 수도 있다.
기본 인텐트 서비스는 보류 중인 시작 요청이 있을 때만 복원하지만(START_NOT_STICKY), setIntentRedelivery(true) (START_REDELIVER_INTENT) 호출은 마지막 전달된 인텐트를 재전달한다.
12.2. 인텐트 서비스를 사용하는 좋은 방법
** 12.2.1. 순차적으로 정렬된 태스크
** 12.2.2. 브로드캐스트 리시버에서 비동기 실행
-
API Level 11 부터는 비동기 실행을 단순화하기 위해 BroadcastReceiver.goAsync() 메소드를 사용할 수 있다.
이 메서드는 BroadcastReceiver.PendingResult 에 비동기 결과의 상태를 유지한다.
또한 BroadcastReceiver.PendingResult 가 비동기 실행이 마친 후 호출될 수 있는 finish 로 명시적으로 종료될 때까지 브로드캐스트의 수명을 확장한다. ( finish 가 불릴 때까지 다음 broadcast 를 받지 않는다 )
public class AsyncReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent){
final PendingResult result = goAsync();
new Thread(){
public void run(){
// background 작업
result.finish();
}
}.start();
}
}
12.3. 인텐트 서비스와 서비스
-
다음의 경우에는 인텐트 서비스가 아닌 일반 서비스를 이용해 구현을 확장해야 한다.
클라이언트에 의한 제어 ( 예: 생명주기 )
동시적인 태스크 실행
순차적이고 재배열 가능한 태스크
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
Efficient Android Threading #12 로더를 이용한 자동 백그라운드 실행 (0) | 2018.03.28 |
---|---|
Efficient Android Threading #11 AsyncQueryHandler 를 이용한 콘텐트 프로바이더 접근 (0) | 2018.03.27 |
Efficient Android Threading #9 서비스 (0) | 2018.03.25 |
Efficient Android Threading #8 AsyncTask 로 백그라운드 태스크를 UI 스레드에 묶기 (0) | 2018.03.24 |
Efficient Android Threading #7 Executor 프레임워크를 통한 스레드 실행 제어 (0) | 2018.03.23 |
댓글