9

在我的应用程序中,我使用 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)。有什么解决方法吗?也有人可以推荐如何在我的案例中取消注册广播接收器吗?上面的代码不是活动的一部分,所以我不确定如何取消注册接收器。

感谢您停下来阅读这篇文章。

4

3 回答 3

3

您通常onResume()onPause(). 你这样做吗?


我想我最初可能误解了你想要做的事情。您应该可以unregisterReceiveronReceive. 这是做你想做的吗?

于 2013-03-13T00:29:06.627 回答
1

你说你正在下载两个pdf。我在您的方法中只看到一个下载请求。所以我假设你所做的是调用该方法两次。如果这是真的,您实际上注册了两个接收器来接收ACTION_DOWNLOAD_COMPLETE事件。

您只需要在 onCreate 或 onStart 或其他一些方法中注册一次。出于通知目的,您可以使用intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)获取下载 id,每次下载的 id 都是唯一的。您可以使用此 id 获取有关下载文件的信息并发出特定于文件的通知。

于 2013-03-13T01:15:33.490 回答
1

这看起来与此处描述的错误相同: https ://code.google.com/p/android/issues/detail?id=18462

于 2013-07-31T19:58:06.753 回答