1  简介:

Clipboard是Android提供的一个系统服务,它提供了一个全局的剪贴板,让文字、图片、数据,在多App间共享成为可能,今天,我们来了解下它的真面目,以及被玩坏的新姿势。

 2 Clipboard的应用场景举例:

我们先来看看一些App对Clipboard的应用,例如手机迅雷,如果你复制了一个链接,那么打开迅雷后,会自动检测并提示下载;
再例如一些翻译软件,例如有道词典、沪江小D,他们都有一个功能,即复制查词,使用的也是这个原理;
再例如比较常用的手淘喵口令,实际上也是利用这个功能;
当然,也有一些比较专业的Clipboard App,例如Clipboard Actions;

我们可以看见,实际上,他就是帮你解析了各种可能的剪贴板,并对他们提供了各种后续功能的集合,确实非常实用,不过,看完今天的文章,相信你要写一个这样的App,估计也就分分钟。
所以说,这些就是一些Clipboard的基本使用场景,更多场景,没有做不到,只有想不到。

3 Clipboard的使用:

Clipboard的基本使用,

主要是ClipboardManager和ClipData

代码如下:

ClipboardManager mClipboardManager = mClipboardManager =
(ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

ClipData clipData = mClipboardManager.getPrimaryClip();
ClipData.Item item = clipData.getItemAt(<span class="hljs-number">0</span>);
<span class="hljs-built_in">String</span> text = item.getText().toString();

 说明:


ClipboardManager就是剪贴板相关的类,它可以获取AndroidSDK中的一个服务。

所以用getSystemService来获取这个服务的实例。

4 ClipData类和ClipboardManager类的简单说明:


我们可以创建以下三种类型的ClipData:

类型

描述

Text newPlainText(label, text)

返回ClipData对象,其中ClipData.Item对象包含一个String

URI newUri(resolver, label, URI)

返回ClipData对象,其中ClipData.Item对象包含一个URI

Intent newIntent(label, intent)

返回ClipData对象,其中ClipData.Item对象包含一个Intent

对应的,我们也能获取到不同类型的ClipData。

ClipboardManager的说明:

ClipboardManager中有很多判断与操作方法:

类型

描述

getPrimaryClip()

返回剪贴板上的当前Copy内容

getPrimaryClipDescription()

返回剪贴板上的当前Copy的说明

hasPrimaryClip()

如果当前剪贴板上存在Copy返回True

setPrimaryClip(ClipData clip)

设置剪贴板上的当前Copy

setText(CharSequence text)

设置文本到当前Copy

getText()

获取剪贴板复制的文本

5 Google中的示例代码:

// Examines the item on the clipboard. If getText() does not return null, the clip item contains the


// text. Assumes that this application can only handle one item at a time.


ClipData         .         Item          item                   =                   clipboard         .         getPrimaryClip         (         )         .         getItemAt         (         0         )         ;





// Gets the clipboard as text.


pasteData                   =                   item         .         getText         (         )         ;





// If the string contains data, then the paste operation is done


          (         pasteData                   !=                   null         )                   {


    return         ;





// The clipboard does not contain text. If it contains a URI, attempts to get data from it


}          else                   {


             Uri          pasteUri                   =                   item         .         getUri         (         )         ;





             // If the URI contains something, try to get text from it


    if                   (         pasteUri                   !=                   null         )                   {





                 // calls a routine to resolve the URI and get data from it. This routine is not


                 // presented here.


                 pasteData                   =                   resolveUri         (         Uri         )         ;


        return         ;


             }          else                   {





             // Something is wrong. The MIME type was plain text, but the clipboard does not contain either


             // text or a Uri. Report an error.


             Log         .         e         (         "Clipboard contains an invalid data type"         )         ;


    return         ;


             }


}


其实非常简单,就是判断三种复制类型,但是我们可以在App中设置一些类似Scheme的标记,用来进行一些功能的区分,就好像淘宝的喵口令——『喵口令XXXXXXX喵口令』,我们可以通过解析这些Scheme,来获取内容,并进行对应的操作。这也是我们前面提到的Clipboard Actions这个App做的事情。