为什么“下载完成”通知会在Gingerbread设备上消失?

时间:2012-11-12 19:01:48

标签: android android-notifications android-notification-bar android-download-manager

我正在使用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);

我在网上看到了一些与此相关的问题,但我找不到解决方案。

4 个答案:

答案 0 :(得分:16)

DownloadManager不支持关于Gingerbread的完成通知;你必须自己展示它。

使用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>

此外,在API级别11(Honeycomb)中添加了setNotificationVisibility而不是ICS。我不确定您是否故意使用ICS常量,但您可以将代码更改为以下内容以使用Honeycomb上的系统通知:

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

答案 1 :(得分:2)

您必须为Gingerbread创建自己的下载完整通知。

首先,从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);

并发送您自己的下载完整通知。

答案 2 :(得分:0)

那么,您正在测试哪个版本?设置VISIBILITY_VISIBLE_NOTIFY_COMPLETED应设置通知,以便仅在下载完成时显示。如果通知在下载过程中显示,那么我必须假设您在ICS之前的平台上运行。我调试了应用程序。设置断点以查看正在执行的“if”选项。

答案 3 :(得分:0)

也许这是一种粗略(但简单)的方式:您可能更愿意在下载完成后创建新通知    P.S:嗯,我很抱歉,这实际上并不是对“为什么”提出质疑的答案,但它仍然可能对你有所帮助