을 열었거나을 열었거나 기기가 일 때 특정 "긴"프로세스를 실행하는 앱이 있습니다.Android - 서비스 또는 IntentService?
프로세스는 다운로드 관리자를 통해 일정량의 다운로드를 수행하고 프로세스가 완료되면 일부 분석을 캡처하기 위해 브로드 캐스트 이벤트를 앱에 전송합니다.
내가 알다시피, 부트 브로드 캐스트 이벤트가 호출 될 때마다 Application
클래스가 intentiated (메모리에없는 경우)입니다.
Application
사용자가 앱을 열 때 클래스도 시작됩니다.
이에 따라 프로세스를 실행하는 코드는 onCreate
메서드 Application
클래스 안에 있습니다. (프로세스가 거기에서 새 스레드를 시작합니다)
그러나 "긴"프로세스는 부트 브로드 캐스트 수신기의 수명 (약 10 초?)보다 오래 걸리는 것처럼 보입니다. 따라서 앱 프로세스는 다음과 같습니다. 살해 됐어. 다운로드가 끝난 후 몇 초 후 두 번째 브로드 캐스트가 전송되고 다시 바람직하지 않은 영향으로 Application.onCreate
을 다시 시작합니다.
프로세스가 단일 선형 방식으로 실행되고 다시 호출하지 않을 것으로 예상됩니다. onCreate
.
이 프로세스는 한 번 발생하므로 앱을 사용하는 데 더 많은 시간을 제공하기 위해 Service
을 만들려고했습니다. 그러나 프로세스가 DownloadManager에 따라 다르므로
1) handleIntent
이 반환 된 후에 프로세스가 여전히 종료되기 때문에 (이해할 수 있음) IntentService
을 사용하면 작동하지 않습니다. 이 프로세스는 새 스레드를 생성하여 작업이 비동기가되도록하며 전체 프로세스가 완료되기 전에 handleIntent
메서드가 반환됩니다.
2) Service
을 생성해야합니까? 이것은 잠시 동안 '살아 있었'습니까? 그렇다면 프로세스가 완료된 후 중지되어야합니까?
3) 추가 질문으로 Service
을 실행하면 Application
클래스가 인스턴스화되어 서비스가 중지 될 때까지 메모리에 보관됩니까?
BroadcastReceiver의 onReceive 메소드를 10 초 이상 차단하고 있습니까? – waqaslam
@waqaslam 아니요, BroadcastReceiver는이 프로세스와 관련하여 아무 것도 처리하지 않으며 프로세스는 Application 클래스에서 관리됩니다. – htafoya
Application의'onCreate'에서 처리하는 대신 BroadcastReceiver의'onReceive' 내에'IntentService'를 생성 할 것을 제안합니다. IntentService는 백그라운드 스레드에서 실행되기 때문에 기본 UI 스레드를 차지하지 않습니다. 게다가, (대체로) 당신은 멋진 기능을 가지고 있기 때문에'JobScheduler'를 사용할 수도 있습니다. – waqaslam