안드로이드 플랫폼에서 서비스 대 IntentService


774

나는 할 수있는 일의 예를 찾고 있습니다. IntentService 할 수없는Service 있습니까?

또한 IntentService다른 스레드에서 실행되고 Service그렇지 않은 것으로 생각합니다. 내가 볼 수있는 한, 자체 스레드 내에서 서비스를 시작하는 것은를 시작하는 것과 같습니다 IntentService. 그 맞습니까?


45
IntentService is used for short tasks (etc) and a service is for long ones어디서 읽었습니까?
njzk2

9
또한 IntentService의 소스 코드를 읽는 것이 좋습니다. 그것이 무엇인지, 무엇을 하는지를 분명하게 만듭니다.
njzk2

1
댓글을 본 후 내 질문을 수정했습니다.
roiberg


2
이전 의견의 링크 (greg7gkb)는 잘 읽었습니다.
DSlomer64

답변:


1348

Tejas Lagvankar는 멋진 게시물을 작성했습니다 이 주제에 관해 . 다음은 Service와 IntentService의 주요 차이점입니다.

언제 사용합니까?

  • 서비스는 어떤 UI와 작업에 사용할 수 있지만, 너무 오래해서는 안됩니다. 긴 작업을 수행해야하는 경우 서비스 내에서 스레드를 사용해야합니다.

  • IntentService은 일반적으로 주 스레드없이 통신 긴 작업에 사용할 수 있습니다. 통신이 필요한 경우 기본 스레드 핸들러 또는 브로드 캐스트 의도를 사용할 수 있습니다. 또 다른 사용 사례는 콜백이 필요한 경우입니다 (의도적으로 트리거 된 작업).

트리거하는 방법?

  • 서비스는 메서드를 호출하여 실행됩니다 startService().

  • IntentService는 이 새 작업자 스레드를 생성합니다 및 방법은, 인 텐트를 사용하여 트리거 방식입니다 onHandleIntent()이 스레드에서 호출됩니다.

트리거

  • 서비스IntentService는 어떤 스레드, 활동 또는 다른 응용 프로그램 구성 요소에서 트리거 될 수 있습니다.

에 실행

  • 서비스는 백그라운드에서 실행하지만 응용 프로그램의 메인 스레드에서 실행됩니다.

  • IntentService은 별도의 작업자 스레드에서 실행됩니다.

한계 / 단점

  • 서비스는 응용 프로그램의 주 스레드를 차단할 수 있습니다.

  • IntentService는 병렬로 작업을 실행할 수 없습니다. 따라서 모든 연속 의도는 작업자 스레드의 메시지 큐로 이동하여 순차적으로 실행됩니다.

언제 멈출 까?

  • 당신이 구현하는 경우 서비스를 , 그것의 작업이 호출하여 수행하는 경우 서비스를 중지하는 것은 귀하의 책임입니다 stopSelf()또는 stopService(). 바인딩 만 제공하려는 경우이 메소드를 구현할 필요가 없습니다.

  • IntentService은 당신이 전화를하지 않아도되도록 모든 시작 요청이 처리 된 후 서비스를 중지합니다 stopSelf().


11
짧고 달콤하지만 CommonsWare의 포인트를 포함하여 답변을 편집하면 더 좋습니다. 많은 사람들이 받아 들여 지거나 가장 많이
찬성 된

12
@Darpan 서비스는 백그라운드에서 장기 실행 작업을 수행 할 수있는 응용 프로그램 구성 요소이며 사용자 인터페이스를 제공하지 않습니다. 서비스는 호스팅 프로세스의 기본 스레드에서 실행됩니다. 서비스는 자체 스레드를 작성하지 않으며 별도의 프로세스로 실행되지 않습니다 (달리 지정하지 않는 한). 즉, 서비스에서 CPU 집약적 작업이나 차단 작업 (예 : MP3 재생 또는 네트워킹)을 수행하려는 경우 해당 작업을 수행하기 위해 서비스 내에 새 스레드를 만들어야합니다.
José Juan Sánchez

8
"IntentService는 메인 스레드에서 트리거해야합니다." 확실해? 내 MainActivity onCreate () 내에서 새 스레드 (아래 코드)에서 IntentService를 호출하면 여전히 작동합니다. new Thread (new Runnable () {@Override public void run () {의도 의도 = 새로운 의도 (context, HelloIntentService.class); startService (intent);}}). start ();
Ashok Bijoy Debnath

9
@AshokBijoyDebnath 당신이 맞아요! 서비스IntentServices은 어떤 스레드, 활동 또는 다른 응용 프로그램 구성 요소에서 시작할 수 있습니다. 이 문제를 해결하기 위해 답변 텍스트를 편집했습니다. 편집 제안에 감사드립니다! :)
José Juan Sánchez

2
문제 없어요!
José Juan Sánchez

165

누군가 나에게 할 수 있고 다른 방법으로 IntentService는 할 수없는 일의 예를 보여줄 수 있다면 Service.

정의 상으로는 불가능합니다. Java로 작성된 IntentService의 하위 클래스입니다 Service. 따라서, 아무것도이 IntentService수행하는이 Service코드의 해당 비트가 포함시킴으로써, 할 수있는 IntentService용도.

자체 스레드로 서비스를 시작하는 것은 IntentService를 시작하는 것과 같습니다. 그렇지 않습니까?

의 세 가지 주요 기능은 다음 IntentService과 같습니다.

  • 백그라운드 스레드

  • 의 자동 큐잉으로 Intent전달 onStartCommand()되므로 백그라운드 스레드에서 하나 Intent를 처리하는 onHandleIntent()경우 다른 명령은 차례를 대기합니다.

  • 대기열이 비면를 IntentService호출 하여을 자동으로 종료stopSelf()

Service확장없이 확장 하여 구현할 수 있습니다 IntentService.


6
조금 늦게, 그러나 나는 것을 발견하고 Service호출 startService만 ANR--을 던지기 전에 약 10 초 동안 작동 할 수있는 IntentService이러한 제한이 보이지 않는 의도를 방송 시작
edthethird

16
@edthethird : 메인 애플리케이션 스레드를 묶었 기 때문입니다. 를 포함한 모든 구성 요소에 대한 모든 라이프 사이클 메소드 onStartCommand()(A)의는 Service, 기본 응용 프로그램 스레드에서 호출된다. UI를 정지시키지 않고이 스레드를 몇 밀리 초 이상 연결할 수 없으며, 몇 초가 걸리면 ANR과 동등한 서비스를 얻게됩니다.
CommonsWare

3
네 너무 빨리 댓글을 달았습니다. onStartCommand대신 작업을 수행했습니다 .UI 스레드에서 실행되는 onHandleIntent것처럼 보이지만 onStartCommand별도의 스레드가 onHandleIntent실행되도록 생성됩니다 .
edthethird

3
@IgorGanapolsky : 더 이상 수행 할 작업이없는 경우 반환 IntentService후 자체적으로 호출합니다 onHandleIntent().
CommonsWare

1
문제는 영어가 아니라 프로그래밍입니다. 예를 들어, "앱을 닫았습니다"는 정확한 정의가 없으므로 발생시 어떤 일이 발생하는지 말할 수 없습니다. 또한 "앱을 닫았습니다"와 "1 시간 후 다운로드 예정"과 어떤 관련이 있는지 모르겠습니다. "1 시간 후 다운로드합니다" 라는 최소한의 재현 가능한 예 를 제공 할 수있는 별도의 스택 오버플로 질문을하는 것이 좋습니다 . 여기에서 "앱을 닫았습니다"의 의미 (예 : 사용자가 앱을 닫는 데 구체적으로 무엇을하는지) 를 자세히 설명 할 수 있습니다 .
CommonsWare

39

서비스

  • 에 의해 호출 startService()
  • 어느 곳에서나 트리거 Thread
  • 에 실행 Main Thread
  • 메인 (UI) 스레드를 차단할 수 있습니다. 긴 작업을 위해 항상 서비스 내에서 스레드 사용
  • 작업이 완료되면 전화 stopSelf()또는stopService()

IntentService

  • 통신이 다음 필요가 수행되는 경우는 보통 긴 작업을 메인 스레드와의 통신을 수행하지 않습니다 Handler또는BroadcastReceiver
  • 통해 호출 Intent
  • 에서 트리거 Main Thread
  • 별도의 스레드에서 실행
  • 작업을 병렬로 실행할 수 없으며 여러 작업자가 동일한 작업자 스레드에서 대기합니다.

19

바퀴를 재발 명하지 마십시오

IntentService 는 의도적으로 동일한 목적 으로 만들어진 서비스 클래스를 확장 합니다.IntentService

그래서 목적은 무엇입니까?

`IntentService의 목적은 걱정없이 백그라운드 작업을보다 쉽게 ​​실행할 수 있도록하는 것입니다.

  • 작업자 스레드 생성

  • 다중 요청 처리를 하나씩 큐잉 ( Threading)

  • 파괴 Service

따라서 NOService할 수있는 모든 작업을 수행 IntentService할 수 있습니다. 요구 사항이 위에서 언급 한 기준에 해당되는 경우 해당 논리를 Service클래스 에 작성할 필요가 없습니다 . 발명 된 바퀴이기 때문에 바퀴를 재발 명하지 마십시오 IntentService.

"주요"차이

서비스는 UI 스레드에서 실행되는 반면 IntentService는 별도의 스레드에서 실행됩니다.

언제 IntentService를 사용합니까?

활동의 범위를 넘어 존재하는 여러 백그라운드 작업을 하나씩 수행하려면 IntentService완벽합니다.

어떻게 IntentService만들어 지는가Service

UI 스레드에서 정상적인 서비스가 실행 (기본 예에 의한 UI 스레드에서 모든 안드로이드 구성 요소 유형의 실행 Activity, BroadcastReceiver, ContentProviderService). 완료하는 데 시간이 걸릴 수있는 작업을 수행해야하는 경우 스레드를 작성해야합니다. 여러 요청의 경우을 처리해야 synchronization합니다. IntentService이러한 작업을 수행하는 기본 구현이 제공됩니다. 개발자 페이지
에 따르면

  1. IntentService 작업자 스레드를 만듭니다.

  2. IntentServiceonHandleIntent()메소드에 하나씩 요청을 보내는 작업 큐를 작성합니다.

  3. 작업이 없으면 메소드 를 IntentService호출 stopSelf()합니다.
  4. onBind()null 인 메소드에 대한 기본 구현을 제공합니다.
  5. 의 기본 구현 onStartCommand()전송 Intent이 Workqueue에 결국에 요청onHandleIntent()

15

허용 된 답변에 포인트 추가 :

Android API 내에서 IntentService 사용법을 참조하십시오. 예 :

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

앱의 IntentService 구성 요소를 만들려면 IntentService를 확장하는 클래스를 정의하고 그 안에 onHandleIntent ()를 재정의하는 메서드를 정의하십시오.

또한 IntentService의 소스 코드, onStartCommand와 같은 생성자 및 수명주기 메소드를 참조하십시오.

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

AsyncTask를 함께 서비스하는 것은 페이로드가 크지 않은 많은 사용 사례에 가장 적합한 방법 중 하나입니다. 또는 IntentSerivce를 확장하는 클래스를 작성하십시오. Android 버전 4.0부터 모든 네트워크 작업은 백그라운드 프로세스 여야합니다. 그렇지 않으면 응용 프로그램 컴파일 / 빌드가 실패합니다. UI에서 스레드를 분리하십시오. AsyncTask 클래스는 UI 스레드에서 새 작업을 시작하는 가장 간단한 방법 중 하나를 제공합니다. 이 주제에 대한 자세한 내용은 블로그 게시물을 참조하십시오.

에서 안드로이드 개발자 가이드 :

IntentService는 요청시 비동기 요청 (인 텐트로 표현)을 처리하는 서비스의 기본 클래스입니다. 클라이언트는 startService (Intent) 호출을 통해 요청을 보냅니다. 서비스는 필요에 따라 시작되고 작업자 스레드를 사용하여 각 의도를 처리하며 작업이 부족할 때 자체 중지됩니다.

IntentService에서 사용되는 디자인 패턴

:이 "작업 큐 프로세서"패턴은 일반적으로 응용 프로그램의 메인 스레드에서 작업을 오프로드하는 데 사용됩니다. IntentService 클래스는이 패턴을 단순화하고 역학을 관리하기 위해 존재합니다. 사용하려면 IntentService를 확장하고 onHandleIntent (Intent)를 구현하십시오. IntentService는 인 텐트를 수신하고 작업자 스레드를 시작한 다음 서비스를 적절하게 중지합니다.

모든 요청은 단일 작업자 스레드에서 처리됩니다. 필요한 경우 시간이 오래 걸리고 응용 프로그램의 기본 루프를 차단하지는 않지만 한 번에 하나의 요청 만 처리됩니다.

IntentService 클래스는 단일 백그라운드 스레드에서 작업을 실행하기위한 간단한 구조를 제공합니다. 이를 통해 사용자 인터페이스의 응답성에 영향을 미치지 않으면 서 장기 실행 작업을 처리 할 수 ​​있습니다. 또한 IntentService는 대부분의 사용자 인터페이스 수명주기 이벤트의 영향을받지 않으므로 AsyncTask가 종료되는 상황에서 계속 실행됩니다.

IntentService에는 몇 가지 제한 사항이 있습니다.

사용자 인터페이스와 직접 상호 작용할 수 없습니다. 결과를 UI에 넣으려면 액티비티로 보내야합니다. 작업 요청은 순차적으로 실행됩니다. 작업이 IntentService에서 실행 중이고 다른 요청을 보내면 첫 번째 작업이 완료 될 때까지 요청이 대기합니다. IntentService에서 실행중인 작업을 중단 할 수 없습니다. 그러나 대부분의 경우

IntentService는 간단한 백그라운드 작업에 선호되는 방법입니다.

**

발리 도서관

안드로이드 네트워킹 애플리케이션 개발을위한 volley- library라는 라이브러리 가 있습니다. 소스 코드는 GitHub에서 일반인에게 공개됩니다.

백그라운드 작업에 대한 모범 사례에 대한 Android 공식 문서 : 의도 서비스, 스레드, 핸들러, 서비스에 대한 이해를 돕습니다. 또한 네트워크 작업 수행


1
포인트 대답까지 짧게 줄 수 있다면 더 좋을 수 있습니다.
eRaisedToX

12

'Android IntentService vs Service'와 같은 것을 인터넷으로 검색하여 광범위한 차이점 목록을 찾을 수 있다고 확신합니다.

예제 당 가장 중요한 차이점 중 하나는 IntentService가 완료되면 자체 종료된다는 것입니다.

몇 가지 예 (빠른 구성)가있을 수 있습니다.

IntentService : 앱을 시작할 때 많은 이미지를 다운로드하려는 경우. 일회성 프로세스이며 모든 다운로드가 완료되면 스스로 정리할 수 있습니다.

서비스 : 웹 API 호출을 통해 앱과 백엔드 간 통신에 지속적으로 사용되는 서비스입니다. 현재 작업을 마치더라도 몇 분 후에 더 많은 의사 소통을하기를 원합니다.


2
하나는 할 수 있고 다른 것은 할 수없는 예를 찾지 못했습니다. 나에게 도움이되지 않은 몇 가지 설명.
roiberg

1
이 사이트를 시도해 보면 괜찮은 예제와 함께 기본적인 안드로이드 개념에 대한 많은 설명이 있습니다. vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn

4
"사용 방법"의 또 다른 예입니다. 구체적으로 서비스를 사용할 때와 의도 한 서비스가 아닌 경우. 나에게 이론적 인 예를 제시하고 그 사용을위한 "사용 방법"또는 다른 likn에 대한 링크를 제공하지 마십시오. 나는 내가 이미 그 모든 말을 보았지만 여전히 확실하지 않은 것을 아무것도하지 않는 동안 나는 당신을 위해 "일하기"를 요구하지 않습니다.
roiberg

5
그것은 매우 중요한 차이점입니다. 당신은 서버와의 지속적인 연결을 유지하기 위해 서비스를 사용하는 경우, 예를 들어, 당신은이 모든 작업 완료 후 바로 종료 것 같이 그것을 위해 intentservice을 사용할 수 없습니다
pelotasplus

24
내가 그것을 구글 할 때, 그것은 나를 여기로 데려 온다. 이제 나는 무한 루프에 있습니다.
Lou Morda

12

IntentService

IntentService자체 스레드에서 실행됩니다. 완료되면 스스로 중지됩니다. 불을 피우고 잊어 버리십시오. 후속 통화가 대기됩니다. 통화 대기에 좋습니다. IntentService필요한 경우 여러 스레드를 회전시킬 수도 있습니다 ThreadPoolExecutor. 나는 많은 사람들이 " IntentService병렬 실행을 지원하지 않기 때문에 왜 사용 하는가"라고 물었 기 때문에 이것을 말합니다 . IntentService그냥 스레드입니다. 당신은 그 안에 필요한 모든 것을 할 수 있습니다-심지어 여러 스레드를 회전시킵니다. 유일한주의 사항은 IntentService여러 스레드를 회전하자마자 완료 된다는 것 입니다. 스레드가 다시 올 때까지 기다리지 않습니다. 이 일을 처리해야합니다. 따라서 ThreadPoolExecutor이러한 시나리오에서 사용 하는 것이 좋습니다 .

  • 동기화, 업로드 등에 좋습니다…

서비스

기본적으로 Service기본 스레드에서 실행됩니다. 작업을 수행하려면 작업자 스레드를 회전시켜야합니다. service명시 적 으로 중지해야합니다 . 앱에서 멀어지고 헤드리스를 위해 더 많이 돌아올 때에도 백그라운드에서 물건을 실행 해야하는 상황에 사용했습니다 service.

  • 필요한 경우 여러 스레드를 다시 실행할 수 있습니다.
  • 음악 플레이어와 같은 앱에 사용할 수 있습니다.

BroadcastReceivers필요한 경우 언제든지 활동과 다시 대화 할 수 있습니다 .


8

IntentService는 백그라운드 및 분리 된 스레드에서 실행해야하는 작업을 쉽게 수행 할 수 있도록 만들어진 서비스 확장입니다.

IntentService가 시작되어 스레드를 작성하고 스레드에서 해당 태스크를 실행합니다. 완료되면 모든 것을 정리합니다. IntentService의 한 인스턴스 만 동시에 실행할 수 있으며 여러 호출이 큐에 대기됩니다.

사용하기가 매우 간단하고 다운로드와 같은 많은 용도에 매우 편리합니다. 그러나보다 단순한 (간단하지 않은) 서비스를 대신 사용할 수있는 제한이 있습니다.

예를 들어, xmpp 서버에 연결되고 활동에 의해 바인딩 된 서비스는 IntentService를 사용하여 간단하게 수행 할 수 없습니다. 결국 IntentService를 무시하거나 무시하게됩니다.


백그라운드에서 실제 장기 실행 서비스를 실행하려는 대부분의 사람들은 문서가 그렇게하는 것처럼 보이기 때문에 IntentService에 대해 찾으려고 노력하지만 결국 새로운 스레드를 사용할 수 있습니다. (new Runnable ()). start (). 다시 말해, "새로운 스레드 생성"에 대해 말할 때 실제로는 실행중인 코드를 활동에서 분리하려는 경우 대부분의 사람들이하는 것처럼 보이는 별도의 프로세스 로 옮기지 않습니다. ! (단지 산란 때문에 스레드하는 것은 하나의 라이너 어쨌든입니다)
라시 킨 누넨

intentService는 스레드의 수명주기를 관리하고 스케줄러를 돕는 루퍼를 사용합니다. 또한 하나의 인스턴스 만 실행되도록하고 다른 호출을 대기시킵니다.
njzk2

5

누군가 나에게 당신이 할 수 있고 다른 방법으로 IntentService할 수없는 일의 예를 보여줄 수 있다면 service.

IntentService 장시간 청취에는 사용할 수 없습니다. 단일 시간 연산자 인 XMPP 청취자와 마찬가지로 업무를 수행하고 작별 인사를합니다.

또한 하나의 스레드 워커가 있지만 트릭을 사용하면 무제한으로 사용할 수 있습니다.


4

a Service와 an 의 주요 차이점은 IntentService다음과 같습니다.

서비스 :

1.A Service 기본적으로 A는 응용 프로그램의 기본 스레드에서 실행됩니다 (여기서는 기본 작업자 스레드가 없습니다). 따라서 사용자는 별도의 스레드를 만들고 해당 스레드에서 필요한 작업을 수행해야합니다.

2. 한 번에 여러 요청을 허용합니다. (멀티 스레딩)

IntentService :

1. 이제 IntentService기본 작업자 스레드를 사용하여 모든 작업을 수행 할 수 있습니다. 참고 사항 -구현해야합니다onHandleIntent() 당신이 배경 작업을 할 수있는 각각의 시작 요청에 대한 의도를받는 방법을.

2.하지만 한 번에 하나의 요청 만 허용합니다.


3

Android IntentService 및 서비스

1. 서비스

  • startService ()를 사용하여 서비스가 호출됩니다.
  • 모든 스레드에서 서비스를 호출 할 수 있습니다.
  • 서비스는 기본적으로 응용 프로그램의 메인 스레드에서 백그라운드 작업을 실행합니다. 따라서 응용 프로그램의 UI를 차단할 수 있습니다.
  • 여러 번 호출 된 서비스는 여러 인스턴스를 작성합니다.
  • stopSelf () 또는 stopService ()를 사용하여 서비스를 중지해야합니다.
  • Android 서비스는 병렬 작업을 실행할 수 있습니다.

2. IntentService

  • IntentService는 Intent를 사용하여 호출됩니다.
  • IntentService는 Main 스레드에서만 호출 할 수 있습니다.
  • IntentService는 백그라운드 작업을 실행하기 위해 별도의 작업자 스레드를 만듭니다.
  • 여러 번 호출 된 IntentService는 여러 인스턴스를 작성하지 않습니다.
  • 대기열이 완료되면 IntentService가 자동으로 중지됩니다. stopService () 또는 stopSelf ()를 트리거 할 필요가 없습니다.
  • IntentService에서 여러 의도 호출이 자동으로 대기되며 순차적으로 실행됩니다.
  • IntentService는 서비스와 같은 병렬 작업을 실행할 수 없습니다.

여기 에서 참조하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.