[英]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.