最近看到剪贴板数据监听会多次回调的问题,上网搜了下发现大家都是通过判断两次收到回调的时间间隔来判断的。觉得这种方式有点走偏门的感觉,于是研究了下这块,得出了以下的总结:
第一步:请检查你是否重复添加了该Listener,例如这样:
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.addPrimaryClipChangedListener(listener);
clipboardManager.addPrimaryClipChangedListener(listener);
如果你多次添加该Listener,你会发现当有复制内容时,会收到很多次回调。
第二步:如果没有上述问题,请使用如下方式规避:
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.addPrimaryClipChangedListener(new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
ClipData data = clipboardManager.getPrimaryClip();
long clipDataTimestamp = data.getDescription().getTimestamp();
// 拿这个时间戳和上一条剪贴板数据获取到的时间戳做比较,如果相同则表示是同一条数据,不处理即可。
}
});