나는 할 수있는 일의 예를 찾고 있습니다. IntentService
할 수없는Service
있습니까?
또한 IntentService
다른 스레드에서 실행되고 Service
그렇지 않은 것으로 생각합니다. 내가 볼 수있는 한, 자체 스레드 내에서 서비스를 시작하는 것은를 시작하는 것과 같습니다 IntentService
. 그 맞습니까?
나는 할 수있는 일의 예를 찾고 있습니다. IntentService
할 수없는Service
있습니까?
또한 IntentService
다른 스레드에서 실행되고 Service
그렇지 않은 것으로 생각합니다. 내가 볼 수있는 한, 자체 스레드 내에서 서비스를 시작하는 것은를 시작하는 것과 같습니다 IntentService
. 그 맞습니까?
답변:
Tejas Lagvankar는 멋진 게시물을 작성했습니다 이 주제에 관해 . 다음은 Service와 IntentService의 주요 차이점입니다.
언제 사용합니까?
서비스는 어떤 UI와 작업에 사용할 수 있지만, 너무 오래해서는 안됩니다. 긴 작업을 수행해야하는 경우 서비스 내에서 스레드를 사용해야합니다.
IntentService은 일반적으로 주 스레드없이 통신 긴 작업에 사용할 수 있습니다. 통신이 필요한 경우 기본 스레드 핸들러 또는 브로드 캐스트 의도를 사용할 수 있습니다. 또 다른 사용 사례는 콜백이 필요한 경우입니다 (의도적으로 트리거 된 작업).
트리거하는 방법?
서비스는 메서드를 호출하여 실행됩니다 startService()
.
IntentService는 이 새 작업자 스레드를 생성합니다 및 방법은, 인 텐트를 사용하여 트리거 방식입니다 onHandleIntent()
이 스레드에서 호출됩니다.
트리거
에 실행
서비스는 백그라운드에서 실행하지만 응용 프로그램의 메인 스레드에서 실행됩니다.
IntentService은 별도의 작업자 스레드에서 실행됩니다.
한계 / 단점
서비스는 응용 프로그램의 주 스레드를 차단할 수 있습니다.
IntentService는 병렬로 작업을 실행할 수 없습니다. 따라서 모든 연속 의도는 작업자 스레드의 메시지 큐로 이동하여 순차적으로 실행됩니다.
언제 멈출 까?
당신이 구현하는 경우 서비스를 , 그것의 작업이 호출하여 수행하는 경우 서비스를 중지하는 것은 귀하의 책임입니다 stopSelf()
또는 stopService()
. 바인딩 만 제공하려는 경우이 메소드를 구현할 필요가 없습니다.
IntentService은 당신이 전화를하지 않아도되도록 모든 시작 요청이 처리 된 후 서비스를 중지합니다 stopSelf()
.
누군가 나에게 할 수 있고 다른 방법으로
IntentService
는 할 수없는 일의 예를 보여줄 수 있다면Service
.
정의 상으로는 불가능합니다. Java로 작성된 IntentService
의 하위 클래스입니다 Service
. 따라서, 아무것도이 IntentService
수행하는이 Service
코드의 해당 비트가 포함시킴으로써, 할 수있는 IntentService
용도.
자체 스레드로 서비스를 시작하는 것은 IntentService를 시작하는 것과 같습니다. 그렇지 않습니까?
의 세 가지 주요 기능은 다음 IntentService
과 같습니다.
백그라운드 스레드
의 자동 큐잉으로 Intent
전달 onStartCommand()
되므로 백그라운드 스레드에서 하나 Intent
를 처리하는 onHandleIntent()
경우 다른 명령은 차례를 대기합니다.
대기열이 비면를 IntentService
호출 하여을 자동으로 종료stopSelf()
Service
확장없이 확장 하여 구현할 수 있습니다 IntentService
.
Service
호출 startService
만 ANR--을 던지기 전에 약 10 초 동안 작동 할 수있는 IntentService
이러한 제한이 보이지 않는 의도를 방송 시작
onStartCommand()
(A)의는 Service
, 기본 응용 프로그램 스레드에서 호출된다. UI를 정지시키지 않고이 스레드를 몇 밀리 초 이상 연결할 수 없으며, 몇 초가 걸리면 ANR과 동등한 서비스를 얻게됩니다.
onStartCommand
대신 작업을 수행했습니다 .UI 스레드에서 실행되는 onHandleIntent
것처럼 보이지만 onStartCommand
별도의 스레드가 onHandleIntent
실행되도록 생성됩니다 .
IntentService
후 자체적으로 호출합니다 onHandleIntent()
.
서비스
startService()
Thread
Main Thread
stopSelf()
또는stopService()
IntentService
Handler
또는BroadcastReceiver
Intent
Main Thread
IntentService 는 의도적으로 동일한 목적 으로 만들어진 서비스 클래스를 확장 합니다.IntentService
그래서 목적은 무엇입니까?
`IntentService의 목적은 걱정없이 백그라운드 작업을보다 쉽게 실행할 수 있도록하는 것입니다.
작업자 스레드 생성
다중 요청 처리를 하나씩 큐잉 ( Threading
)
Service
따라서 NO 는 Service
할 수있는 모든 작업을 수행 IntentService
할 수 있습니다. 요구 사항이 위에서 언급 한 기준에 해당되는 경우 해당 논리를 Service
클래스 에 작성할 필요가 없습니다 . 발명 된 바퀴이기 때문에 바퀴를 재발 명하지 마십시오 IntentService
.
서비스는 UI 스레드에서 실행되는 반면 IntentService는 별도의 스레드에서 실행됩니다.
활동의 범위를 넘어 존재하는 여러 백그라운드 작업을 하나씩 수행하려면 IntentService
완벽합니다.
IntentService
만들어 지는가Service
UI 스레드에서 정상적인 서비스가 실행 (기본 예에 의한 UI 스레드에서 모든 안드로이드 구성 요소 유형의 실행 Activity
, BroadcastReceiver
, ContentProvider
및 Service
). 완료하는 데 시간이 걸릴 수있는 작업을 수행해야하는 경우 스레드를 작성해야합니다. 여러 요청의 경우을 처리해야 synchronization
합니다.
IntentService
이러한 작업을 수행하는 기본 구현이 제공됩니다. 개발자 페이지
에 따르면
IntentService
작업자 스레드를 만듭니다.
IntentService
onHandleIntent()
메소드에 하나씩 요청을 보내는 작업 큐를 작성합니다.
IntentService
호출 stopSelf()
합니다.onBind()
null 인 메소드에 대한 기본 구현을 제공합니다.onStartCommand()
전송 Intent
이 Workqueue에 결국에 요청onHandleIntent()
허용 된 답변에 포인트 추가 :
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 공식 문서 : 의도 서비스, 스레드, 핸들러, 서비스에 대한 이해를 돕습니다. 또한 네트워크 작업 수행
'Android IntentService vs Service'와 같은 것을 인터넷으로 검색하여 광범위한 차이점 목록을 찾을 수 있다고 확신합니다.
예제 당 가장 중요한 차이점 중 하나는 IntentService가 완료되면 자체 종료된다는 것입니다.
몇 가지 예 (빠른 구성)가있을 수 있습니다.
IntentService : 앱을 시작할 때 많은 이미지를 다운로드하려는 경우. 일회성 프로세스이며 모든 다운로드가 완료되면 스스로 정리할 수 있습니다.
서비스 : 웹 API 호출을 통해 앱과 백엔드 간 통신에 지속적으로 사용되는 서비스입니다. 현재 작업을 마치더라도 몇 분 후에 더 많은 의사 소통을하기를 원합니다.
IntentService
자체 스레드에서 실행됩니다. 완료되면 스스로 중지됩니다. 불을 피우고 잊어 버리십시오. 후속 통화가 대기됩니다. 통화 대기에 좋습니다. IntentService
필요한 경우 여러 스레드를 회전시킬 수도 있습니다 ThreadPoolExecutor
. 나는 많은 사람들이 " IntentService
병렬 실행을 지원하지 않기 때문에 왜 사용 하는가"라고 물었 기 때문에 이것을 말합니다 .
IntentService
그냥 스레드입니다. 당신은 그 안에 필요한 모든 것을 할 수 있습니다-심지어 여러 스레드를 회전시킵니다. 유일한주의 사항은 IntentService
여러 스레드를 회전하자마자 완료 된다는 것 입니다. 스레드가 다시 올 때까지 기다리지 않습니다. 이 일을 처리해야합니다. 따라서 ThreadPoolExecutor
이러한 시나리오에서 사용 하는 것이 좋습니다 .
기본적으로 Service
기본 스레드에서 실행됩니다. 작업을 수행하려면 작업자 스레드를 회전시켜야합니다. service
명시 적 으로 중지해야합니다 . 앱에서 멀어지고 헤드리스를 위해 더 많이 돌아올 때에도 백그라운드에서 물건을 실행 해야하는 상황에 사용했습니다 service
.
BroadcastReceivers
필요한 경우 언제든지 활동과 다시 대화 할 수 있습니다 .
IntentService는 백그라운드 및 분리 된 스레드에서 실행해야하는 작업을 쉽게 수행 할 수 있도록 만들어진 서비스 확장입니다.
IntentService가 시작되어 스레드를 작성하고 스레드에서 해당 태스크를 실행합니다. 완료되면 모든 것을 정리합니다. IntentService의 한 인스턴스 만 동시에 실행할 수 있으며 여러 호출이 큐에 대기됩니다.
사용하기가 매우 간단하고 다운로드와 같은 많은 용도에 매우 편리합니다. 그러나보다 단순한 (간단하지 않은) 서비스를 대신 사용할 수있는 제한이 있습니다.
예를 들어, xmpp 서버에 연결되고 활동에 의해 바인딩 된 서비스는 IntentService를 사용하여 간단하게 수행 할 수 없습니다. 결국 IntentService를 무시하거나 무시하게됩니다.
누군가 나에게 당신이 할 수 있고 다른 방법으로
IntentService
할 수없는 일의 예를 보여줄 수 있다면service
.
IntentService
장시간 청취에는 사용할 수 없습니다. 단일 시간 연산자 인 XMPP 청취자와 마찬가지로 업무를 수행하고 작별 인사를합니다.
또한 하나의 스레드 워커가 있지만 트릭을 사용하면 무제한으로 사용할 수 있습니다.
a Service
와 an 의 주요 차이점은 IntentService
다음과 같습니다.
서비스 :
1.A Service
기본적으로 A는 응용 프로그램의 기본 스레드에서 실행됩니다 (여기서는 기본 작업자 스레드가 없습니다). 따라서 사용자는 별도의 스레드를 만들고 해당 스레드에서 필요한 작업을 수행해야합니다.
2. 한 번에 여러 요청을 허용합니다. (멀티 스레딩)
IntentService :
1. 이제 IntentService
기본 작업자 스레드를 사용하여 모든 작업을 수행 할 수 있습니다. 참고 사항 -구현해야합니다onHandleIntent()
당신이 배경 작업을 할 수있는 각각의 시작 요청에 대한 의도를받는 방법을.
2.하지만 한 번에 하나의 요청 만 허용합니다.
Android IntentService 및 서비스
1. 서비스
2. IntentService
여기 에서 참조하십시오
IntentService is used for short tasks (etc) and a service is for long ones
어디서 읽었습니까?