多次调用OnPrimaryClipChangedListener

时间:2015-05-10 17:51:25

标签: android clipboardmanager

在Android中,当我从Chrome,Gmail和Inbox复制文本时,我的onPrimaryClipChangedlistener方法被调用3次,而当我在WhatsApp或Keep这个方法中复制某些文本时,正如预期的那样只调用一次。

示例:在Chrome中复制某些文字会产生以下输出:

  

结果: null

     

结果:文字

     

结果:文字

怪异的事情是从链接复制一些文本或只调用一次方法的页面的URL!所以只有当我从" body"复制文本时才会发生这种情况。该网站。

是否有优雅的"官方"解决这个问题的方法?我已经在stackoverflow中阅读了关于这个主题的几个答案,但似乎没有什么能解决我的问题。

正如我已经说过这个问题似乎只影响某些应用程序,所以这意味着其他应用程序存在问题吗?

这是我的代码

ClipboardManager mClipboard;
static boolean bHasClipChangedListener = false;

ClipboardManager.OnPrimaryClipChangedListener mPrimaryChangeListener = new ClipboardManager.OnPrimaryClipChangedListener() {
    public void onPrimaryClipChanged() {
        updateClipData();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
    registerPrimaryClipChanged();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterPrimaryClipChanged();
}

void updateClipData() {
    ClipData clip = mClipboard.getPrimaryClip();
    ClipData.Item item = clip.getItemAt(0);
    Log.d(LogUtils.BASIC_LOG, "result: " + item.getText());
}

private void registerPrimaryClipChanged(){
    if(!bHasClipChangedListener){
        mClipboard.addPrimaryClipChangedListener(mPrimaryChangeListener);
        bHasClipChangedListener = true;
    }
}
private void unregisterPrimaryClipChanged(){
    if(bHasClipChangedListener){
        mClipboard.removePrimaryClipChangedListener(mPrimaryChangeListener);
        bHasClipChangedListener = false;
    }
}

1 个答案:

答案 0 :(得分:2)

继续来自@ septemberboy7的评论建议

  

我做了一些工作。删除主剪辑侦听器,并使用处理程序在500ms后重新添加。

以下代码缓解了这个问题:

void startPrimaryClipChangedListenerDelayThread() {
    mClipboardManager.removePrimaryClipChangedListener(mListener);
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
           mClipboardManager.addPrimaryClipChangedListener(mListener);
        }
    }, 500);
}

立即在OnPrimaryClipChangedListener内的onPrimaryClipChanged()回调中调用此方法,以防止再次触发0.5秒的回调。不理想但现在有效。