BroadcastReceiver onReceive() immer zweimal aufgerufen
In meiner app, ich bin mit DownloadManager zum herunterladen von PDF-Dateien, die Sie informiert das Programm über einen BroadcastReceiver, sobald der download abgeschlossen ist. Mein problem ist die onReceive () - Methode der BroadcastReceiver wird immer zweimal aufgerufen. Der code ist wie folgt:
In meiner Liste-adapter, eine for-Schleife wird ausgeführt für den Download des ausgewählten pdf-Dateien. Der Download-code ist geschrieben in einer anderen Klasse wie folgt:
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));
}
Ich versuche, fügen Sie Benachrichtigungen für jeden als pdf-download. Dieser arbeitet perfekt mit dem download-Manager eigene interne Meldung, die für HoneyComb und höher Versionen, aber für Lebkuchen-es funktioniert nicht, und daher habe ich push meine eigene benutzerdefinierte Meldung. So brauche ich, um zu bestimmen, die genaue Zeit, wenn die pdf-Datei vollständig heruntergeladen. Jetzt bin ich in der Lage zu schieben eigene benutzerdefinierte Meldung, aber die Benachrichtigungen kommen zweimal für jedes pdf-Dokument herunterladen (Als onReceive() wird immer zweimal für jeweils pdf). Kann bitte jemand erklären, warum onReceive() wird doppelt aufgerufen(für jedes pdf-Dokument). Gibt es Abhilfe für dieses? Auch könnte jemand bitte empfehlen, wie die broadcast-Empfänger, die un-registriert, in meinem Fall hier?Der obige code ist nicht Teil der Tätigkeit, also bin ich nicht sicher, wie die Registrierung der Empfänger.
Vielen Dank fürs vorbeischauen und Lesen der post.
- Ist die download-id der gleiche Wert in zwei onReceive () - Aufrufe? downloadid kann man auf Vorsatz.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
- Das habe ich überprüft. Wenn ich zwei pdf download ist der download-id ist die gleiche für beide pdf ' s für die erste Zeit, wenn onReceive aufgerufen wird(zuerst.pdf -> id =1, zweiter.pdf -> Id = 1). Wenn Sie wird automatisch aufgerufen, zum zweiten mal die download-id änderungen (ersten.pdf -> Id = 2, zweiten.pdf -> id = 2). Also im Grunde, ich sehe ich vier print-Anweisungen drucken 1,1,2,2. die id sollte eindeutig sein für jedes pdf-download ?
- Ich bin verwirrt über Ihre erste.pdf->id = 1 und die zweite.pdf->id = 1. Können Sie aktualisieren Sie Ihren code, so kann ich besser verstehen, was ist Ihre erste und zweite?
- Die obigen code-Fragment wird innerhalb einer Methode. Diese Methode wird aufgerufen, in einer for-Schleife läuft für jedes pdf-Dokument heruntergeladen werden. Also, wenn ich versuche, laden Sie zwei pdf-Dateien die for-Schleife ruft die oben genannte Methode zweimal. der sysout in der obige code druckt die download id ' s in der Reihenfolge (1,1,2,2).Ich denke sysout sollte rpint nur zwei mal mit einzigartigen download-id jedes mal. (Code-update mit sysout-Anweisung)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du normalerweise registrieren Receiver
onResume()
und aufheben der Registrierung inonPause()
. Sind Sie dabei?Ich denke, vielleicht habe ich ursprünglich falsch verstanden, was Sie zu tun versuchten. Sie sollten in der Lage sein zu rufen
unregisterReceiver
ausonReceive
. Nicht das tun, was Sie wollen?Sie sagten, Sie sind zwei PDF-Dateien herunterladen. Ich sehe nur eine Download-Anfrage in der Methode. Also ich nehme an, was Sie getan haben ist zu nennen, dass die Methode zweimal. Wenn das wahr ist, haben Sie eigentlich registriert, zwei Empfänger zum Empfang der
ACTION_DOWNLOAD_COMPLETE
Veranstaltung.Sie müssen sich nur einmal registrieren in onCreate oder onStart oder einige andere Methoden. Für die Benachrichtigung Zweck können Sie
intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
um die download-id, die id ist einzigartig für jeden einzelnen download. Sie können verwenden Sie diese id, um die Informationen über die heruntergeladene Datei, und stellen Sie Ihre Datei-spezifische Benachrichtigung.Ähnlich sieht dies der gleiche Fehler, der hier beschrieben wird:
https://code.google.com/p/android/issues/detail?id=18462