22

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

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

我定义了以下接收器。

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

}

有什么见解吗?

4

2 回答 2

58

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

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

广播接收器

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

  1. 从 extra 获取下载 IDDownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS无法正常工作。在某些设备上,它总是返回 null。如果它在某些设备上返回某些内容,则它是首先开始下载的 ID。如果第一次下载完成/取消,则返回 null 以通知剩余下载。
  2. 从 extra 中获取值DownloadManager.EXTRA_DOWNLOAD_ID不适用于此操作。

在广播中获取 ID 以采取行动android.intent.action.DOWNLOAD_COMPLETE似乎是可靠的。你必须从 extra 中得到它DownloadManager.EXTRA_DOWNLOAD_ID。请注意,广播不仅会在下载完成时发送,还会在您取消下载调用时发送remove()

注意: 下载有时会在一个通知中分组,有时会创建多个通知。我无法弄清楚通知何时分组和不分组的条件。它似乎取决于许多因素,如操作系统版本、设备、下载标题……而且总的来说似乎相当不可预测。

注意: 我测试了你是否可以取消其他应用程序的下载,但似乎不能。即使 ID 是在所有应用程序中唯一的数据库 ID。呼叫remove()不会取消另一个应用程序的下载。

于 2012-12-30T03:57:41.883 回答
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!!)
于 2020-12-29T16:50:32.577 回答