1. 程式人生 > 程式設計 >Android使用剪下板傳遞資料

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。