2013-03-21 60 views
3

我有一個listview包含很多歌曲。每次點擊歌曲時,我都會調用IntentService按順序下載該歌曲。如何停止一個IntentService同時有很多IntentService正在運行

但有時我想取消下載(例如:第5次)。這意味着我需要停止第5次運行IntentService。我試圖通過調用stopService()來停止它,但它不起作用。

任何人都可以告訴我一個很好的方法來停止IntentService嗎?非常感謝你的幫助。

+0

我想通過這個,你殺了第一個隨機過程 - 這可以證明嗎?如果是這樣,那麼你需要識別每個進程的PiD,我不太清楚如何做到這一點,但給我一些時間,我想我可以找到一些東西。 – g00dy 2013-03-21 13:48:09

回答

11

您的清單中只有一個運行IntentService,根據<service>元素。如果您撥打startService()六次,則最多隻有一個IntentService正在運行。如果在發送另一個命令時IntentService正在處理命令,那麼命令將排隊並在onHandleIntent()中一次處理一個命令。

在你的情況,因爲你不能輕易取消與IntentService一個優秀的命令,你可能需要創建IntentService,你有自己的工作隊列,一個在那裏你有能力創建自己的Service子你自己的版本取消尚未運行的命令。

+0

是的,這似乎是解決我的問題的最好方法。 – anticafe 2013-03-21 14:22:56

+0

IntentService在內部有一個隊列,並將連續服務所有這些隊列。所以我認爲最好的解決方案是使用服務。 – StErMi 2013-03-22 15:01:19

1

我在使用intentservices下載時遇到同樣的問題。 在我的應用程序中,每個下載都有自己的通知,點擊它時我想停止下載。

我通過覆蓋onStartCommand()方法(當新的intent到達時調用)來解決它。 當我想關閉一個下載,我開始了新的意圖有一個額外的稱爲「stopid」:

Intent stopIntent = new Intent(DialogActivity.this,DownloadIntentService.class); 
stopIntent.putExtra("stopid", id); 
startService(stopIntent); 

的onStartCommand()方法是這樣的:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    int id = intent.getExtras().getInt("stopid"); 
    if(id!=0) { 
     stopList.add(id); 
    } 
    return super.onStartCommand(intent, flags, startId); 
} 

對於普通的意圖,只是把你的下載的id作爲額外的你的意圖。 在onHandle()方法中下載時,經常檢查stopList是否包含當前下載意圖的ID。如果是,請停止下載並從stopList中刪除該ID。

+3

在最新的android引用中,注意到這個方法不應該被覆蓋。如果註釋被忽略,那麼所提到的問題原來的海報是用你的方法解決了什麼風險? – 2014-03-28 21:48:23