我在我的活动中使用下载管理器来下载文件。我想使用广播接收器接收ACTION_DOWNLOAD_COMPLETE意图,并将下载请求的ID与下载管理器设置的意图中的id匹配,以检查它是否是相同的下载。
有两种选择:
1)通过制作意图过滤器并注册广播接收器来接收活动中的意图。这里的问题是广播接收器存在于活动中并随之被破坏。因此,如果在销毁活动之前下载没有完成,则无法接收到意图。
this.downloadId = manager.enqueue(request);
将downloadID与onReceive方法中的intent的EXTRA_DOWNLOAD_ID进行比较,以检查它是否是相同的下载。可以在onReceive方法中访问downloadId变量。
2)通过清单接收广播。这里的问题是onReceive方法无法访问活动中的downloadId变量集。所以我无法检查下载是否是我需要的。
我做错了吗?基本上我想知道下载是否成功完成,即使下载开始的活动/服务被破坏了。
我希望我的问题很清楚。
答案 0 :(得分:4)
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();
}
}
答案 1 :(得分:0)
//Fetching the download id received with the broadcast
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);