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

Pra*_*nCG 20 android android-download-manager

我正在使用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> 
Run Code Online (Sandbox Code Playgroud)

并在接收器中

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

}
Run Code Online (Sandbox Code Playgroud)

任何见解?

Tom*_*mik 54

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

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

广播接收器

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

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

在广播中获取ID以获取行动android.intent.action.DOWNLOAD_COMPLETE似乎是可靠的 你必须得到额外的DownloadManager.EXTRA_DOWNLOAD_ID.请注意,广播不仅会发送完成下载,也会在您取消下载呼叫时发送remove().

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

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

  • @Tomik,那么在DOWNLOAD_NOTIFICATION_CLICKED上获取id的最佳方法是什么?我同时下载了几个文件,无法保留所有ID. (3认同)