gpt4 book ai didi

Android服务多线程和startForeground()

转载 作者:行者123 更新时间:2023-11-29 21:57:18 26 4
gpt4 key购买 nike

我有一个服务,可以方便地从服务器下载文件。每次在 onStartCommand 中接收到 Intent 时,我都会启动一个新的 Thread,将 Thread 放入映射中正在下载的 url 作为 key ,并创建通知以显示下载进度。如果映射中没有 Thread,则在 Thread 中设置一个标志,表示它应该在 时使用 startForeground正在创建或更新通知。随后的 Threads/Notifications 使用 NotificationManager.notify 显示,同时关闭 FLAG_AUTO_CANCELFLAG_ONGOING_EVENT 上。每个 Thread 都有自己唯一的 ID,发送到 startForegroundnotify。当文件下载完成或用户取消下载时(通过按下NotificationRemoteView 中的按钮,如果它是“前台线程/通知”, stopForeground(true) 被调用,Notification 填充了一个新的 RemoteView 来显示下载是否完成,下一次运行 Thread 将其“前景”标志设置为 true

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

如何确保 Service 在下载过程中始终处于前台,而不会在上述情况下跳来跳去,并且取消工作正常?

最佳答案

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

在我的 updateNotification 方法中,我检查了 isInForeground。如果它是 false 我将它设置为 true,将 ThreadisForegroundNotification 标志设置为 true ,并使用该 ThreadNotification 调用 startForeground。在我的 stopNotification 方法中,如果 ThreadisForegroundNotificationtrue,我设置它并且 isInForeground false 并调用 stopForeground(true)

关于Android服务多线程和startForeground(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com