Android 서비스가 여러 번 시작되면 어떻게 되나요?


120

다음 코드가있는 경우 :

Intent intent = new Intent(this,DownloadService.class);     
for(int i=0;i<filesArray.length;i++){        
     startService(intent);          
}

이 코드에서 DownloadService확장합니다 IntentService.

이제 호출 할 때 호출 할 때 startService(intent)마다 새 서비스를 시작 startService(intent)한다는 의미인지 아니면 DownloadService한 번 실행되고 호출 startService(intent)할 때마다 다른 startId로 다른 인 텐트를 전달 한다는 의미 입니까?

이게 말이 되나요?이 중 어느 것이 사실인가요?

답변:


167

서비스는 하나의 인스턴스에서만 실행됩니다. 그러나 서비스를 시작할 때마다 onStartCommand()메서드가 호출됩니다.

여기에 설명되어 있습니다.


1
감사. 또한 "startService () 메서드가 즉시 반환되고 Android 시스템이 서비스의 onStartCommand () 메서드를 호출합니다. 서비스가 아직 실행되고 있지 않으면 시스템이 먼저 onCreate ()를 호출 한 다음 onStartCommand ()를 호출합니다."라고 말합니다. 따라서 서비스가 이미 실행중인 경우 시스템은 onCreate () 메서드를 건너 뛰고 onStartCommand () 만 호출합니다.
bytebiscuit 2011

나는 정말로 모른다. 그러나 나는 그것이 사실이라고 확신한다 ( onCreate()서비스가 이미 생성 되었다면 전화하지 말아야 할 많은 sence를 만든다 ). Log.i()두 콜백 모두에을 입력하고 LogCat 을 확인하는지 쉽게 확인할 수 있습니다 .
Philipp Wendt 2011

방금 그랬고 ... 이상하게도 마지막 startService () 호출 후 onCreate를 시작합니다!
bytebiscuit 2011

15
startService()비동기식 이기 때문 입니다. 따라서 호출을 반복하는 동안 서비스 자체는 리소스를 얻지 못했고 아직 시작되지 않았습니다.
Philipp Wendt

1
@neelabh는 "즉시"가 아닙니다. 서비스를 시작하는 데 약간의 시간이 걸리고 "for"루프가 계속 실행 중이고 서비스를 반복해서 호출하므로 첫 번째 시도에서 아직 실행중인 서비스를 찾지 못할 것입니다. 따라서 startService () 메서드는 서비스 시작이 완료 될 때까지 두 번 호출됩니다. 나의 나쁜 영어를 용서하십시오.
mzalazar 2016

21

절대적으로 정확합니다. 애플리케이션 프로세스에 대해 하나의 서비스 인스턴스 만 생성됩니다. 그리고 StartService();다시 호출 onStartCommand()하면 호출되고 새로운 Intent가 onStartCommand()메서드에 전달됩니다 .

참고 : onCreate() 다시 호출되지 않습니다.

bindService()여러 번 전화 하는 방법 :

bindService()여러 번 호출하면 다시 하나의 인스턴스 만 서비스에 사용되며 Android 런타임은 동일한 IBinder 객체를 클라이언트에 반환합니다.

의미 onBind()는 여러 번 호출되지 않습니다. 그리고 캐시 된 IBinder 객체가 반환됩니다.


onStop()해당하는 모든 항목에 대해 호출해야 합니까 onStartCommand?
IgorGanapolsky

6
@IgorGanapolsky : 우선 Service에는 이러한 콜백 메소드 onStop ()이 없습니다. 서비스를 중지하려면 stopService () 또는 stopSelf ()를 호출해야합니다. 그리고 onStartCommand ()가 여러 인 텐트에 대해 여러 번 호출 된 경우 stopSelf () 또는 stopService ()를 한 번만 호출하면됩니다. IntentService를 사용하는 경우 onHandleIntent ()에서 요청의 시작 ID를 전달하여 stopSelfResult (int id)를 호출해야합니다. 그러면 IntentService의 작업 대기열에 있던 해당 시작 ID 요청이 중지됩니다. 도움이 되었기를 바랍니다.
Anish Mittal

8

위의 답변에 다른 사람들에게 도움이 될 수있는 정보를 더 추가 startId하면 onStartCommand()메서드가 모든 startService()호출에 대해 수신 하는 방법이 다르다는 것입니다 .

또한 위에서 언급 한대로 for 루프를 작성하면 작성된 코드가 onHandleIntent()for 루프 주파수에 정의 된대로 여러 번 실행되지만 병렬이 아닌 순서대로 실행됩니다.

개념은 IntentService작업 대기열과 startService()트리거 onStartCommand()할 각 요청을 생성하여 작업 대기열 에 인 텐트를 저장 한 다음 인 텐트를 하나씩 전달하는 것 onHandleIntent()입니다.


2

문서 에 따르면 :

startService () 메서드는 즉시 반환되고 Android 시스템은 서비스의 onStartCommand () 메서드를 호출합니다. 서비스가 아직 실행 중이 아니면 시스템은 먼저 onCreate ()를 호출 한 다음 onStartCommand ()를 호출합니다.

서비스 시작에 대한 여러 요청으로 인해 서비스의 onStartCommand ()에 대한 해당 호출이 여러 번 발생합니다. 그러나 서비스를 중지하려면 한 번만 서비스 중지 요청 (stopSelf () 또는 stopService () 사용)이 필요합니다.

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