是否可以取消/停止使用DownloadManager启动的下载?

时间:2012-12-28 17:29:33

标签: android android-download-manager

我正在使用DownloadManager在我的应用程序中下载一堆文件。我无法弄清楚如何取消downloadManager排队的下载。

有两种可能性: 一个。用户可以通过在通知栏中单击来手动取消它。 湾取消并通过代码删除下载。

我定义了以下接收器。

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

}

任何见解?

2 个答案:

答案 0 :(得分:52)

您可以通过调用DownloadManager方法,通过remove(long...)取消下载。为此,您需要下载的ID。根据我的经验,基本上有两种可靠的方法来获得它:

  1. 请记住enqueue(DownloadManager.Request)方法的返回值。
  2. 通过DownloadManager方法查询query(DownloadManager.Query)下载内容。然后从返回的Cursor中检索ID,它们存储在名为DownloadManager.COLUMN_ID的列中。
  3. 广播接收器

    根据我的经验,通过BroadcastReceiver为行动android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED检索下载ID是不可靠的(尽管广播总是发送)。

    1. 从额外DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS获取下载ID无效。在某些设备上,它始终返回null。如果它在某些设备上返回某些内容,则首先是下载的ID。如果第一次下载完成/取消,则返回null以通知剩余下载。
    2. 从额外DownloadManager.EXTRA_DOWNLOAD_ID获取值不适用于此操作。
    3. 在广告中获取动作android.intent.action.DOWNLOAD_COMPLETE的ID似乎可靠。你必须从额外的DownloadManager.EXTRA_DOWNLOAD_ID获得它。请注意,广播不仅仅是为了完成下载而发送的,当您取消下载呼叫remove()时也会发送广播。

      注意: 下载有时会分组在一个通知中,有时会创建多个通知。我无法确定通知执行和不执行分组的条件。它似乎取决于许多因素,如操作系统版本,设备,下载标题,......一般来说似乎是不可预测的。

      注意: 我已经测试过你是否可以取消其他应用程序的下载,但似乎并非如此。即使ID是所有应用程序中唯一的数据库ID。调用remove()不会取消其他应用的下载。

答案 1 :(得分:1)

如果您正在寻找如何停止下载,那么我相信您知道如何通过 URL 下载数据。
我希望您熟悉第 1 点、第 2 点和第 3 点,而您的解决方案是第 4 点。

  1. private var mgr: DownloadManager? = null
  2. private var enqueue: Long? = null
  3. enqueue = mgr?.enqueue(request)
  4. mgr?.remove(enqueue!!)