Android學(xué)習(xí)筆記--使用剪切板在Activity中傳值示例代碼
使用剪切板會(huì)用到,ClipboardManager對(duì)象,這個(gè)對(duì)用剪切板會(huì)用到,ClipboardManager象用來操作剪切板,但是沒有提供public的構(gòu)造函數(shù)(單例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)獲取該對(duì)象。
在Android-11(Android 3.0)版本之前,利用剪切板傳遞數(shù)據(jù)使用setText()和getText()方法,但是在此版本之后,這兩個(gè)方法就被棄用,轉(zhuǎn)而使用傳遞ClipData對(duì)象來代替。相對(duì)于getText和setText而言,利用ClipData對(duì)象來傳遞數(shù)據(jù),更符合面向?qū)ο蟮乃枷?,而且所能傳遞的數(shù)據(jù)類型也多樣化了。
主要步驟:
通過getSystemService獲取ClipboardManager對(duì)象cm。
使用cm.setPrimaryClip()方法設(shè)置ClipData數(shù)據(jù)對(duì)象。
在新Activity中獲取ClipboardManager對(duì)象cm。
使用cm.getPrimaryClip()方法獲取剪切板的ClipData數(shù)據(jù)對(duì)象,cd。
通過cd.getItemAt(0)獲取到傳遞進(jìn)來的數(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類型的數(shù)據(jù),如果需要傳遞一個(gè)對(duì)象,那么被傳遞的對(duì)象必須可序列化,序列化通過實(shí)現(xiàn)Serializable接口來標(biāo)記。
主要步驟:
創(chuàng)建一個(gè)實(shí)現(xiàn)了Serializable接口的類MyData。
存入數(shù)據(jù):獲取ClipboardManager,并對(duì)通過Base64類對(duì)MyData對(duì)象進(jìn)行序列化,再存入剪切板中。
取出數(shù)據(jù):在新Activity中,獲取ClipboardManager,對(duì)被序列化的數(shù)據(jù)進(jìn)行反序列化,同樣使用Base64類。然后對(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)用都可以訪問的到,但是正是因?yàn)榇嗽O(shè)備訪問的都是同一個(gè)剪切板,可能會(huì)導(dǎo)致當(dāng)前程序存入的數(shù)據(jù),在使用前被其他程序覆蓋掉了,導(dǎo)致無法保證正確獲取數(shù)據(jù)。
相關(guān)文章
Android彈出DatePickerDialog并獲取值的方法
這篇文章主要為大家詳細(xì)介紹了Android彈出DatePickerDialog并獲取值的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Android9.0 靜默安裝源碼的實(shí)現(xiàn)
這篇文章主要介紹了Android9.0 靜默安裝源碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Android 中使用 dlib+opencv 實(shí)現(xiàn)動(dòng)態(tài)人臉檢測(cè)功能
完成 Android 相機(jī)預(yù)覽功能以后,在此基礎(chǔ)上我使用 dlib 與 opencv 庫做了一個(gè)關(guān)于人臉檢測(cè)的 demo。接下來通過本文給大家介紹Android 中使用 dlib+opencv 實(shí)現(xiàn)動(dòng)態(tài)人臉檢測(cè)功能 ,需要的朋友可以參考下2018-11-11
解決Error:All flavors must now belong to a named flavor dimens
這篇文章主要介紹了解決Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com,需要的朋友可以參考下2017-11-11
android通過配置文件設(shè)置應(yīng)用安裝到SD卡上的方法
在AndroidManifest.xml文件的manifest里面加上一句話,就可以把應(yīng)用安裝到SD卡上2013-11-11
Android TextView中文字通過SpannableString設(shè)置屬性用法示例
這篇文章主要介紹了Android TextView中文字通過SpannableString設(shè)置屬性用法,結(jié)合實(shí)例形式分析了TextView控件中SpannableString類相關(guān)屬性的使用技巧,需要的朋友可以參考下2016-08-08
Android中使用的定時(shí)針(刷新頁面請(qǐng)求服務(wù)器)詳解
這篇文章主要介紹了Android中使用的定時(shí)針(刷新頁面請(qǐng)求服務(wù)器)詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
Kotlin類型安全構(gòu)建器的一次運(yùn)用記錄
這篇文章主要給大家介紹了關(guān)于Kotlin類型安全構(gòu)建器的一次運(yùn)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Kotlin具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Android中獲取sha1證書指紋數(shù)據(jù)的方法
大家都知道在Android開發(fā)中,經(jīng)常要獲取sha1證書指紋,所以這篇文章主要介紹在Android中如何使用命令獲取sha1證書指紋數(shù)據(jù)的方法,有需要的可以參考借鑒。2016-09-09

