2011-09-06 5 views
15

내가 의도 서비스 ("은 DownloadService") 배경, 인터넷에서안드로이드 : intentservice, 중단 또는 handleintent 큐에서 작업을 생략하는 방법

intentService 다운로드 파일을 호출 활동 ("ApplicationActivity")를 가지고 있지만 파일 1,2,3,4,5

목적 : 난 그럼 내가 대기열에 5 개 개의 파일을 넣어 가정 해 봅시다 ......... 특정 다운로드를 중단 할 수

을 원하는 서비스 번호 1을 다운로드 한 다음 두 번째 등등을 다운로드하십시오. 1) 의도 서비스에 대해 말할 방법이 있습니까? 메소드 핸들 이벤트 (이 경우 파일 1을 다운로드)를 실행하고 다음 다운로드를 시작 하시겠습니까?

2) 대기열에서 요소를 제거 할 수 있습니까? 예를 들어 파일 1을 다운로드하는 동안 대기열에서 파일 4를 제거하여 번호 3 이후에 파일을 5로 바로 이동 시키십시오.

+0

지금도 나는 똑같은 것을 원한다. 문제가 해결 되었습니까? –

답변

12

내가 만들 꽤 짧은 원래이 필요하고 수정할 수 있습니다 무엇 빠른 튜토리얼 내 자신의 목적을위한 메소드 호출하기 ........ 특히 내 경우에 ServiceHandler 메소드를 사용할 수있는 요소를 큐에서 제거하기
mServiceHandler.removeMessages (appId);
that 메시지 대기열에있는 특정 코드 'what'이있는 보류중인 메시지 게시물을 제거하십시오. 즉, 대기열에 추가하는 각 메시지의 레이블을 지정해야하며 각 메시지의 "what"필드에 식별자를 추가해야합니다. ....

public void onStart(Intent intent, int startId) 
{ 
    super.onStart(intent, startId); 
    Message msg = mServiceHandler.obtainMessage(); 
    msg.arg1 = startId; 
    msg.obj = intent; 
    msg.what = intent.getIntExtra("appId", 0); \\parameters that come from the outside 
+0

내 이해를 위해 전체 코드를 게시 할 수 있습니까? –

1

당신은 intentservice에 결합 할 수

은 곧, 나는이 2 개 개의 간단한 작업을 수행 할 수있는 큐와 함께 comunicate 수있는 방법이 필요합니다,하지만 난 인터넷 :(

TNX에 아무것도 유용을 찾을 수 없습니다 취소 드 queu 다운로드하는 방법을 만들 수 있습니다.

Here 당신이 내 자신의 MyIntentService 클래스 복사

+0

나는 빨리 동굴을 읽었지 만 내 경우에는 그것이 얼마나 유용 할 지 이해할 수 없다 ..... 그것은 서비스와 의도 된 서비스가 아니라 ....... 다른 목적을 위해서이다. ... 내 문제는 의도 서비스 클래스가 대기열로 전화 걸기위한 어떤 방법도 제공하지 않는다는 것입니다. 생각할 수있는 유일한 것은 intentService 클래스를 복사하여 붙여 넣는 것입니다. ... – Sgotenks

+0

안녕하세요. intentservice 그것 서비스의 기본 클래스. 여전히 바인딩을 할 수 있습니다. 바인드는 서비스와 상호 작용하기위한 것입니다. 그래서 당신이 큐 객체를 가지고 있다면 bind 나 stopcurrent 나 dequeu 메쏘드를 가질 수 있습니다. 어떤 플래그를 설정하거나 파일을 dequeue 할 수 있습니다. – Pintac

19

감사 user280560 @ 예를 들어, 당신의 코멘트 : 나는 어떤 경우에 대기열을 취소 싶었던

그냥 좀 더 구체적인 예를 제공하는 기반으로하는 솔루션을 발견했다.

처음으로 IntentService.java 소스를 here에서 내 프로젝트로 복사했습니다. 이름을 변경할 필요가 없으며 IntentService.java를 유지하면서 Android는 가져 오지 않고 가져올 수 있습니다. 그럼 난 내 IntentService 원이

public void clearQueue() { 
    Debug.PrintInfo(TAG, "All requests removed from queue"); 
    mServiceHandler.removeMessages(0); 
} 

을 추가했다.

지금, IntentService를 확장 내 서비스에서, 나는 특정 행동 (로그인)이 서비스에 전달 될 때 큐를 취소하고 싶었다, 그래서 나는이처럼 onStartMethod를 오버라이드 (override) : 같은

@Override 
public void onStart(Intent intent, int startId) { 
    if(intent.getAction().equals(ACTION_LOGIN)) { 
     //Login clears messages in the queue 
     clearQueue(); 
    } 
    super.onStart(intent, startId); 
} 

작품을 매력 :

가 누군가를 도움이되기를 바랍니다 ...

+1

잘 했어. 작업 실행을 중지하거나 대기중인 작업을 중지합니까? – vandzi

+0

작동을 멈추지 않는다고 생각합니다. 시험 같은 건 없어요. 원래 IntentService 소스를 조금 더 수정하면 아마도이를 달성 할 수있을 것입니다. –

+5

값이 0이라고 가정하는 대신 메시지의'what' 필드를 명시 적으로 지정해야합니다.'what'은 소스에서 사용되지 않으므로 사용자 자신의 용도로 사용하는 것이 안전해야합니다. –

4

는 IntentService 클래스를 확장하고 그것을 취소 된 항목의 목록을 선언하고 취소 할 때마다 무언가가이 목록에 추가합니다. 마침내 의도를 처리하기 전에 취소되지 않았는지 확인하십시오!

public class MyDownloadService extends IntentService { 
    private static List<String> canceledUrl; 

    public static void cancelDownload(String url){ 
     canceledUrl.add(url); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if (intent != null) { 
      final String url = intent.getStringExtra(EXTRA_URL); 

      if(!canceledUrl.contains(url)) //if download has not been canceled already 
       downloadFile(url); 
      else 
       canceledUrl.remove(url); 
     } 
    } 
} 

나는이 코드가 내가 전에 테스트했기 때문에 작동한다는 것을 알고 있지만, 제대로 할 방법이 확실치 않습니다.

+0

이것은 이미 실행중인 서비스를 중지하지 않습니다. 그 외에도 이것은 좋은 솔루션입니다. –

0

위와 같이 @JeffreyBlattman 말했다, 할당하여 안전 재생이

@Override 
    public void onStart(@Nullable Intent intent, int startId) { 
     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     msg.obj = intent; 
     msg.what = 0; 
     mServiceHandler.sendMessage(msg); 
    } 

같은 메시지에 "무엇을"값을 자신과 mServiceHandler.removeMessages(0) 같은 큐를 삭제하는 것이 좋습니다.

희망이 있습니다.