2012-12-28 94 views
16

我正在使用DownloadManager在我的應用程序中下載一堆文件。我無法弄清楚如何取消已經由downloadManager排隊的下載。是否可以取消/停止使用DownloadManager啓動的下載?

有兩種可能性: a。用戶可以通過在通知欄中單擊來手動取消它。 b。通過代碼取消並刪除下載。

我有以下定義的接收器。

<receiver 
     android:name=".DownloadStatusReceiver" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
      <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" /> 
    </intent-filter> 
</receiver> 

和接收器

if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) { 

    Constants.showLog(TAG, "Notification clicked"); 
    long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
    DownloadManager dm =(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);    
    dm.remove(downloadId); 

} 

任何見解?

+0

'remove()'應該工作,根據文檔。當然,在下載完成之前,你似乎不會調用remove()。這就好像在馬被狂奔之後鎖定穀倉。 :-) – CommonsWare

+0

我會實現我自己的下載工作流程,因爲內置的下載管理器有問題,不適用於舊設備。 – vorrtex

+0

@CommonsWare:我打電話通知欄被點擊時刪除。我假設通知點擊事件是通過下載是否完成來實現的。 – PravinCG

回答

48

您可以通過調用remove(long...)方法取消通過DownloadManager的下載。爲此,您需要下載的ID。從我的經驗來看,基本上有兩種可靠的方法如何得到它:

  1. 記住返回值爲enqueue(DownloadManager.Request)方法。
  2. 通過query(DownloadManager.Query)查詢DownloadManager的下載方法。然後從返回的Cursor中檢索ID,它們存儲在名爲DownloadManager.COLUMN_ID的列中。

廣播接收機

從我的經驗,這是不可靠的通過BroadcastReceiver行動android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED(雖然廣播始終發送)來檢索下載ID。

  1. 從額外的DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS獲取下載ID無法正常工作。在某些設備上,它總是返回null。如果它在某些設備上返回某些內容,則它是首先啓動的下載ID。如果第一次下載完成/取消,它將返回空值以通知剩餘的下載。
  2. 從額外獲得值DownloadManager.EXTRA_DOWNLOAD_ID不適用於此操作。

在廣播中獲取ID以採取行動android.intent.action.DOWNLOAD_COMPLETE似乎可靠。你必須從額外的DownloadManager.EXTRA_DOWNLOAD_ID中得到它。請注意,廣播不僅用於完成下載,還會在您取消下載時發送,請致電remove()

注意: 下載有時會分組到一個通知中,有時會創建多個通知。我無法弄清楚通知有沒有分組的情況。它似乎取決於許多因素,如操作系統版本,設備,下載標題,...一般來說似乎是不可預測的。

注意: 我已測試過您是否可以取消其他應用程序的下載並且看起來不是這樣。即使這些ID是所有應用程序中唯一的數據庫ID。撥打remove()不會取消其他應用的下載。

+1

謝謝Tomik,你總結得很好,我同意我觀察到同樣的情況。我接受這個答案,因爲它將在未來幫助他人。 – PravinCG

+0

非常有用。給予個人經驗總是最有價值的東西,你可以節省很多時間。 – mmlooloo

+2

@Tomik,那麼在DOWNLOAD_NOTIFICATION_CLICKED上獲取id的最佳方法是什麼?我正在同時下載多個文件,無法保留所有ID。 – MadDeveloper

相關問題