Android學(xué)習(xí)筆記--使用剪切板在Activity中傳值示例代碼
使用剪切板會(huì)用到,ClipboardManager對(duì)象,這個(gè)對(duì)用剪切板會(huì)用到,ClipboardManager象用來(lái)操作剪切板,但是沒(méi)有提供public的構(gòu)造函數(shù)(單例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)獲取該對(duì)象。
在Android-11(Android 3.0)版本之前,利用剪切板傳遞數(shù)據(jù)使用setText()和getText()方法,但是在此版本之后,這兩個(gè)方法就被棄用,轉(zhuǎn)而使用傳遞ClipData對(duì)象來(lái)代替。相對(duì)于getText和setText而言,利用ClipData對(duì)象來(lái)傳遞數(shù)據(jù),更符合面向?qū)ο蟮乃枷?,而且所能傳遞的數(shù)據(jù)類(lèi)型也多樣化了?!?
主要步驟:
通過(guò)getSystemService獲取ClipboardManager對(duì)象cm。
使用cm.setPrimaryClip()方法設(shè)置ClipData數(shù)據(jù)對(duì)象。
在新Activity中獲取ClipboardManager對(duì)象cm。
使用cm.getPrimaryClip()方法獲取剪切板的ClipData數(shù)據(jù)對(duì)象,cd。
通過(guò)cd.getItemAt(0)獲取到傳遞進(jìn)來(lái)的數(shù)據(jù)。
示例代碼
保存數(shù)據(jù):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
//獲取剪切板
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText("data", "Jack"));
Intent intent=new Intent(MainActivity.this,otherActivity.class);
startActivity(intent);
}
});
}
讀取數(shù)據(jù):
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData cd=cm.getPrimaryClip();
String msg=cd.getItemAt(0).getText().toString();
TextView tv=(TextView)findViewById(R.id.msg);
tv.setText(msg);
}
以上方式使用剪切板傳遞的為String類(lèi)型的數(shù)據(jù),如果需要傳遞一個(gè)對(duì)象,那么被傳遞的對(duì)象必須可序列化,序列化通過(guò)實(shí)現(xiàn)Serializable接口來(lái)標(biāo)記。
主要步驟:
創(chuàng)建一個(gè)實(shí)現(xiàn)了Serializable接口的類(lèi)MyData。
存入數(shù)據(jù):獲取ClipboardManager,并對(duì)通過(guò)Base64類(lèi)對(duì)MyData對(duì)象進(jìn)行序列化,再存入剪切板中。
取出數(shù)據(jù):在新Activity中,獲取ClipboardManager,對(duì)被序列化的數(shù)據(jù)進(jìn)行反序列化,同樣使用Base64類(lèi)。然后對(duì)反序列化的數(shù)據(jù)進(jìn)行處理。
示例代碼:
步驟一:
public class MyData implements Serializable {
private String name;
private int age;
public MyData(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
步驟二:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
//獲取剪切板
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
MyData mydata=new MyData("jack", 24);
String baseToString="";
ByteArrayOutputStream bArr=new ByteArrayOutputStream();
try
{
ObjectOutputStream oos=new ObjectOutputStream(bArr);
oos.writeObject(mydata);
baseToString=Base64.encodeToString(bArr.toByteArray(), Base64.DEFAULT);
oos.close();
}
catch (Exception e)
{
e.printStackTrace();
}
cm.setPrimaryClip(ClipData.newPlainText("data",baseToString));
Intent intent=new Intent(MainActivity.this,otherActivity.class);
startActivity(intent);
}
});
}
步驟三:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData cd=cm.getPrimaryClip();
String msg=cd.getItemAt(0).getText().toString();
byte[] base64_btye=Base64.decode(msg, Base64.DEFAULT);
ByteArrayInputStream bais=new ByteArrayInputStream(base64_btye);
try {
ObjectInputStream ois=new ObjectInputStream(bais);
MyData mydata=(MyData)ois.readObject();
TextView tv=(TextView)findViewById(R.id.msg);
tv.setText(mydata.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
總結(jié)
綜上所述,使用剪切板傳遞數(shù)據(jù)有利有弊,剪切板為Android系統(tǒng)管理的,所以在一個(gè)地方存入的數(shù)據(jù),在這個(gè)Android設(shè)備上任何應(yīng)用都可以訪問(wèn)的到,但是正是因?yàn)榇嗽O(shè)備訪問(wèn)的都是同一個(gè)剪切板,可能會(huì)導(dǎo)致當(dāng)前程序存入的數(shù)據(jù),在使用前被其他程序覆蓋掉了,導(dǎo)致無(wú)法保證正確獲取數(shù)據(jù)。
相關(guān)文章
淺扒Android動(dòng)態(tài)設(shè)置字體大小的示例
本篇文章主要介紹了淺扒Android動(dòng)態(tài)設(shè)置字體大小的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
淺析Android手機(jī)衛(wèi)士之抖動(dòng)輸入框和手機(jī)震動(dòng)
這篇文章主要介紹了淺析Android手機(jī)衛(wèi)士之輸入框抖動(dòng)和手機(jī)震動(dòng)的相關(guān)資料,需要的朋友可以參考下2016-04-04
Android編程實(shí)現(xiàn)拍照功能的2種方法分析
這篇文章主要介紹了Android編程實(shí)現(xiàn)拍照功能的2種方法,結(jié)合具體實(shí)例形式對(duì)比分析了Android通過(guò)調(diào)用系統(tǒng)攝像頭及程序調(diào)用照相機(jī)功能兩種實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07
Android開(kāi)發(fā)入門(mén)之Notification用法分析
這篇文章主要介紹了Android中Notification用法,較為詳細(xì)的分析了Notification的功能、使用步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-07-07
Android開(kāi)發(fā)壁紙的驗(yàn)證設(shè)置和確認(rèn)功能實(shí)現(xiàn)demo
android?wallpaper包括鎖屏壁紙和桌面壁紙,壁紙又區(qū)分靜態(tài)和動(dòng)態(tài)兩種。本文詳細(xì)介紹靜態(tài)壁紙?jiān)O(shè)置和確認(rèn),有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-04-04
Android 限制edittext 整數(shù)和小數(shù)位數(shù) 過(guò)濾器(詳解)
下面小編就為大家?guī)?lái)一篇Android 限制edittext 整數(shù)和小數(shù)位數(shù) 過(guò)濾器(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
淺談Android開(kāi)發(fā)中ListView控件性能的一些優(yōu)化方法
這篇文章主要介紹了Android開(kāi)發(fā)中ListView控件性能的一些優(yōu)化方法,需要的朋友可以參考下2016-01-01
Android開(kāi)發(fā)之5.0activity跳轉(zhuǎn)時(shí)共享元素的使用方法
下面小編就為大家分享一篇Android開(kāi)發(fā)之5.0activity跳轉(zhuǎn)時(shí)共享元素的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01

