【问题标题】:Receive download manager download complete intent and compare id - android接收下载管理器下载完整意图并比较 id - android
【发布时间】:2014-11-09 01:44:50
【问题描述】:

我在我的活动中使用下载管理器来下载文件。我想使用广播接收器接收 ACTION_DOWNLOAD_COMPLETE 意图,并将下载请求的 id 与下载管理器设置的意图中的 id 匹配,以检查它是否是相同的下载。

有两种选择:

1) 通过制作意图过滤器并注册广播接收器来接收活动中的意图。这里的问题是广播接收器存在于活动中并被它破坏。因此,如果在 Activity 销毁之前没有完成下载,则无法接收 Intent。

this.downloadId = manager.enqueue(request);

downloadID 与onReceive 方法中intent 的EXTRA_DOWNLOAD_ID 进行比较,判断是否为同一次下载。可以在 onReceive 方法中访问 downloadId 变量。

2) 通过清单接收广播。这里的问题是 onReceive 方法无法访问活动中设置的 downloadId 变量。所以我无法检查下载是否是我需要的。

我做错了吗?基本上我想知道下载是否成功完成,即使下载开始的活动/服务被破坏。

我希望我的问题足够清楚。

【问题讨论】:

  • 有什么建议吗?可以使用下载管理器完成吗?
  • 如果活动可能没有运行,您必须将 ID 存储在其他位置。
  • 你能举个例子吗?我应该将其存储在数据库中并检查意图中的 id 是否存在于数据库中?

标签: android broadcastreceiver android-download-manager


【解决方案1】:

您的第一个选项肯定不好,因为您必须在下载完成后立即做一些工作,所以我建议您使用第二种方法并将 downloadid 存储在 sharedpreferance 或文件中并在 onRecieve 方法检查通过储值。您也可以使用database,但如果您只想在其中存储一个variable (downloadid),这不是一个好主意,因为您必须创建表和... 所以让我们看一些代码:

在将您的 downloadid 保存到变量后的活动中,将其放入 SharedPreferences 文件中,例如:

SharedPreferences settings = getSharedPreferences("DownloadIDS", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putLong("savedDownloadIds", your download id);
editor.commit();

在 onReceive 中:

@Override
public void onReceive(Context context, Intent intent) {

    SharedPreferences downloadids = context.getSharedPreferences("DownloadIDS", 0);
    long savedDownloadIds = downloadids.getLong("savedDownloadIds", 0);

    Bundle extras = intent.getExtras();
    DownloadManager.Query q = new DownloadManager.Query();
    Long downloaded_id = extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
    if(savedDownloadIds == downloaded_id ){ // so it is my file that has been completed
    q.setFilterById(downloaded_id);
    DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    Cursor c = manager.query(q);
    if (c.moveToFirst()) {
        int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
        if (status == DownloadManager.STATUS_SUCCESSFUL) {
           // do any thing here
        }
    }
    c.close();
   }
  }

【讨论】:

  • 如果我想开始多个并行下载,那么我如何确定哪个下载已完成,如果我想取消特定下载,那么如何存储特定下载的 downloadId。如果可能的话,请告诉我怎么做。
  • 使用数据库存储下载信息。或者您可以将信息作为 json 等写入文件。基本上,您必须将此信息保存在某处才能根据下载 ID 检索它。
【解决方案2】:
//Fetching the download id received with the broadcast
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多