- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个服务
,可以方便地从服务器下载文件。每次在 onStartCommand
中接收到 Intent
时,我都会启动一个新的 Thread
,将 Thread
放入映射中正在下载的 url 作为 key ,并创建通知以显示下载进度。如果映射中没有 Thread
,则在 Thread
中设置一个标志,表示它应该在 时使用
。随后的 startForeground
正在创建或更新通知Thread
s/Notification
s 使用 NotificationManager.notify
显示,同时关闭 FLAG_AUTO_CANCEL
和 FLAG_ONGOING_EVENT
上。每个 Thread
都有自己唯一的 ID,发送到 startForeground
或 notify
。当文件下载完成或用户取消下载时(通过按下Notification
的RemoteView
中的按钮,如果它是“前台线程/通知”, stopForeground(true)
被调用,Notification
填充了一个新的 RemoteView
来显示下载是否完成,下一次运行 Thread
将其“前景”标志设置为 true
。
问题是,假设我有两个文件正在下载,将有一个 Notification
/Thread
连接到 startForeground
还有一个不是。如果我取消“前景”,一切都很好。但是,如果我按下非前景按钮上的取消按钮,前景按钮将被取消(再次按下取消按钮将取消正确的按钮)。如果我不取消任何,并且我开始第 3 次下载,在其他下载之前完成,完成的 Notification
显示,但其他两个仍在继续的开始闪烁并快速上下移动状态栏。
如何确保 Service
在下载过程中始终处于前台,而不会在上述情况下跳来跳去,并且取消工作正常?
最佳答案
我最后做的是在 Service
中创建一个名为 isInForeground
的变量,它对所有 Thread
都是全局的。它表示 startForeground
是否已被调用,而没有随后调用 stopForeground
。
在我的 updateNotification
方法中,我检查了 isInForeground
。如果它是 false
我将它设置为 true
,将 Thread
的 isForegroundNotification
标志设置为 true
,并使用该 Thread
的 Notification
调用 startForeground
。在我的 stopNotification
方法中,如果 Thread
的 isForegroundNotification
是 true
,我设置它并且 isInForeground
到 false
并调用 stopForeground(true)
。
关于Android服务多线程和startForeground(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927600/
我是一名优秀的程序员,十分优秀!