您好,登錄后才能下訂單哦!
在Activity之間傳遞數(shù)據(jù)還可以利用一些技巧,不管windows還是Linux操作系統(tǒng),都會支持一種叫剪切板的技術(shù),也就是某一個程序?qū)⒁恍?shù)據(jù)復(fù)制到剪切板上,然后其他的任何程序都可以從剪切板中獲取數(shù)據(jù),在Android系統(tǒng)中也存在此技術(shù)。
使用剪切板會用到,ClipboardManager對象,這個對用剪切板會用到,ClipboardManager象用來操作剪切板,但是沒有提供public的構(gòu)造函數(shù)(單例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)獲取該對象。
在Android-11(Android 3.0)版本之前,利用剪切板傳遞數(shù)據(jù)使用setText()和getText()方法,但是在此版本之后,這兩個方法就被棄用,轉(zhuǎn)而使用傳遞ClipData對象來代替。相對于getText和setText而言,利用ClipData對象來傳遞數(shù)據(jù),更符合面向?qū)ο蟮乃枷耄宜軅鬟f的數(shù)據(jù)類型也多樣化了?!?/p>
主要步驟:
通過getSystemService獲取ClipboardManager對象cm。
使用cm.setPrimaryClip()方法設(shè)置ClipData數(shù)據(jù)對象。
在新Activity中獲取ClipboardManager對象cm。
使用cm.getPrimaryClip()方法獲取剪切板的ClipData數(shù)據(jù)對象,cd。
通過cd.getItemAt(0)獲取到傳遞進來的數(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")); // 或分2步寫 ClipData cd = ClipData.newPlain("label","Jack");cm.setPrimaryClip(cd); 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ù),如果需要傳遞一個對象,那么被傳遞的對象必須可序列化,序列化通過實現(xiàn)Serializable接口來標記。
主要步驟:
創(chuàng)建一個實現(xiàn)了Serializable接口的類MyData。
存入數(shù)據(jù):獲取ClipboardManager,并對通過Base64類對MyData對象進行序列化,再存入剪切板中。
取出數(shù)據(jù):在新Activity中,獲取ClipboardManager,對被序列化的數(shù)據(jù)進行反序列化,同樣使用Base64類。然后對反序列化的數(shù)據(jù)進行處理。
示例代碼:
步驟一:
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)管理的,所以在一個地方存入的數(shù)據(jù),在這個Android設(shè)備上任何應(yīng)用都可以訪問的到,但是正是因為此設(shè)備訪問的都是同一個剪切板,可能會導(dǎo)致當前程序存入的數(shù)據(jù),在使用前被其他程序覆蓋掉了,導(dǎo)致無法保證正確獲取數(shù)據(jù)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。