2013-03-13 17 views
8

In meiner App verwende ich den DownloadManager, um PDFs herunterzuladen, die die Anwendung über einen BroadcastReceiver benachrichtigen, sobald der Download abgeschlossen ist. Mein Problem ist die onReceive() Methode von BroadcastReceiver wird zweimal aufgerufen. Der Code lautet wie folgt:BroadcastReceiver onReceive() wird zweimal aufgerufen

In meinem Listenadapter wird eine for-Schleife zum Herunterladen der ausgewählten PDFs ausgeführt. Der Download-Code wird wie folgt in eine andere Klasse geschrieben:

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, Benachrichtigungen für jeden PDF-Download hinzuzufügen. Dies funktioniert perfekt mit den internen Managern von Download-Managern für HoneyComb und höhere Versionen, aber für GingerBread funktioniert es nicht und daher muss ich meine eigene benutzerdefinierte Benachrichtigung pushen. Also muss ich den genauen Zeitpunkt bestimmen, zu dem das PDF vollständig heruntergeladen wird. Ab jetzt bin ich in der Lage, meine eigene benutzerdefinierte Benachrichtigung zu pushen, aber die Benachrichtigungen kommen zweimal für jeden PDF-Download (As onReceive() wird zweimal für jedes PDF). Kann jemand bitte erklären, warum onReceive() zweimal aufgerufen wird (für jedes pdf). Gibt es einen Workaround dafür? Könnte auch jemand bitte empfehlen, wie der Rundfunkempfänger in meinem Fall hier nicht registriert werden kann? Der obige Code ist kein Teil von Activity, also bin ich mir nicht sicher, wie ich den Empfänger abmelden soll.

Danke, dass Sie vorbeischauen und die Post lesen.

+1

Ist der Download-ID der gleiche Wert, dass zwei OnReceive() Anrufe? downloadid kann mit intent.getLongExtra (DownloadManager.EXTRA_DOWNLOAD_ID, -1) – StarPinkER

+0

abgerufen werden. Wenn ich zwei PDFs herunterlade, ist die Download-ID für beide PDFs zum ersten Mal dieselbe, wenn onReceive aufgerufen wird (first.pdf -> id = 1, second.pdf -> Id = 1). Wenn es automatisch zum zweiten Mal aufgerufen wird, ändert sich die Download-ID (first.pdf -> Id = 2, second.pdf -> id = 2). Also im Grunde sehe ich vier Druckanweisungen, die 1,1,2,2 drucken. Soll die ID für jeden PDF-Download eindeutig sein? – andro

+0

Ich bin verwirrt über Ihre erste.pdf-> id = 1 und zweite.pdf-> id = 1. Können Sie Ihren Code aktualisieren, damit ich besser verstehe, was ist Ihre erste und zweite? – StarPinkER

Antwort

3

Normalerweise registrieren Sie Empfänger onResume() und entfernen Sie die Registrierung in onPause(). Machst du das?


Ich glaube, ich kann ursprünglich falsch verstanden haben, was Sie tun wollten. Sie sollten unregisterReceiver von onReceive anrufen können. Macht das was du willst?

+0

Ich registriere den Empfänger nicht in onResume(). Der BroadcastReceiver wird für jedes herunterzuladende PDF erstellt.Wie bereits erwähnt, befindet sich der Code in einer separaten Klasse und nicht in der Aktivitätsklasse. – andro

+0

Ich verstehe. Ich habe meine Antwort aktualisiert. Was passiert, wenn Sie den Empfänger von onReceive abmelden? – yarian

+0

Wenn ich versuche, den Empfänger in onReceive() abzumelden, stürzt die Anwendung mit der Meldung ab, dass der Empfänger nicht registriert ist. Bitte sehen Sie sich meine aktualisierte Frage an, um eine genauere Vorstellung von dem zu erhalten, was ich erreichen möchte. Vielen Dank für Ihre Zeit. – andro

1

Sie sagten, Sie laden zwei PDFs herunter. Ich sehe nur eine Download-Anfrage in Ihrer Methode. Ich nehme also an, Sie haben diese Methode zweimal aufgerufen. Wenn das wahr ist, haben Sie tatsächlich zwei Empfänger registriert, um das Ereignis ACTION_DOWNLOAD_COMPLETE zu empfangen.

Sie müssen sich nur einmal bei onCreate oder onStart oder anderen Methoden registrieren. Zu Benachrichtigungszwecken können Sie intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) verwenden, um die Download-ID zu erhalten, die ID ist für jeden Download eindeutig. Sie können diese ID verwenden, um Informationen über die heruntergeladene Datei abzurufen und eine dateispezifische Benachrichtigung zu erstellen.

+0

Ja, ich habe diese Methode zweimal aufgerufen (einmal für jedes PDF zum Download). Der Grund, warum ich dies getan habe, ist, dass ich für jedes PDF eine separate Benachrichtigung erstellen möchte. Gibt es eine Möglichkeit, dies mit nur einem Empfänger zu erreichen? – andro

+0

Antwort aktualisiert. @andro – StarPinkER

Verwandte Themen