1

我有一个Service便于从服务器下载文件的工具。每次Intent收到 an 时onStartCommand,我都会启动一个新Thread的 ,将Thread要下载的 url 作为键放入地图中,并创建一个通知以显示下载进度。如果映射中没有Threads,则在 中设置一个标志Thread,表示它应该在创建或更新startForeground时使用。Notification随后Thread的 s/ Notifications 显示NotificationManager.notifyFLAG_AUTO_CANCELoff 和FLAG_ONGOING_EVENTon 一起使用。每个Thread都有自己的唯一 id 发送到startForegroundor notify。当文件完成下载,或用户取消下载(通过按下Notification按钮RemoteView,如果调用的是“前台线程/通知” stopForeground(true)Notification则填充新RemoteView的显示下载是否完成,并且下一次运行Thread将其“前台”标志设置为true

问题是,如果我有两个文件下载,会有一个Notification/Thread连接到startForeground一个,一个没有。如果我取消“前景”,一切都很好。但是,如果我按下非前景按钮上的取消按钮,前景按钮将被关闭(再次按下取消按钮将关闭正确的按钮)。如果我不取消任何一个,并且我开始第 3 次下载,该下载在其他人之前完成,则Notification显示已完成,但其他两个仍将开始闪烁并在状态栏中快速上下移动。

我如何确保Service只要有下载,通知将始终位于前台,而不会在上述情况下跳来跳去,并且取消工作正常?

4

1 回答 1

2

我最终做的是在被Service调用中创建一个对所有sisInForeground都是全局的变量。Thread它表示是否startForeground已被调用,没有后续调用stopForeground

在我的updateNotification方法中,我检查isInForeground. 如果是,false我将其设置为true,将Thread'isForegroundNotification标志设置为,truestartForeground使用 that调用ThreadNotification在我的stopNotification方法中,如果Thread'sisForegroundNotificationtrue,我将其设置isInForegroundfalse并调用stopForeground(true)

于 2012-10-18T20:10:03.277 回答