Android使用剪下板傳遞資料
在Activity之間傳遞資料還可以利用一些技巧,不管windows還是Linux作業系統,都會支援一種叫剪下板的技術,也就是某一個程式將一些資料複製到剪下板上,然後其他的任何程式都可以從剪下板中獲取資料,在Android系統中也存在此技術。
使用剪下板會用到,ClipboardManager物件,這個對用剪下板會用到,ClipboardManager象用來操作剪下板,但是沒有提供public的建構函式(單例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)獲取該物件。
在Android-11(Android 3.0)版本之前,利用剪下板傳遞資料使用setText()和getText()方法,但是在此版本之後,這兩個方法就被棄用,轉而使用傳遞ClipData物件來代替。相對於getText和setText而言,利用ClipData物件來傳遞資料,更符合面向物件的思想,而且所能傳遞的資料型別也多樣化了。
主要步驟:
通過getSystemService獲取ClipboardManager物件cm。
使用cm.setPrimaryClip()方法設定ClipData資料物件。
在新Activity中獲取ClipboardManager物件cm。
使用cm.getPrimaryClip()方法獲取剪下板的ClipData資料物件,cd。
通過cd.getItemAt(0)獲取到傳遞進來的資料。
示例程式碼
儲存資料:
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); } }); }
讀取資料:
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型別的資料,如果需要傳遞一個物件,那麼被傳遞的物件必須可序列化,序列化通過實現Serializable介面來標記。
主要步驟:
建立一個實現了Serializable介面的類MyData。
存入資料:獲取ClipboardManager,並對通過Base64類對MyData物件進行序列化,再存入剪下板中。
取出資料:在新Activity中,獲取ClipboardManager,對被序列化的資料進行反序列化,同樣使用Base64類。然後對反序列化的資料進行處理。
示例程式碼:
步驟一:
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(); } }
總結
綜上所述,使用剪下板傳遞資料有利有弊,剪下板為Android系統管理的,所以在一個地方存入的資料,在這個Android裝置上任何應用都可以訪問的到,但是正是因為此裝置訪問的都是同一個剪下板,可能會導致當前程式存入的資料,在使用前被其他程式覆蓋掉了,導致無法保證正確獲取資料。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。