BroadcastReceiver onReceive()被调用两次

and*_*dro 9 android broadcastreceiver android-download-manager

在我的应用程序中,我使用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));
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试为每个pdf下载添加通知.这适用于下载管理器自己的HoneyComb及以上版本的内部通知,但对于GingerBread它不起作用,因此我必须推送自己的自定义通知.所以我需要确定完全下载pdf的确切时间.截至目前,我可以推送自己的自定义通知,但每次pdf下载时通知都会两次(因为onReceive()每个pdf都会获得两次).任何人都可以解释为什么onReceive()被调用两次(每个pdf).这有什么解决方法吗?也有人可以推荐一下如何在我的情况下取消注册广播接收器?上面的代码不是Activity的一部分,所以我不知道如何取消注册接收器.

感谢您停下来阅读帖子.

yar*_*ian 3

您通常在 中注册接收者onResume()和取消注册onPause()。你这样做吗?


我想我最初可能误解了你想要做什么。您应该能够unregisterReceiver从拨打电话onReceive。这是你想要的吗?