15

Ich verwende die Klasse DownloadManager, um eine Datei programmatisch herunterzuladen. Alles funktioniert gut, aber ich kann die Download-Benachrichtigung nicht dauerhaft erhalten. Es verschwindet sofort, sobald der Download abgeschlossen ist. Hier ist mein Code:Warum verschwindet die Benachrichtigung "Download abgeschlossen" auf Gingerbread-Geräten?

Request rqtRequest = new Request(Uri.parse(((URI) vewView.getTag()).toString())); 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
((DownloadManager) getSystemService(DOWNLOAD_SERVICE)).enqueue(rqtRequest); 

Ich habe einige Fragen im Zusammenhang mit dem Internet gesehen, aber ich konnte keine Lösung finden.

Antwort

16

DownloadManager unterstützt keine Abschlussbenachrichtigung auf Lebkuchen; Sie müssen es selbst anzeigen.

ein BroadcastReceiver to detect when the download finishes verwenden und Ihre eigene Meldung zeigen:

public class DownloadBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
      //Show a notification 
     } 
    } 
} 

und registrieren Sie es in Ihrem Manifest:

<receiver android:name="com.zolmo.twentymm.receivers.DownloadBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/> 
    </intent-filter> 
</receiver> 

Auch setNotificationVisibility wurde in API-Ebene 11 (Honeycomb) nicht ICS hinzugefügt. Ich bin mir nicht sicher, ob die Nutzung des ICS konstant vorsätzliches oder nicht, aber Sie können Ihren Code die folgenden auf die Verwendung der Systembenachrichtigung auf Honeycomb auch ändern:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
0

Nun, auf welcher Version testen Sie? Die Einstellung VISIBILITY_VISIBLE_NOTIFY_COMPLETED sollte die Benachrichtigung so einstellen, dass sie nur angezeigt wird, wenn der Download abgeschlossen ist. Wenn die Benachrichtigung während des Downloads angezeigt wird, muss ich davon ausgehen, dass Sie auf einer Plattform vor ICS ausgeführt werden. Ich würde die App debuggen. Setzen Sie Haltepunkte, um zu sehen, welche Ihrer "if" -Wahlen ausgeführt werden.

+0

Auf ICS und neueren Geräten werden die Benachrichtigungen ordnungsgemäß angezeigt - sowohl während des Downloads als auch nach dem Download. Bei Gingerbread und älteren Geräten wird dies beim Herunterladen angezeigt, verschwindet jedoch nach Abschluss. Die Entwicklerdokumentation dazu enthält nichts. Ich habe keine Notwendigkeit gesehen, Haltepunkte zu setzen, weil ich versucht habe, die 'if'-Anweisung zu entfernen und diese auf einem Gingebread-Emulator auszuführen. Der Code wird ausgeführt und die Benachrichtigung erscheint beim Herunterladen, aber das war's. –

0

Vielleicht ist es ein grober (aber einfacher) Weg: Vielleicht möchten Sie einfach neue Benachrichtigung erstellen, nachdem der Download fertig ist PS: ah, und es tut mir leid, es ist nicht wirklich eine Antwort auf Frage "warum", aber es kann immer noch hilfreich für Sie sein

2

Sie haben eine eigene erstellen Download komplette Benachrichtigung für Lebkuchen.

Zuerst einen Verweis auf den Download von der DownloadManager erhalten:

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
DownloadManager.Request request = new Request(someUri); 
//... 
long downloadReference = downloadManager.enqueue(request); 

Dann hören die dowload vollständige Übertragung in Ihrem benutzerdefinierten BroacastReceiver:

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override public void onReceive(Context context, Intent intent) { 
     long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
     if (downloadReference == reference) { 
       // Send your own notification 
     } 
    } 
}; 

registerReceiver(receiver, filter); 

und Ihre eigenen Download abgeschlossen Benachrichtigung abzuschicken .

+0

Der Vorbehalt bei diesem Ansatz ist, dass der BroadcastReceiver an den Aktivitätslebenszyklus gebunden ist. Besser, einen [manifesten registrierten Empfänger] (http://stackoverflow.com/a/13824306/80425) zu verwenden, um die Benachrichtigung zu erhöhen. –

+0

@DavidCaunt. Guter Punkt, abgedeckt in deiner Antwort. Ich habe es +1. –

Verwandte Themen