在我的应用程序中,我使用DownloadManager来下载PDF,一旦下载完成,它就会通过BroadcastReceiver通知应用程序。我的问题是BroadcastReceiver的onReceive()方法被调用两次。代码如下:
在我的列表适配器中,运行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下载时通知都会两次(因为onReceive()每个pdf都会获得两次)。任何人都可以解释为什么onReceive()被调用两次(每个pdf)。这有什么解决方法吗?也有人可以建议如何在我的情况下取消注册广播接收器?上面的代码不是Activity的一部分,所以我不知道如何取消注册接收器。
感谢您停下来阅读帖子。
答案 0 :(得分:3)
您通常会在onResume()
注册接收方onPause()
并取消注册。你这样做吗?
我想我原本可能误解了你的想法。您应该可以从unregisterReceiver
致电onReceive
。这样做你想要的吗?
答案 1 :(得分:1)
你说你正在下载两个pdf。我只在您的方法中看到一个下载请求。所以我假设你做的是两次调用该方法。如果是这样,您实际上已注册了两个接收器以接收ACTION_DOWNLOAD_COMPLETE
事件。
您只需要在onCreate或onStart或其他方法中注册一次。出于通知目的,您可以使用intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
获取下载ID,每个下载的ID都是唯一的。您可以使用此ID获取有关下载文件的信息,并进行特定于文件的通知。
答案 2 :(得分:1)
这看起来与此处描述的错误相同: https://code.google.com/p/android/issues/detail?id=18462