接收下载管理器下载完整的意图并比较ID-Android

zap*_*.10 3 android broadcastreceiver android-download-manager

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

有两种选择:

1)通过创建意图过滤器并注册广播接收器来接收活动中的意图。这里的问题是广播接收机存在于活动中,并随活动而被销毁。因此,如果在销毁活动之前未完成下载,则无法接收意图。

this.downloadId = manager.enqueue(request);
Run Code Online (Sandbox Code Playgroud)

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

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

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

我希望我的问题很清楚。

mml*_*loo 5

当然,您的第一个选项不好,因为您必须在下载完成后立即做一些工作,因此,我建议您使用第二种方法,将downloadidin sharedpreferance或in 存放在文件中,并在onRecieve方法中按存储的值进行检查。您也可以使用,database但是如果您只想在其中存储一个variabledownloadid),则不是一个好主意,因为您必须创建table和...,所以让我们看一些代码:

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

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

并在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();
   }
  }
Run Code Online (Sandbox Code Playgroud)