簡體   English   中英

BroadcastReceiver onReceive()被調用兩次

[英]BroadcastReceiver onReceive() getting called twice

在我的應用程序中,我使用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的一部分,所以我不知道如何取消注冊接收器。

感謝您停下來閱讀帖子。

通常你注冊接收器onResume()和注銷onPause() 你這樣做嗎?


我想我原本可能誤解了你想要做的事情。 您應該能夠從onReceive調用unregisterReceiver 這樣做你想要的嗎?

你說你正在下載兩個pdf。 我只在您的方法中看到一個下載請求。 所以我假設你做的是兩次調用該方法。 如果是這樣,您實際注冊了兩個接收器以接收ACTION_DOWNLOAD_COMPLETE事件。

您只需要在onCreate或onStart或其他方法中注冊一次。 出於通知目的,您可以使用intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)來獲取下載ID,每個下載的ID都是唯一的。 您可以使用此ID獲取有關下載文件的信息,並進行特定於文件的通知。

這看起來與此處描述的錯誤相同: https//code.google.com/p/android/issues/detail?id = 18462

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM