项目中需要统计卸载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就是到期。
@Override
public long getDelay(@NonNull TimeUnit unit) {
return unit.convert(delayTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS);
}
compareTo决定在队列中的排序,
@Override
public int compareTo(@NonNull Delayed o) {
return (int) (getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
}