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变量。因此,我无法检查下载是否是我需要的下载。
我做错了吗?基本上,我想知道下载是否成功完成,即使下载开始的活动/服务被破坏了。
我希望我的问题很清楚。
当然,您的第一个选项不好,因为您必须在下载完成后立即做一些工作,因此,我建议您使用第二种方法,将downloadid
in sharedpreferance
或in 存放在文件中,并在onRecieve方法中按存储的值进行检查。您也可以使用,database
但是如果您只想在其中存储一个variable
(downloadid
),则不是一个好主意,因为您必须创建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)
归档时间: |
|
查看次数: |
6623 次 |
最近记录: |