剪贴板开发指导
场景介绍
同一设备的应用程序A、B之间可以借助系统剪贴板服务完成简单数据的传递,即应用程序A向剪贴板服务写入数据后,应用程序B可以从中读取出数据。
图1 剪贴板服务示意图
在使用剪贴板服务时,需要注意以下几点:
- 只有在前台获取到焦点的应用才有读取系统剪贴板的权限(系统默认输入法应用除外)。
- 写入到剪贴板服务中的剪贴板数据不会随应用程序结束而销毁。
- 对同一用户而言,写入剪贴板服务的数据会被下一次写入的剪贴板数据所覆盖。
- 在同一设备内,剪贴板单次传递内容不应超过500KB。
接口说明
SystemPasteboard提供系统剪贴板操作的相关接口,比如复制、粘贴、配置回调等。PasteData是剪贴板服务操作的数据对象,一个PasteData由若干个内容节点(PasteData.Record)和一个属性集合对象(PasteData.DataProperty)组成。Record是存放剪贴板数据内容信息的最小单位,每个Record都有其特定的MIME类型,如纯文本、HTML、URI、Intent。剪贴板数据的属性信息存在放PasteData.DataProperty中,包括标签、时间戳等。
SystemPasteboard
SystemPasteboard提供系统剪贴板服务的操作接口,比如复制、粘贴、配置回调等。
接口名 | 描述 |
---|---|
getSystemPasteboard(Context context) | 获取系统剪切板服务的对象实例。 |
getPasteData() | 读取当前系统剪贴板中的数据。 |
hasPasteData() | 判断当前系统剪贴板中是否有内容。 |
setPasteData(PasteData data) | 将剪贴板数据写入到系统剪贴板。 |
clear() | 清空系统剪贴板数据。 |
addPasteDataChangedListener(IPasteDataChangedListener listener) | 用户程序添加系统剪贴板数据变化的回调,当系统剪贴板数据发生变化时,会触发用户程序的回调实现。 |
removePasteDataChangedListener(IPasteDataChangedListener listener) | 用户程序移除系统剪贴板数据变化的回调。 |
PasteData
PasteData是剪贴板服务操作的数据对象,其中内容节点定义为PasteData.Record,属性集合定义为PasteData.DataProperty。
接口名 | 描述 |
---|---|
PasteData() | 构造器,创建一个空内容数据对象。 |
creatPlainTextData(CharSequence text) | 构建一个包含纯文本内容节点的数据对象。 |
creatHtmlData(String htmlText) | 构建一个包含HTML内容节点的数据对象。 |
creatUriData(Uri uri) | 构建一个包含URI内容节点的数据对象。 |
creatIntentData(Intent intent) | 构建一个包含Intent内容节点的数据对象。 |
getPrimaryMimeType() | 获取数据对象中首个内容节点的MIME类型,如果没有查询到内容,将返回一个空字符串。 |
getPrimaryText() | 获取数据对象中首个内容节点的纯文本内容,如果没有查询到内容,将返回一个空对象。 |
addTextRecord(CharSequence text) | 向数据对象中添加一个纯文本内容节点,该方法会自动更新数据属性中的MIME类型集合,最多只能添加128个内容节点。 |
addRecord(Record record) | 向数据对象中添加一个内容节点,该方法会自动更新数据属性中的MIME类型集合,最多只能添加128个内容节点。 |
getRecordCount() | 获取数据对象中内容节点的数量。 |
getRecordAt(int index) | 获取数据对象在指定下标处的内容节点,如果操作失败会返回空对象。 |
removeRecordAt(int index) | 移除数据对象在指定下标处的内容节点,如果操作成功会返回true,操作失败会返回false。 |
getMimeTypes() | 获取数据对象中上所有内容节点的MIME类型列表,当内容节点为空时,返回列表为空对象。 |
getProperty() | 获取该数据对象的属性集合成员。 |
常量名 | 描述 |
---|---|
MIMETYPE_TEXT_PLAIN= "text/plain" | 纯文本的MIME类型定义。 |
MIMETYPE_TEXT_HTML= "text/html" | HTML的MIME类型定义。 |
MIMETYPE_TEXT_URI= "text/uri" | URI的MIME类型定义。 |
MIMETYPE_TEXT_INTENT= "text/ohos.intent" | Intent的MIME类型定义。 |
MAX_RECORD_NUM=128 | 单个PasteData中所能包含的Record的数量上限。 |
PasteData.Record
一个PasteData中包含若干个特定MIME类型的PasteData.Record,每个Record是存放剪贴板数据内容信息的最小单位。
接口名 | 描述 |
---|---|
createPlainTextRecord(CharSequence text) | 构造一个MIME类型为纯文本的内容节点。 |
createHtmlTextRecord(String htmlText) | 构造一个MIME类型为HTML的内容节点。 |
createUriRecord(Uri uri) | 构造一个MIME类型为URI的内容节点。 |
createIntentRecord(Intent intent) | 构造一个MIME类型为Intent的内容节点。 |
getPlainText() | 获取该内容节点中的文本内容,如果没有内容将返回空对象。 |
getHtmlText() | 获取该内容节点中的HTML内容,如果没有内容将返回空对象。 |
getUri() | 获取该内容节点中的URI内容,如果没有内容将返回空对象。 |
getIntent() | 获取该内容节点中的Intent内容,如果没有内容将返回空对象。 |
getMimeType() | 获取该内容节点的MIME类型。 |
convertToText(Context context) | 将该内容节点的内容转为文本形式。 |
PasteData.DataProperty
每个PasteData中都有一个PasteData.DataProperty成员,其中存放着该数据对象的属性集合,例如自定义标签、MIME类型集合列表等。
接口名 | 描述 |
---|---|
getMimeTypes() | 获取所属数据对象的MIME类型集合列表,当内容节点为空时,返回列表为空对象。 |
hasMimeType(String mimeType) | 判断所属数据对象中是否包含特定MIME类型的内容。 |
getTimestamp() | 获取所属数据对象被写入系统剪贴板时的时间戳,如果该数据对象尚未被写入,则返回0。 |
setTag(CharSequence tag) | 设置自定义标签。 |
getTag() | 获取自定义标签。 |
setAdditions(PacMap extraProps) | 设置一些附加键值对信息。 |
getAdditions() | 获取附加键值对信息。 |
IPasteDataChangedListener
IPasteDataChangedListener是定义剪贴板数据变化回调的接口类,开发者需要实现此接口来编码触发回调时的处理逻辑。
接口名 | 描述 |
---|---|
onChanged() | 当系统剪贴板数据发生变化时的回调接口。 |
开发步骤
应用A获取系统剪贴板服务。
SystemPasteboard pasteboard = SystemPasteboard.getSystemPasteboard(appContext);
应用A向系统剪贴板中写入一条纯文本数据。
if (pasteboard != null) { pasteboard.setPasteData(PasteData.creatPlainTextData("Hello, world!"));}
应用B从系统剪贴板读取数据,将数据对象中的首个文本类型(纯文本/HTML)内容信息在控件中显示,忽略其他类型内容。
PasteData pasteData = pasteboard.getPasteData();if (pasteData == null) { return;}DataProperty dataProperty = pasteData.getProperty();boolean hasHtml = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_HTML);boolean hasText = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_PLAIN);if (hasHtml || hasText) { Text text = (Text) findComponentById(ResourceTable.Id_text); for (int i = 0; i < pasteData.getRecordCount(); i++) { PasteData.Record record = pasteData.getRecordAt(i); String mimeType = record.getMimeType(); if (mimeType.equals(PasteData.MIMETYPE_TEXT_HTML)) { text.setText(record.getHtmlText()); break; } else if (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) { text.setText(record.getPlainText().toString()); break; } else { // skip records of other Mime type } }}
应用C注册添加系统剪贴板数据变化回调,当系统剪贴板数据发生变化时触发处理逻辑。
IPasteDataChangedListener listener = new IPasteDataChangedListener() { @Override public void onChanged() { PasteData pasteData = pasteboard.getPasteData(); if (pasteData == null) { return; } // Operations to handle data change on the system pasteboard }};pasteboard.addPasteDataChangedListener(listener);
相关实例
针对剪贴板开发指导,有以下示例工程可供参考:
Pasteboard
本示例演示了应用之间的数据剪贴。