onPrimaryClipchanged()在Android中多次调用
我已经实现了后台服务来监听系统范围内的剪贴板事件 服务实施:onPrimaryClipchanged()在Android中多次调用,android,Android,我已经实现了后台服务来监听系统范围内的剪贴板事件 服务实施: public class ClipService extends Service { ClipboardManager cm; @Override public void onCreate() { Log.d("FRAG","onCreate called..."); super.onCreate(); cm = (ClipboardManager) getSystemService(CLIPBOARD_SE
public class ClipService extends Service {
ClipboardManager cm;
@Override
public void onCreate() {
Log.d("FRAG","onCreate called...");
super.onCreate();
cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
cm.addPrimaryClipChangedListener(new ClipboardListener());
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
cm.removePrimaryClipChangedListener(new ClipboardListener());
}
class ClipboardListener implements ClipboardManager.OnPrimaryClipChangedListener{
@Override
public void onPrimaryClipChanged() {
Log.d("FRAG","onPrimaryClipChanged called..");
if(cm!=null) {
String s1 = cm.getPrimaryClip().getItemAt(0).coerceToText(ClipService.this).toString();
ContentValues cv = new ContentValues();
cv.put(DatabaseHelper.CONTENT,s1);
getContentResolver().insert(DataProvider.CONTENT_URI, cv);//Insert using Content provider
}
}
}
}
现在我担心的是,对于每个复制到剪贴板的文本,都会为单个复制事件插入三个条目…即。onPrimaryClipChanged被呼叫了三次
我使用的是'Log.d(“FRAG”,“onprimaryclichanged called…”);而且它被记录了3次,所以问题似乎是每个剪贴板更改事件调用3次函数,而不是插入部分代码
是什么原因导致它被调用3次?这是WebView/Chrome的一个已知问题。我通过忽略某个阈值(例如50ms)内的重复事件来绕过它
ClipboardManager.OnPrimaryClipChangedListener primaryClipChangedListener=新建ClipboardManager.OnPrimaryClipChangedListener(){
专用静态最终长阈值_MS=50;
私有long lastChangedTime=0;
私有字符串lastString=“”;
@凌驾
PrimaryClipChanged()上的公共无效{
试一试{
字符串str=clipMan.getText().toString();
//从某些位置复制文本将触发多个事件(例如,Chrome/WebView生成3个事件)
//忽略重复的事件
if(System.currentTimeMillis()-lastChangedTime 我不知道,尽管您可能会考虑将侦听器对象ID值添加到您的代码>日志语句中,以确认它是被调用的相同侦听器实例。虽然您在这里显示的代码应该只产生一个实例,但可能您的代码周围还有其他浮动的东西也在注册,因此,您的问题是多个侦听器而不是多个事件。您好,Commonware..作为Android和Java的新手,通过您的书学习它..您能帮助我如何将侦听器id放入日志语句中,以检查调用哪个实例吗?对于大多数对象,这是记录对象唯一id的最简单方法,是调用对象上的toString()
。大多数Java类没有自定义的toString()
实现,默认实现将返回类名和对象ID。好的..很好..我想让您知道的一件事是onPrimaryClipChanged()只有当我从Chrome浏览器复制时才被调用3次,而从其他应用复制时只被调用一次。然后Chrome在剪贴板上做的事情有点奇怪。这不是你能控制的。
ClipboardManager.OnPrimaryClipChangedListener primaryClipChangedListener = new ClipboardManager.OnPrimaryClipChangedListener() {
private static final long THRESHOLD_MS = 50;
private long lastChangedTime = 0;
private String lastString = "";
@Override
public void onPrimaryClipChanged() {
try {
String str = clipMan.getText().toString();
// Copying text from certain places will trigger multiple events (e.g. Chrome/WebView generates 3 events)
// Ignore the duplicated events
if (System.currentTimeMillis() - lastChangedTime < THRESHOLD_MS && Objects.equals(lastString, str)) {
return;
}
lastChangedTime = System.currentTimeMillis();
lastString = str;
// Rest of the logic
...
}
}
}