在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)獲取到傳遞進來的數據。
示例代碼
保存數據:
1 protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_main); 4 5 Button btn=(Button)findViewById(R.id.btn); 6 btn.setOnClickListener(new View.OnClickListener() { 7 8 @SuppressLint("NewApi") 9 @Override 10 public void onClick(View v) { 11 //獲取剪切板 12 ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 13 14 cm.setPrimaryClip(ClipData.newPlainText("data", "Jack")); 15 Intent intent=new Intent(MainActivity.this,otherActivity.class); 16 startActivity(intent); 17 } 18 }); 19 }
讀取數據:
1 protected void onCreate(Bundle savedInstanceState) { 2 // TODO Auto-generated method stub 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.other); 5 6 ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 7 ClipData cd=cm.getPrimaryClip(); 8 9 String msg=cd.getItemAt(0).getText().toString(); 10 11 TextView tv=(TextView)findViewById(R.id.msg); 12 tv.setText(msg); 13 }
以上方式使用剪切板傳遞的為String類型的數據,如果需要傳遞一個對象,那么被傳遞的對象必須可序列化,序列化通過實現Serializable接口來標記。
主要步驟:
- 創建一個實現了Serializable接口的類MyData。
- 存入數據:獲取ClipboardManager,並對通過Base64類對MyData對象進行序列化,再存入剪切板中。
- 取出數據:在新Activity中,獲取ClipboardManager,對被序列化的數據進行反序列化,同樣使用Base64類。然后對反序列化的數據進行處理。
示例代碼:
步驟一:
1 public class MyData implements Serializable { 2 private String name; 3 private int age; 4 5 public MyData(String name, int age) { 6 super(); 7 this.name = name; 8 this.age = age; 9 } 10 11 public String getName() { 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public int getAge() { 19 return age; 20 } 21 public void setAge(int age) { 22 this.age = age; 23 } 24 }
步驟二:
1 protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_main); 4 5 Button btn=(Button)findViewById(R.id.btn); 6 btn.setOnClickListener(new View.OnClickListener() { 7 8 @SuppressLint("NewApi") 9 @Override 10 public void onClick(View v) { 11 //獲取剪切板 12 ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 13 14 MyData mydata=new MyData("jack", 24); 15 String baseToString=""; 16 ByteArrayOutputStream bArr=new ByteArrayOutputStream(); 17 try 18 { 19 ObjectOutputStream oos=new ObjectOutputStream(bArr); 20 oos.writeObject(mydata); 21 baseToString=Base64.encodeToString(bArr.toByteArray(), Base64.DEFAULT); 22 oos.close(); 23 } 24 catch (Exception e) 25 { 26 e.printStackTrace(); 27 28 } 29 30 cm.setPrimaryClip(ClipData.newPlainText("data",baseToString)); 31 Intent intent=new Intent(MainActivity.this,otherActivity.class); 32 startActivity(intent); 33 } 34 }); 35 }
步驟三:
1 protected void onCreate(Bundle savedInstanceState) { 2 // TODO Auto-generated method stub 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.other); 5 6 ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); 7 ClipData cd=cm.getPrimaryClip(); 8 9 String msg=cd.getItemAt(0).getText().toString(); 10 byte[] base64_btye=Base64.decode(msg, Base64.DEFAULT); 11 ByteArrayInputStream bais=new ByteArrayInputStream(base64_btye); 12 try { 13 ObjectInputStream ois=new ObjectInputStream(bais); 14 MyData mydata=(MyData)ois.readObject(); 15 16 TextView tv=(TextView)findViewById(R.id.msg); 17 tv.setText(mydata.toString()); 18 } catch (Exception e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 }
總結
綜上所述,使用剪切板傳遞數據有利有弊,剪切板為Android系統管理的,所以在一個地方存入的數據,在這個Android設備上任何應用都可以訪問的到,但是正是因為此設備訪問的都是同一個剪切板,可能會導致當前程序存入的數據,在使用前被其他程序覆蓋掉了,導致無法保證正確獲取數據。