为什么姜饼设备上的“下载完成”通知会消失?

15

我正在使用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个回答

16
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(蜂巢)中添加的,而不是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);

然后,在您自定义的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);

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


这种方法的缺点是BroadcastReceiver将与Activity生命周期绑定。最好使用清单注册接收器来触发通知。 - David Snabel-Caunt

0

好的,你在测试哪个版本?设置VISIBILITY_VISIBLE_NOTIFY_COMPLETED应该会将通知设置为仅在下载完成时显示。如果在下载期间通知显示,则我必须假设你正在运行ICS之前的平台。我会调试应用程序。设置断点以查看执行哪个“if”选择。


在ICS及更高版本的设备上,通知正常显示 - 在下载期间以及下载完成后仍然存在。在Gingerbread及早期版本的设备上,在下载时会显示,但在完成后会消失。开发人员文档中没有关于此的内容。我没有看到需要设置断点,因为我已经尝试删除if语句并在Gingebread模拟器上运行它。代码会执行并在下载时出现通知,但仅此而已。 - Mridang Agarwalla

0
也许这是一个粗略(但简单)的方法:您可能更喜欢在下载完成后创建新的通知 P.S.:啊,对不起,这实际上并不是回答“为什么”的问题,但它仍然可能对您有所帮助

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接