1

我有一個Service,便於從服務器上下載文件。每次在onStartCommand收到一個Intent,我開始一個新的Thread,將Thread放入一個映射中,將url作爲密鑰下載,並創建通知以顯示下載進度。如果地圖中沒有Thread s,則在Thread中設置一個標誌,表示在創建或更新Notification時應使用startForeground。隨後的Thread s/Notification s使用NotificationManager.notify顯示,其中FLAG_AUTO_CANCEL off和FLAG_ONGOING_EVENT。每個Thread都有其自己的唯一ID,發送到startForegroundnotify。當文件完成下載時,或者用戶取消下載(通過按下NotificationRemoteView的按鈕,如果它是「前臺線程/通知」,則調用stopForeground(true)Notification將填充新的RemoteView,它顯示下載是否完成與否,與下運行Thread有其「前景」標誌設置爲trueAndroid服務多線程和startForeground()

的問題是,如果我有,比方說,兩個文件下載,將有一個Notification/Thread即連接到startForeground和一個不是,如果我取消「前景」一個,一切都很好,但是,如果我按下非前景的取消按鈕,前景一個被取消(並按下取消l按鈕將再次解除正確的按鈕)。如果我不取消任何操作,並且我開始第三次下載完成之前,完成Notification顯示,但其他兩個仍將開始閃爍並迅速在狀態欄中上下移動。

只要下載正在進行,沒有上述情況的通知跳轉,並且取消工作正常,我如何確保Service始終處於前臺?

回答

2

我最終做的是在名爲isInForegroundService中創建一個變量,該變量對所有的Thread都是全局的。它表示startForeground是否已被調用,沒有後續調用stopForeground

在我的updateNotification方法中,我檢查了isInForeground。如果它是false我將它設置爲true,請將ThreadisForegroundNotification標誌設置爲true,並且撥打startForegroundThreadNotification。在我的stopNotification方法中,如果ThreadisForegroundNotificationtrue,我將其設置爲isInForegroundfalse,並調用stopForeground(true)