在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"));
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裝置上任何應用都可以訪問的到,但是正是因為此裝置訪問的都是同一個剪下板,可能會導致當前程式存入的資料,在使用前被其他程式覆蓋掉了,導致無法保證正確擷取資料。