2013-03-13 144 views
8

在我的應用程序中,我使用DownloadManager下載PDF文件,下載完成後通過BroadcastReceiver通知應用程序。我的問題是BroadcastReceiver的onReceive()方法被調用兩次。代碼如下: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)。有沒有解決方法?也有人可以請推薦如何在我的情況下,廣播接收機可以取消註冊嗎?上面的代碼不是活動的一部分,所以我不知道如何取消註冊接收機。

感謝您停下來閱讀帖子。

+1

在下載ID在兩個的onReceive()調用相同的值? downloadid可以通過intent.getLongExtra獲得(DownloadManager.EXTRA_DOWNLOAD_ID,-1) – StarPinkER 2013-03-13 00:43:13

+0

我檢查過。當我下載兩個pdf文件時,當onReceive被調用時(first.pdf - > id = 1,second.pdf - > Id = 1),這兩個pdf的下載ID都是第一次相同。當第二次自動調用下載標識符時(first.pdf - > Id = 2,second.pdf - > id = 2)。所以基本上我可以看到四個打印語句打印1,1,2,2。是每個pdf下載的id應該是獨一無二的? – andro 2013-03-13 01:04:36

+0

我對你的first.pdf-> id = 1和second.pdf-> id = 1感到困惑。你能否更新你的代碼,以便我更好地理解你的第一個和第二個是什麼? – StarPinkER 2013-03-13 01:17:53

回答

3

您通常會註冊接收器onResume()並取消註冊onPause()。你在這麼做嗎?


我想我最初可能誤解了你正在嘗試做的事情。您應該能夠從onReceive撥打unregisterReceiver。這是否做你想要的?

+0

我沒有在onResume()中註冊接收器。 BroadcastReceiver是爲每個要下載的pdf創建的。正如我之前提到的,代碼是在一個單獨的類中,而不是Activity類的一部分。 – andro 2013-03-13 00:33:27

+0

我明白了。我更新了我的答案。如果您從onReceive註銷接收器會發生什麼? – yarian 2013-03-13 00:45:28

+0

如果我嘗試註銷onReceive()內的接收器,應用程序崩潰說「Receiver not registered」。請參閱我更新的問題,以更詳細地瞭解我想實現的想法。感謝您的時間。 – andro 2013-03-13 01:25:27

1

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

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

+0

是的,我已經調用了這個方法兩次(每個pdf下載一次)。我這樣做的原因是我想爲每個pdf創建一個單獨的通知。有沒有一種方法可以通過僅使用一個接收器來實現? – andro 2013-03-13 01:29:14

+0

答覆已更新。 @andro – StarPinkER 2013-03-13 01:32:58

相關問題