事实上在android 里使用剪切板来传递数据 也是一种不错的选择,特别是我们要传递一些自定义对象的时候 ;下面我们来看看
如何使用;
1,现在我们新建一个android application ---------TestClipboard (不知道拼错没有。。。)
和上面一样新建一个 otherActiviy.java ,顺带也建好 布局文件 ,在里面加入一个 textview ,
2,下面我们在 mainActivity 里 启动剪切板服务 在里面储存 我们要放的数据
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi") @Override
public void onClick(View arg0) {
//启动剪切板服务
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData cd= ClipData.newPlainText("name", "xiamiaomiao");
cm.setPrimaryClip(cd);
Intent intent = new Intent();
intent.setClass(MainActivity.this, NewActivity.class);
startActivity(intent);
}
});
}
3,接下来看看如何在otherActivity 里获取这个 内容
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_activity);
tx = (TextView) this.findViewById(R.id.textView1);
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
if(cm.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)){
ClipData cd =
cm.getPrimaryClip();
Item it = cd.getItemAt(0);
System.out.println(cd.getItemCount());
tx.setText(it.getText());
}
}
4,配置好你的清单文件后试试看 ,是不是同样可以获取到数据
5,,紧接着 我们试试用剪切板来传递一个复杂的对象,新建一个java 类 emp .java
package com.xiamiaomiao.model;
import java.io.Serializable;
public class Emp implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String dept;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Emp(int id, String name, String dept, int age) {
super();
this.id = id;
this.name = name;
this.dept = dept;
this.age = age;
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + ", dept=" + dept + ", age="
+ age + "]";
}
}
6,修改mainActivity 中部分代码如下
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi") @Override
public void onClick(View arg0) {
ObjectOutputStream oos = null;
ByteArrayOutputStream bos = null;
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
String empStr ="";
ArrayList<Emp> emps = new ArrayList<Emp>();
emps.add(new Emp(1, "001", "a", 20));
emps.add(new Emp(2, "002", "b", 20));
emps.add(new Emp(3, "003", "c", 20));
emps.add(new Emp(4, "004", "d", 20));
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(emps);
//转码成字符串
empStr = Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT);
System.out.println(empStr);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ClipData cd= ClipData.newPlainText("emps",empStr);
cm.setPrimaryClip(cd);
Intent intent = new Intent();
intent.setClass(MainActivity.this, NewActivity.class);
startActivity(intent);
}
});
}
7,修改OtherActivity 中代码 如下,(同样都是传递的字符串,只不过这里传递一个对象时,需要序列化)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_activity);
tx = (TextView) this.findViewById(R.id.textView1);
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
if(cm.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)){
ClipData cd =
cm.getPrimaryClip();
Item it = cd.getItemAt(0);
byte[] buf = Base64.decode(it.getText().toString(), Base64.DEFAULT);
ByteArrayInputStream bis = new ByteArrayInputStream(buf);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bis);
ArrayList<Emp> emps = (ArrayList<Emp>) ois.readObject();
tx.setText(emps.toString());
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
小结:使用剪切板传递复杂对象时 ,需要借助 base64 自带工具,进行压缩,解压缩,用到了java 对象流;