2011-09-06 23 views
15

i bir niyet hizmetini ("DownloadService") arka planda internettenAndroid: intentservice, iptal veya handleintent kuyruğunda bir görevi atlamak nasıl

intentService indir dosyaları, çağrı bir etkinlik ("ApplicationActivity") var ama dosya 1,2,3,4,5

niyet i Öyleyse ben kuyrukta 5 dosyaları koymak diyelim ......... İndirilen belirli bir iptal edebilmek için

istiyorum servis 1 numarayı indirmeye başlar, sonra ikincisi ve benzerleri .... 1) Niyet yapmakta olduğun niyet hizmetine şu anda ne yaptığını söylemenin bir yolu var mı? yöntem ele geçirme olayı (bu durumda 1. dosya indiriliyor) ve bir sonraki indirmeye mi başlıyorsunuz?

2) dosyayı 1 indirilirken sayısı 3 sonra 5 düz gider, böylece, örneğin sıradan dosyayı 4 kaldırmak böylece, kuyruktan eleman çıkarmak mümkün mü?

+0

Şimdi bile aynı şeyi istiyorum, probleminiz çözüldü mü? –

cevap

12

Ben oluşturmak oldukça kısadır orijinal bir ihtiyaç ve değiştirmek ne olabilir hızlı bir öğretici olduğunu Eğer benim durumumda
mServiceHandler.removeMessages (APPID) içinde ServiceHandler yöntemlerini kullanabilirsiniz bir öğe sıradan çıkarma özellikle kendi amacı için yöntemler ........ ing; mesajı kuyrukta olan belli bir kod 'ne' ile mesajlardan bekleyen tüm mesajları çıkarın
, bu size her mesajın "ne" alanının içinde bir tanımlayıcı ekleyerek kuyrukta eklemek her mesajı etiketlemek zorunda olduğu anlamına gelir. ....

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

tam anlamıyla benim anlayış için kod yazabilirsiniz. –

1

Sen intentservice bağlanabilmekte ve

Kısaca, ben bu 2 basit işlemleri gerçekleştirmek için kuyruğa comunicate için bir yol gerekir, ama internet :(

Tnx üzerinde hiçbir şey yararlı bulmaktadırlar etmedi iptal veya de queu bir indirme için bir yöntem oluşturun.

Here sen kendi MyIntentService sınıf kopyalama

+0

Ben hızlı bir şekilde bu hatıra okuyun ama benim durumumda coul nasıl kullanılacağını anlayamıyorum ..... hizmetler için ve niyetli olmayan hizmetler ....... ve başka bir amaç için .... ... benim sorunum, niyet hizmet sınıfı, sıra ile arama yapmak için herhangi bir yöntem sağlamaz ... tek düşünebildiğim şey, intentService sınıfını kopyalayıp yapıştırmaktır .... – Sgotenks

+0

Merhaba. Bir hizmetin temel sınıfını denetler. Buna hala bir bağlantı yapabilirsiniz. Bağlantı, hizmetle etkileşimde bulunmak için var. Bu nedenle, bir kuyruk nesnesine sahipseniz, bir bayrağı ayarlayan veya bir dosyayı deşifre eden bir stop akımı veya hatta dequeu yöntemine sahip olabilirsiniz. – Pintac

19

Teşekkür user280560 @ örneğin, senin yorumun :) ben bazı durumlarda kuyruğunu temizlemek için istediği yere

sadece daha somut bir örnek vermek dayalı bir çözüm buldu.

Önce IntentService.java kaynağını projemize here'dan kopyaladım (adlarını değiştirmenize gerek kalmadı, IntentService.java'yı tutabilirsiniz, yalnızca sizinkileri içe aktarabiliyorsunuz). Sonra bu Interservice kaynağım için bu

ekledim.

Şimdi IntentService uzanır benim hizmetinden, ben belli bir eylem (giriş) hizmete geçirilen zaman kuyruğunu temizlemek istedim, bu yüzden bu gibi onStartMethod geçersiz: gibi

@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); 
} 

Çalışmaları bir çekicilik :)

birini yardımcı olur umarım ...

+1

İyi iş. Çalışmayı da durdurur mu, yoksa sıraya alınmış işlemleri durdurur mu? – vandzi

+0

Çalıştırma işlemini durdurur sanmıyorum. Test gibi bir şey yok. Belki de orijinal IntentService kaynağını biraz daha değiştirerek bunu başarabilirsiniz. –

+5

mesajında ​​'what' alanını açıkça atamanız gerekir, bunun yerine değeri 0'dır. Kaynakta ne kullanılmadığı için kendi amaçlarınız için kullanmanız güvenli olmalıdır. –

4

IntentService sınıfını uzatın ve üzerinde iptal öğe için bir liste ilan edip iptal etmek istediğiniz zaman bir şey bu listeye eklemek. Nihayet niyetinizi ele almadan önce, iptal edilmediğinden emin olun!

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); 
     } 
    } 
} 

Bu kodu çalıştığımı biliyorum çünkü daha önce test ettim, ama bunun doğru bir yol olduğundan emin değilim!

+0

Bu, zaten çalışan hizmetleri durdurmuyor. Bunun dışında, bu iyi ve basit bir çözümdür. –

0

olarak yukarıda @JeffreyBlattman söylediği, atayarak güvenli oynamak bu

@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); 
    } 

gibi iletiye "ne" değeri kendi ve mServiceHandler.removeMessages(0) gibi kuyruğunu temizlemek için daha iyidir.

Bu yardımcı olur umarım.

İlgili konular