15

我正在使用DownloadManager類以編程方式下載文件。所有工作正常,但我不能讓下載完成notifcation堅持。一旦下載完成,它立即消失。這裏是我的代碼:爲什麼Gingerbread設備上的「下載完成」通知消失?

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

我已經看到了一些與網絡有關的問題,但我找不到解決方案。

回答

16

DownloadManager不支持薑餅的完成通知;你必須自己展示它。

使用BroadcastReceiver to detect when the download finishes,並顯示自己的通知:

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(蜂窩)不是ICS添加。我不知道,如果你的ICS的恆定的用途是故意或沒有,但你可以改變你的代碼下面的使用在Honeycomb系統通知,以及:

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

那麼,你測試的是哪個版本?設置VISIBILITY_VISIBLE_NOTIFY_COMPLETED應該設置通知,以便它只在下載完成時顯示。如果通知在下載過程中顯示,那麼我必須假設您在ICS之前的平臺上運行。我會調試應用程序。設置斷點以查看您正在執行哪個「if」選項。

+0

在ICS和更新的設備上,通知顯示正常 - 無論是在下載期間還是在下載後持續存在。在薑餅和早期的設備上,它顯示下載時,但完成時消失。沒有關於此的開發人員文檔。我沒有看到需要放置斷點,因爲我試圖刪除'if'語句並在Gingebread模擬器上運行它。代碼被執行並且下載時出現通知,但就是這樣。 –

0

也許這是一個粗糙的(但很簡單)的方式:你可能更喜歡只是在下載完成後創建新的通知 PS:啊,我很抱歉,它實際上不是問題「爲什麼」的答案,但它仍然可能對您有所幫助

2

你必須創建自己的下載薑餅的完整通知。

首先,從我們的DownloadManager到下載一個參考:

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

然後對下載中心完整的廣播在您的自定義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); 

和歡送你自己下載完成通知。

+0

使用這種方法的警告是BroadcastReceiver將被綁定到活動生命週期。最好使用[清單註冊接收方](http://stackoverflow.com/a/13824306/80425)來提出通知。 –

+0

@DavidCaunt。好點,涵蓋在你的答案。我已經+1了。 –

相關問題