剪貼簿相關的類
ClipboardManager
在Android系統中,系統的剪貼簿是由一個全域的ClipboardManager類來代表的。你不能直接執行個體化這個類,相反,要通過調用getSystemService(CLIPBOARD_SERVICE)方法來獲得對它的引用。
ClipData、ClipData.Item和ClipDescription
要把資料添加到剪貼簿上,你就要建立一個包含資料描述和資料自身的ClipData對象。剪貼簿每次只會持有一個ClipData對象。ClipData對象中包含了一個ClipDescription對象和一個或多個ClipData.Item對象。
ClipDescription對象包含了關於Clip的中繼資料,尤其是它包含了一個針對剪貼資料有效MIME類型數組。當你把一個剪貼對象放到剪貼簿上時,這個數組對執行粘貼處理的應用程式是有效,可以用它來檢查粘貼應用程式是否能夠處理這些有效MIME類型。
ClipData.Item對象包含了文本、URI或Intent類型的資料:
文本是一個CharSequence類型的字串
URI是一個Uri對象,儘管任意類型的URI都是允許的,但通常這個對象中包含了一個內容提供器的URI。提供資料的應用程式把URI放到剪貼簿上。想要粘貼資料的應用程式會從剪貼簿上擷取這個URI,並使用它訪問內容提供器(或其他的資料來源)來擷取資料。
Intent是一個Intent對象。這種類型允許你把一個應用程式的捷徑複製到剪貼簿上。然後使用者把該捷徑剪貼到它們的應用程式中留作以後使用。
你可以把多個ClipData.Item對象添加到剪貼簿上。這就允許使用者把多項選擇作為一個單獨的剪貼對象。例如,如果你有一個列表視窗,它允許用一次選擇多個清單項目,你就可以一次性的把所有的選擇項目複製到剪貼簿上。要做這件事情,你就要給每個清單項目分別建立一個ClipData.Item對,然後把每個ClipData.Item對象添加到ClipData對象中。
ClipData類的方法
ClipData類為建立一個帶有一個ClipData.Item對象和一個簡單的ClipDescription對象的ClipData對象提供了靜態便利的方法:
newPlainText(label, text)
這個方法返回了一個ClipData對象,它帶有一個包含文本字串的ClipData.Item對象。ClipDescription對象的標籤被設定為label,MIME類型是MIMETYPE_TEXT_PLAIN
使用newPlainText()方法來建立一個文本字串類型的剪貼對象。
newUri(resolver, label, URI)
這個方法返回一個ClipData對象,它帶有一個包含URI的ClipData.Item對象。ClipDescription對象的標籤被設定為label。如果URI是一個內容的URI(Uri.getScheme()方法返回content:),那麼這個方法就要使用resolver參數中提供的ContentResolver對象從內容提供器中擷取有效MIME類型,並把它們儲存在ClipDescription對象中。對於不是content:類型的URI,這個方法會把MIME類型設定為MIMETYPE_TEXT_URILIST。
使用newUri()方法從一個URI中建立一個剪貼對象,特別是content:類型的。
newIntent(label, intent)
這個方法返回一個ClipData對象,它帶有一個單獨的包含Intent對象的ClipData.Item對象。ClipDescription對象標籤被設定為label,MIME類型是MIMETYPE_TEXT_INTENT。
使用newIntent()方法從一個Intent對象中建立一個剪貼對象。
強制把剪貼簿資料轉換成文本
即使你的應用程式只處理文本,你也可以使用ClipData.Item.coerceToText()方法把剪貼簿的非文本資料轉換成文本。
這個方法把ClipData.Item中的資料轉換成文本,並返回一個CharSequence類型的字串。ClipData.Item.coerceToText()方法會根據ClipData.Item中的資料格式來返迴文本值:
Text:如果ClipData.Item是文本(getText()方法傳回值不是null),那麼coerceToText()方法會返回該文本。
URI:如果ClipData.Item是一個URI(getUri()方法傳回值不是null),coerceToText()方法會嘗試把它作為一個內容的URI:
1. 如果該URI是一個內容的URI,並且它的提供器可以返回一個文字資料流,coerceToText()方法會返回一個文字資料流。
2. 如果該URI是一個內容的URI,但是它的提供器不能提供一個文字資料流,那麼coerceToText()方法會該URI的運算式。這個運算式與Uri.toString()方法的傳回值相同。
3. 如果該URI不是一個內容的URI,那麼coerceToText()方法會該URI的運算式。這個運算式與Uri.toString()方法的傳回值相同。
Intent:如果ClipData.Item是一個Intent對象(getIntent()方法傳回值不是null),coerceToText()方法會把它轉換成一個Intent的URI,並且返回它。這個運算式與Intent.toUri(URI_INTENT_SCHEME)方法的傳回值相同。
剪貼簿架構如1。
圖1.Android剪貼簿架構