Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
onPrimaryClipchanged()在Android中多次调用_Android - Fatal编程技术网

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
            ...
        }
    }
}