Android 플랫폼의 서비스 대 IntentService
저는 그것으로 할 수 있는 어떤 것의 예를 찾고 있습니다.IntentService
▁a▁로 할 수 없는 일입니다.Service
(그리고 그 반대)?
나는 또한 그것을 믿습니다.IntentService
다른 스레드에서 실행되며Service
하지않다. 제가은 따서, 보기에, 스드내서에, 비시서를같을 시작하는 것과 같습니다.IntentService
맞습니까?그것이 맞습니까?
테하스 라그반카르는 이 주제에 대해 좋은 글을 썼습니다.다음은 서비스와 IntentService의 몇 가지 주요 차이점입니다.
언제 사용해야 합니까?
이 서비스는 UI 없이 작업에서 사용할 수 있지만 너무 길면 안 됩니다.긴 작업을 수행해야 하는 경우 서비스 내에서 스레드를 사용해야 합니다.
IntentService는 일반적으로 메인 스레드와 통신하지 않고 긴 작업에서 사용할 수 있습니다.통신이 필요한 경우 주 스레드 처리기 또는 브로드캐스트 의도를 사용할 수 있습니다.콜백이 필요한 경우(의도적으로 트리거된 태스크)도 사용할 수 있습니다.
어떻게 작동합니까?
서비스가 호출 메서드에 의해 트리거되었습니다.
startService()
.IntentService가 Intent를 사용하여 트리거되면 새 작업자 스레드와 메서드가 생성됩니다.
onHandleIntent()
이 스레드에서 호출됩니다.
트리거된 원본
- 서비스 및 인텐트 서비스는 모든 스레드, 활동 또는 기타 응용 프로그램 구성 요소에서 트리거될 수 있습니다.
실행 시간
서비스는 백그라운드에서 실행되지만 응용 프로그램의 메인 스레드에서 실행됩니다.
IntentService는 별도의 작업자 스레드에서 실행됩니다.
제한 사항/단점
서비스는 응용프로그램의 주 스레드를 차단할 수 있습니다.
IntentService는 작업을 병렬로 실행할 수 없습니다.따라서 모든 연속적인 의도는 작업자 스레드에 대한 메시지 큐에 들어가고 순차적으로 실행됩니다.
언제 멈출까요?
서비스를 구현하는 경우, 서비스가 완료되면 서비스를 중지하는 것은 귀하의 책임입니다.
stopSelf()
또는stopService()
바인딩만 제공하려는 경우에는 이 방법을 구현할 필요가 없습니다.IntentService는 모든 시작 요청이 처리된 후 서비스를 중지하므로 전화를 걸 필요가 없습니다.
stopSelf()
.
만약 누군가가 나에게 할 수 있는 것의 예를 보여줄 수 있다면,
IntentService
그리고 그것으로 끝낼 수 없습니다.Service
그리고 그 반대입니다.
정의에 따르면, 그것은 불가능합니다. IntentService
의 하위 클래스입니다.Service
자바로 쓰여진.러므로든, 이엇무그는 어떤 것이든 .IntentService
렇다그, a,Service
코드의 관련 비트를 포함함으로써 할 수 있습니다.IntentService
사용하다.
자체 스레드로 서비스를 시작하는 것은 IntentService를 시작하는 것과 같습니다.아니에요?
의 3 지주특의 세 IntentService
다음과 같습니다.
백그라운드 스레드
의 자동
Intent
로배된달로 되었습니다.onStartCommand()
그래서 만약에Intent
에 의해 .onHandleIntent()
스레드에서는 이 차례를 대기열을 .의 자동
IntentService
에의전로로stopSelf()
이 모든 것은 다음과 같이 구현될 수 있습니다.Service
연장하지 IntentService
.
서비스
- 에 의해
startService()
- 임의의 의서트거에서
Thread
- 행실시에서 됩니다.
Main Thread
- 메인(UI) 스레드를 차단할 수 있습니다.긴 작업에는 항상 서비스 내에서 스레드 사용
- 작업이 완료되면 전화를 걸어 서비스를 중지하는 것이 당사의 책임은 다음과 같습니다.
stopSelf()
또는stopService()
인텐트 서비스
- 합니다. 한 경우 메인 긴작을수다에 의해 됩니다. 일반적으로 통신이 필요한 경우 메인 스레드와 통신하지 않습니다.
Handler
또는BroadcastReceiver
- 를 통해
Intent
- 에서
Main Thread
- 별도의 스레드에서 실행됩니다.
- 작업을 병렬로 실행할 수 없으며 여러 개의 의도가 동일한 작업자 스레드에서 대기 중입니다.
바퀴를 다시 만들지 마.
IntentService는 서비스 클래스를 확장합니다. 이는 다음을 의미합니다.IntentService
의도적으로 같은 목적으로 만들어졌습니다.
그렇다면 목적은 무엇일까요?
"IntentService의 목적은 백그라운드 작업을 더 쉽게 실행할 수 있도록 하는 것입니다.
작업자 스레드 생성
중인 다중 큐잉(Queping (다중 요청)
Threading
)- 를
Service
그래서 안 돼요.Service
는 떤일든할수있다니습이 하는 할 수 .IntentService
할 수 있습니다.만약 당신의 요구사항이 위에서 언급한 기준에 해당한다면, 당신은 그러한 논리를 다음과 같이 쓸 필요가 없습니다.Service
ㅠㅠ 때문에 를 다시 그러니까 바퀴를 다시 만들지 마. 왜냐하면IntentService
발명된 바퀴입니다.
"주요" 차이점
서비스는 UI 스레드에서 실행되고 IntentService는 별도의 스레드에서 실행됩니다.
IntentService는 언제 사용합니까?
하고자 할 에는 " " " " "라는 단어를 사용합니다.IntentService
완벽합니다.
어떻게.IntentService
으로 .Service
요소 됨).Activity
,BroadcastReceiver
,ContentProvider
그리고.Service
데이 걸릴 수 완료하는 데 시간이 걸릴 수 있는 작업을 수행해야 하는 경우 스레드를 생성해야 합니다.개의 이 있을 , ▁with,▁in다▁have▁will를 처리해야 합니다.synchronization
.IntentService
이러한 작업을 수행하는 몇 가지 기본 구현이 제공됩니다.
개발자 페이지에 따름
IntentService
Thread를 만듭니다.IntentService
보내는 작업 을 만듭니다.onHandleIntent()
하나씩- 는 그는일없때입니다을이때▁when다때니.
IntentService
출들stopSelf()
방법 - 에 대한 기본 합니다.
onBind()
null인는 null입니다. - 기본 구현:
onStartCommand()
는 것을 보냅니다.Intent
에 요청합니다.onHandleIntent()
승인된 답변에 포인트 추가:
Android API 내에서 IntentService의 사용법을 확인하십시오.예:
public class SimpleWakefulService extends IntentService {
public SimpleWakefulService() {
super("SimpleWakefulService");
}
@Override
protected void onHandleIntent(Intent intent) { ...}
앱에 대한 IntentService 구성 요소를 만들려면 IntentService를 확장하는 클래스를 정의하고 이 클래스 내에서 HandleIntent()를 재정의하는 메서드를 정의합니다.
또한 IntentService의 소스 코드, 생성자 및 onStartCommand와 같은 수명 주기 방법을 참조하십시오.
@Override
public int More ...onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
비동기 작업을 함께 서비스하는 것은 페이로드가 크지 않은 많은 사용 사례에서 가장 좋은 방법 중 하나입니다.또는 IntentService를 확장하는 클래스를 만듭니다.Android 버전 4.0부터는 모든 네트워크 작업이 백그라운드 프로세스에 있어야 합니다. 그렇지 않으면 응용 프로그램 컴파일/빌드가 실패합니다. UI에서 스레드를 분리합니다.비동기 작업 클래스는 UI 스레드에서 새 작업을 실행하는 가장 간단한 방법 중 하나를 제공합니다.이 주제에 대한 자세한 내용은 블로그 게시물을 참조하십시오.
Android 개발자 가이드:
IntentService는 요청 시 비동기 요청(Intent로 표시됨)을 처리하는 서비스의 기본 클래스입니다.클라이언트는 startService(Intent) 호출을 통해 요청을 전송합니다. 서비스는 필요에 따라 시작되고 작업 스레드를 사용하여 각 Intent를 처리하며 작업량이 부족하면 자동으로 중지됩니다.
IntentService에서 사용되는 설계 패턴
이 "작업 대기열 프로세서" 패턴은 일반적으로 응용프로그램의 기본 스레드에서 작업을 오프로드하는 데 사용됩니다.IntentService 클래스는 이 패턴을 단순화하고 메커니즘을 관리하기 위해 존재합니다.이를 사용하려면 IntentService를 확장하고 HandleIntent(Intent)에 구현합니다.IntentService는 Intents를 수신하고 작업자 스레드를 시작한 다음 적절한 경우 서비스를 중지합니다.
모든 요청은 단일 작업자 스레드에서 처리됩니다. 필요한 만큼 오래 걸릴 수 있으며(애플리케이션의 기본 루프를 차단하지 않을 것입니다), 한 번에 하나의 요청만 처리됩니다.
IntentService 클래스는 단일 백그라운드 스레드에서 작업을 실행하기 위한 간단한 구조를 제공합니다.이를 통해 사용자 인터페이스의 응답성에 영향을 주지 않고 장시간 실행되는 작업을 처리할 수 있습니다.또한 IntentService는 대부분의 사용자 인터페이스 수명 주기 이벤트의 영향을 받지 않으므로 비동기 작업을 종료할 수 있는 상황에서 계속 실행됩니다.
IntentService에는 몇 가지 제한이 있습니다.
사용자 인터페이스와 직접 상호 작용할 수 없습니다.결과를 UI에 넣으려면 해당 결과를 활동으로 보내야 합니다.작업 요청은 순차적으로 실행됩니다.작업이 IntentService에서 실행 중인 경우 다른 요청을 보내면 요청은 첫 번째 작업이 완료될 때까지 기다립니다.IntentService에서 실행 중인 작업은 중단될 수 없습니다.그러나 대부분의 경우
IntentService는 단순한 백그라운드 작업에서 선호되는 방법입니다.
**
발리 도서관
안드로이드 네트워킹 애플리케이션을 개발하기 위한 발리 라이브러리라는 라이브러리가 있습니다. 소스 코드는 깃허브에서 일반인에게 제공됩니다.
백그라운드 작업 모범 사례에 대한 안드로이드 공식 문서: 의도 서비스, 스레드, 핸들러, 서비스를 더 잘 이해하는 데 도움이 됩니다.및 네트워크 작업 수행
'Android Intent Service vs Service'와 같은 것을 구글에 검색하면 광범위한 차이점 목록을 찾을 수 있을 것입니다.
사례별로 가장 중요한 차이점 중 하나는 IntentService가 완료되면 자동으로 종료된다는 것입니다.
몇 가지 예를 들 수 있습니다(빠른 시일 내에 작성).
인텐트 서비스:앱을 열기 시작할 때 여러 이미지를 다운로드하고 싶다면,이것은 일회성 프로세스이며 모든 것이 다운로드되면 스스로 정리할 수 있습니다.
서비스:웹 API 호출로 앱과 백엔드 간의 통신에 지속적으로 사용되는 서비스입니다.현재 작업이 완료되더라도 몇 분 후에는 더 많은 통신을 위해 작업을 수행해야 합니다.
인텐트 서비스
IntentService
자체 스레드에서 실행됩니다.그것이 완성되면 저절로 멈출 것입니다.불과 망각에 가깝습니다.다음 통화는 대기열에 들어갑니다.통화 대기열에 적합합니다.여러분은 러개의스회수있도다습니전할 내에서 여러 시킬 수 .IntentService
필요한 경우 - 다음을 사용하여 이를 달성할 수 있습니다.ThreadPoolExecutor
말하는 사람들이 "왜 왜은사저에게 "까사합니 용많이 들람?"왜 까니합▁use▁i?"라고 물었기 입니다.라고 물었기 때문에 저는IntentService
병렬 실행을 지원하지 않기 때문입니다." IntentService
그냥 실타래야.내부에서 필요한 것은 무엇이든 할 수 있습니다. 여러 개의 스레드를 회전시키는 것도 가능합니다.단 한가지 주의할 점은IntentService
여러 스레드를 회전하면 바로 종료됩니다.그 실들이 돌아오기를 기다리지 않습니다.당신은 이 일을 처리해야 합니다.그래서 저는 사용을 추천합니다.ThreadPoolExecutor
그런 시나리오에서.
- 동기화, 업로드 등에 적합합니다.
서비스
으로 기값Service
메인 스레드에서 실행됩니다.당신은 당신의 일을 하기 위해 일손을 돌려야 합니다.은 .service
ㅠㅠㅠㅠㅠㅠㅠ 앱에서 로 더 많이 올 에 사용했어요.service
.
- 필요한 경우 다시 여러 스레드를 실행할 수 있습니다.
- 음악 플레이어와 같은 앱에 사용할 수 있습니다.
은 항상 다음을사언활다수있연다습니락시할동에지제든을 사용하여 할 수 .BroadcastReceivers
필요하다면,
IntentService는 백그라운드에서 별도의 스레드에서 실행해야 하는 작업을 쉽게 실행할 수 있도록 만들어진 서비스의 확장입니다.
IntentService가 시작되고 스레드를 생성한 후 스레드에서 작업을 실행합니다.일단 완성되면, 그것은 모든 것을 청소합니다.동시에 하나의 IntentService 인스턴스만 실행할 수 있으며 여러 호출이 대기열에 들어갑니다.
이것은 사용하기 매우 간단하고 예를 들어 물건을 다운로드하는 등 많은 용도로 매우 편리합니다.그러나 사용자가 더 기본적인(단순하지 않은) 서비스를 대신 사용하기를 원할 수 있는 한계가 있습니다.
예를 들어 xmpp 서버에 연결되고 활동에 의해 바인딩된 서비스는 IntentService를 사용하여 간단히 수행할 수 없습니다.결국 IntentService 항목을 무시하거나 재정의하게 됩니다.
안드로이드 인텐트 서비스 대 서비스
1.서비스
- 서비스는 startService()를 사용하여 호출됩니다.
- 모든 스레드에서 서비스를 호출할 수 있습니다.
- 서비스는 기본적으로 응용프로그램의 주 스레드에서 백그라운드 작업을 실행합니다.따라서 응용프로그램의 UI를 차단할 수 있습니다.
- 서비스가 여러 번 호출되면 여러 인스턴스가 생성됩니다.
- stopSelf() 또는 stopService()를 사용하여 서비스를 중지해야 합니다.
- Android 서비스는 병렬 작업을 실행할 수 있습니다.
인텐트 서비스
- IntentService는 Intent를 사용하여 호출됩니다.
- IntentService는 메인 스레드에서만 호출할 수 있습니다.
- IntentService는 백그라운드 작업을 실행하기 위해 별도의 작업자 스레드를 만듭니다.
- IntentService를 여러 번 호출해도 여러 인스턴스가 생성되지 않습니다.
- 대기열이 완료된 후 IntentService가 자동으로 중지됩니다.stopService() 또는 stopSelf()를 트리거할 필요가 없습니다.
- IntentService에서 여러 의도 호출은 자동으로 대기열에 추가되며 순차적으로 실행됩니다.
- IntentService는 서비스처럼 병렬 작업을 실행할 수 없습니다.
여기서 참조
누군가가 당신이 할 수 있는 일의 예를 보여줄 수 있다면,
IntentService
그리고 그것으로 끝낼 수 없습니다.service
그리고 그 반대입니다.
IntentService
장시간 청취에는 사용할 수 없습니다. 단일 시간 연산자인 XMPP 청취자의 경우처럼 작업을 수행하고 손을 흔들어 작별 인사를 합니다.
또한 스레드워커는 1명이지만, 트릭을 사용하면 무제한으로 사용할 수 있습니다.
A의 주요 차이점Service
그리고IntentService
설명은 다음과 같습니다.
서비스:
1.AService
기본적으로 응용 프로그램의 기본 스레드에서 실행됩니다.(여기서는 기본 작업자 스레드를 사용할 수 없습니다.)따라서 사용자는 별도의 스레드를 생성하고 해당 스레드에서 필요한 작업을 수행해야 합니다.
2.한 번에 여러 요청을 허용합니다.(멀티 스레드)
인텐트 서비스:
1번으로 .이제,IntentService
여기서는 기본 작업자 스레드를 사용하여 모든 작업을 수행할 수 있습니다.참고 - 구현해야 합니다.onHandleIntent()
메서드는 백그라운드 작업을 수행할 수 있는 각 시작 요청에 대한 의도를 수신합니다.
2.하지만 한 번에 하나의 요청만 허용합니다.
언급URL : https://stackoverflow.com/questions/15524280/service-vs-intentservice-in-the-android-platform
'programing' 카테고리의 다른 글
data.frame을 와이드 형식에서 롱 형식으로 재구성 (0) | 2023.06.05 |
---|---|
Android의 Firebase Google Authentication에서 사용자가 처음으로 인증되었는지 확인합니다. (0) | 2023.06.05 |
R이 지수 표기법(예: e+10)을 사용하지 않도록 강제합니까? (0) | 2023.06.05 |
Firebase 쿼리 "IN" 제한을 10으로 설정할 수 있는 해결 방법이 있습니까? (0) | 2023.06.05 |
노드를 제거합니다.Linux 명령줄을 사용하는 JS? (0) | 2023.05.31 |