3

我試圖圍繞在GcmNetworkManager工具中OneoffTask的setTag和setUpdateCurrent的行爲。
The documentation of setUpdateCurrent這樣說:澄清oneOffTask上的setUpdateCurrent

可選二傳手指定該任務是否應覆蓋任何預先存在的任務,並具有相同的標籤。這默認爲false,這意味着新任務不會覆蓋現有的任務。

不夠公平,但它並沒有說會發生在一個任務是什麼,只說一兩件事,會不會發生 - 即任務將不會覆蓋。 :)我不清楚,如果使用setUpdateCurrent意味着允許重複的任務意味着它們被丟棄?

需要明確的是,我的問題是這樣的:既然你使用setUpdateCurrent(假的),當你創建一個具有相同標記爲已安排另一OneoffTask一個OneoffTask,將新的任務仍除了發生已經安排好的一個,還是將這個新任務扔掉,作爲重複被解僱?

回答

8

既然你使用setUpdateCurrent(假的),當你創建一個 OneoffTask同一個標籤的另一個OneoffTask是已經 計劃,將新的任務仍除了發生在已經 安排一個或將新任務扔掉,否認爲 重複?

新任務被扔掉,永遠不會被安排。我對此感到驚訝,絕對認爲文檔應該說明如此。

事實證明,你可以使用下面的命令自己測試:

adb shell dumpsys activity service GcmService --endpoints YourGcmTaskServiceClassName 

這可以讓你看到你有多少任務除其他事項待定。在你的代碼中調用GcmNetworkManager.getInstance(this).schedule(task)後,立即爲你包的任務數將在亞行命令的輸出遞增:

Tasks count by package: 
com.mypackage: 1 

,並在其下方是顯示掛起任務的區域:

Pending: 

(scheduled) endpoint='com.mypackage/com.mypackage.YourGcmTaskServiceClassName' 
tag='testing' : [PENDING] u0 
Next execution: [early=17s, expires=37s] 
Not yet run. 

現在,如果您嘗試使用setUpdateCurrent(false)安排另一個任務,並且與當前掛起的任務具有相同的標記,則下次運行adb命令時只會注意到一個任務仍處於等待狀態,這是您計劃的第一項任務。

如果您指定setUpdateCurrent(true)一個任務也保持計劃,但如預期的那樣,這將是新任務。

最後,如果您指定具有不同標籤的任務並計劃它們,則任務計數將變爲兩個,並且這兩個任務都將處於掛起狀態,這也是預期的。