在我的应用程序中,我正在使用DownloadManager来下载PDF文件。一旦下载完成,通过BroadcastReceiver通知应用程序。但是我的问题是,BroadcastReceiver的onReceive()方法被调用了两次。以下是代码:
在我的列表适配器中,使用for循环下载所选的pdf文件。下载代码编写在另一个类中,如下所示:
我正在尝试为每个PDF下载添加通知。对于HoneyComb及以上版本,下载管理器自带的内部通知可以完美地工作,但对于GingerBread则不行,因此我必须推送自己的自定义通知。因此,我需要确定PDF完全下载完成的确切时间。目前,我能够推送自己的自定义通知,但每次PDF下载时通知会出现两次(因为每个PDF的onReceive()被调用了两次)。请问有人能解释一下为什么onReceive()会被调用两次吗?有没有任何解决方法?另外,有人能否推荐一下如何在我的情况下取消广播接收器的注册?由于上述代码不是Activity的一部分,所以我不确定如何注销接收器。
在我的列表适配器中,使用for循环下载所选的pdf文件。下载代码编写在另一个类中,如下所示:
public static void downloadCheat(final SherlockFragmentActivity activity, final String cheatName, String pathOnServer){
Request request = new Request(
Uri.parse(ApplicationConstants.CHEAT_DOWNLOAD_SERVER_URL
+ "/" + pathOnServer + cheatName + ".pdf"));
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
request.setShowRunningNotification(true);
}
else {
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
final DownloadManager dm = (DownloadManager) activity
.getSystemService(Context.DOWNLOAD_SERVICE);
final long enqueue = dm.enqueue(request);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
long i = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
System.out.println(i);
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
Query query = new Query();
query.setFilterById(enqueue);
Cursor c = dm.query(query);
if (c.moveToFirst()) {
int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
}
}
//create custom notification
}
}
};
activity.registerReceiver(receiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
我正在尝试为每个PDF下载添加通知。对于HoneyComb及以上版本,下载管理器自带的内部通知可以完美地工作,但对于GingerBread则不行,因此我必须推送自己的自定义通知。因此,我需要确定PDF完全下载完成的确切时间。目前,我能够推送自己的自定义通知,但每次PDF下载时通知会出现两次(因为每个PDF的onReceive()被调用了两次)。请问有人能解释一下为什么onReceive()会被调用两次吗?有没有任何解决方法?另外,有人能否推荐一下如何在我的情况下取消广播接收器的注册?由于上述代码不是Activity的一部分,所以我不确定如何注销接收器。
感谢您阅读本篇文章。