Почему уведомление о загрузке завершено на устройствах Gingerbread?

Я использую класс DownloadManager для программной загрузки файла. Все работает нормально, но я не могу заставить загрузочную завершенную нотацию продолжать. Он исчезает сразу после завершения загрузки. Здесь мой код:

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);

Я видел некоторые вопросы в Интернете, связанные с этим, но я не мог найти решение.

Ответы

Ответ 1

DownloadManager не поддерживает уведомление о завершении Gingerbread; вы должны отображать его сами.

Используйте BroadcastReceiver, чтобы определить, когда закончится скачивание, и покажите свое собственное уведомление:

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
        }
    }
}

и зарегистрируйте его в своем манифесте:

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

Кроме того, setNotificationVisibility был добавлен в уровень API 11 (Honeycomb), а не ICS. Я не уверен, что ваше использование константы ICS является преднамеренным или нет, но вы также можете изменить свой код на использование системного уведомления на Honeycomb:

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

Ответ 2

Вам нужно создать свое собственное полное уведомление о загрузке Gingerbread.

Сначала сделайте ссылку на загрузку с DownloadManager:

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

Затем прослушайте полную трансляцию dowload в своем пользовательском 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);

и отправьте свое собственное полное уведомление о загрузке.

Ответ 3

Ну, в какую версию вы тестируете? Установка VISIBILITY_VISIBLE_NOTIFY_COMPLETED должна устанавливать уведомление, чтобы оно отображалось только после завершения загрузки. Если уведомление появляется во время загрузки, я должен предположить, что вы работаете на платформе, предшествующей ICS. Я бы отлаживал приложение. Установите точки останова, чтобы увидеть, какой из ваших вариантов "if" выполняется.

Ответ 4

Возможно, это грубый (но простой) способ: вы можете предпочесть просто создать новое уведомление после завершения загрузки  P.S.:ah, и мне жаль, на самом деле это не ответ на вопрос "почему", но он все равно может быть полезен для вас.