在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设备上任何应用都可以访问的到,但是正是因为此设备访问的都是同一个剪切板,可能会导致当前程序存入的数据,在使用前被其他程序覆盖掉了,导致无法保证正确获取数据。