Android服务多线程和startForeground()

时间:2012-10-17 05:22:33

标签: android multithreading android-service android-notifications android-notification-bar

我有一个Service,便于从服务器下载文件。每次Intent收到onStartCommand时,我都会开始新的Thread,将Thread放入地图中,并将网址作为密钥下载,然后创建通知显示下载的进度。如果地图中没有Thread,则Thread中会设置一个标记,表示在创建或更新startForeground时应使用Notification。使用Thread并关闭NotificationNotificationManager.notify时,会显示后续的FLAG_AUTO_CANCEL s / FLAG_ONGOING_EVENT。每个Thread都有自己唯一的ID,发送到startForegroundnotify。当文件下载完毕或用户取消下载时(通过按Notification的{​​{1}}中的按钮,如果是“前台线程/通知”,则RemoteView是在调用时,stopForeground(true)会填充一个新的Notification,显示下载是否已完成,下一个正在运行的RemoteView将其“前景”标记设置为Thread

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

如果正在进行下载,并且在上述情况下没有通知跳转,并且取消正常工作,我如何确保Notification始终位于前台?

1 个答案:

答案 0 :(得分:2)

我最终做的是在名为Service的{​​{1}}中创建一个变量,该变量对所有isInForeground都是全局的。它表示是否已调用Thread,而后续调用startForeground

在我的stopForeground方法中,我会检查updateNotification。如果是isInForeground我将其设置为false,请将true的{​​{1}}标记设置为Thread,并使用isForegroundNotification调用true {1}} startForeground。在我的Thread方法中,如果Notification的{​​{1}}为stopNotification,我将其设置为ThreadisForegroundNotification并致电{{1} }}