延遲佇列DelayQueue
阿新 • • 發佈:2019-02-14
專案中需要統計解除安裝app,但是安卓系統在使用者更新app時,傳送的廣播是先Intent.ACTION_PACKAGE_REMOVED然後再Intent.ACTION_PACKAGE_ADDED,雖然有引數指定了這個廣播是否是更新,然餓還是有不少使用者反應他們是重新裝了一遍應用,沒有解除安裝卻有解除安裝記錄。
boolean replacing = false;
if(extras!=null){
replacing = extras.getBoolean(Intent.EXTRA_REPLACING);
}
可能部分機型是有詭異的不同之處在,所以想著優化下這個判定解除安裝邏輯。更新app情況下是ACTION_PACKAGE_REMOVED後緊跟著ACTION_PACKAGE_ADDED廣播,所以在收到ACTION_PACKAGE_REMOVED後延遲一段時間,如果這段時間內收到ACTION_PACKAGE_ADDED廣播了,則不認為這是個解除安裝行為。這個就使用延遲佇列實現。DelayQueue是一個無界的BlockingQueue,用於放置實現了Delayed介面的物件,其中的物件只能在其到期時才能從佇列中取走。這種佇列是有序的,即隊頭物件的延遲到期時間最長。
DelayQueue裡的物件需要實現Delayed介面,getDelay方法返回決定這個任務是否到期,小於等於0就是到期。
compareTo決定在佇列中的排序,@Override public long getDelay(@NonNull TimeUnit unit) { return unit.convert(delayTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS); }
@Override
public int compareTo(@NonNull Delayed o) {
return (int) (getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
}