接收下载管理器下载完整意图并比较id - android

时间:2014-09-15 13:48:10

标签: android broadcastreceiver android-download-manager

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

有两种选择:

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

this.downloadId = manager.enqueue(request);

downloadID与onReceive方法中的intent的EXTRA_DOWNLOAD_ID进行比较,以检查它是否是相同的下载。可以在onReceive方法中访问downloadId变量。

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

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

我希望我的问题很清楚。

2 个答案:

答案 0 :(得分:4)

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

将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();
   }
  }

答案 1 :(得分:0)

//Fetching the download id received with the broadcast
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);