2

을 열었거나을 열었거나 기기가 일 때 특정 "긴"프로세스를 실행하는 앱이 있습니다.Android - 서비스 또는 IntentService?

프로세스는 다운로드 관리자를 통해 일정량의 다운로드를 수행하고 프로세스가 완료되면 일부 분석을 캡처하기 위해 브로드 캐스트 이벤트를 앱에 전송합니다.

내가 알다시피, 부트 브로드 캐스트 이벤트가 호출 될 때마다 Application 클래스가 intentiated (메모리에없는 경우)입니다.

Application 사용자가 앱을 열 때 클래스도 시작됩니다.

이에 따라 프로세스를 실행하는 코드는 onCreate 메서드 Application 클래스 안에 있습니다. (프로세스가 거기에서 새 스레드를 시작합니다)

그러나 "긴"프로세스는 부트 브로드 캐스트 수신기의 수명 (약 10 초?)보다 오래 걸리는 것처럼 보입니다. 따라서 앱 프로세스는 다음과 같습니다. 살해 됐어. 다운로드가 끝난 후 몇 초 후 두 번째 브로드 캐스트가 전송되고 다시 바람직하지 않은 영향으로 Application.onCreate을 다시 시작합니다.

프로세스가 단일 선형 방식으로 실행되고 다시 호출하지 않을 것으로 예상됩니다. onCreate.

이 프로세스는 한 번 발생하므로 앱을 사용하는 데 더 많은 시간을 제공하기 위해 Service을 만들려고했습니다. 그러나 프로세스가 DownloadManager에 따라 다르므로

1) handleIntent이 반환 된 후에 프로세스가 여전히 종료되기 때문에 (이해할 수 있음) IntentService을 사용하면 작동하지 않습니다. 이 프로세스는 새 스레드를 생성하여 작업이 비동기가되도록하며 전체 프로세스가 완료되기 전에 handleIntent 메서드가 반환됩니다.

2) Service을 생성해야합니까? 이것은 잠시 동안 '살아 있었'습니까? 그렇다면 프로세스가 완료된 후 중지되어야합니까?

3) 추가 질문으로 Service을 실행하면 Application 클래스가 인스턴스화되어 서비스가 중지 될 때까지 메모리에 보관됩니까?

+0

BroadcastReceiver의 onReceive 메소드를 10 초 이상 차단하고 있습니까? – waqaslam

+0

@waqaslam 아니요, BroadcastReceiver는이 프로세스와 관련하여 아무 것도 처리하지 않으며 프로세스는 Application 클래스에서 관리됩니다. – htafoya

+0

Application의'onCreate'에서 처리하는 대신 BroadcastReceiver의'onReceive' 내에'IntentService'를 생성 할 것을 제안합니다. IntentService는 백그라운드 스레드에서 실행되기 때문에 기본 UI 스레드를 차지하지 않습니다. 게다가, (대체로) 당신은 멋진 기능을 가지고 있기 때문에'JobScheduler'를 사용할 수도 있습니다. – waqaslam

답변

1

, 당신은 단지 Service 자신을 만들어야합니다. 앱이 시작되면 startService()으로 전화하십시오. ServiceonStartCommand()에서 원하는 내용을 수행하는 Thread 배경을 시작하고 START_STICKY을 반환하십시오 (중지 할 때까지 Service이 계속 실행 됨). Thread이 완료되면 Service에서 stopSelf()으로 전화하십시오.

물론 IntentService을 사용할 수 있지만이 클래스는 단지 Service의 확장 일뿐 다른 편의를 제공합니다.IntentService은 백그라운드 스레드 풀을 관리하고 작업이 종료되면 Service을 시작하고 중지합니다. 이것은 아마도 당신이 필요로하는 것에 대해 과잉 공격 일 것이지만, 원한다면 계속해서 사용하십시오. 여기서의 단점은 무시할 수 있습니다.

참고 : 어떤 이유에서인지 많은 개발자는 AsyncTask, IntentService 및 이벤트 버스와 같은 특정 "유행"솔루션을 선호합니다. 문제를 해결할 수있는 다른 방법이 많이 있습니다. 소프트웨어 개발에는 "하나의 크기가 모두 적합"하지 않습니다. </opinion>

0

의도 서비스를 계속 사용할 수 있지만 백그라운드 작업이 실행되는 동안 차단하면됩니다. 구현은 다음과 같이 일할 수 :

이 서비스에 넣어, IntentService은과 같이 일할 수 : 한 번만 이렇게하면

public class DownloadIntentService extends IntentService { 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    //get url or whatever from intent 
    //kick off async code to start the download, something like eg: 
     DownloadTask downloadTask = new DownloadTask(url); 
     downloadTask.setListener(new Listener() { 
      public void onComplete(Download download) { 
       DownloadIntentService.this.notify(); 
      } 
     } 
     downloadTask.start() 
     wait(); 

    }