在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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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); } }); } |
读取数据:
1
2
3
4
5
6
7
8
9
10
|
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类。然后对反序列化的数据进行处理。
示例代码:
步骤一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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; } } |
步骤二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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); } }); } |
步骤三:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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设备上任何应用都可以访问的到,但是正是因为此设备访问的都是同一个剪切板,可能会导致当前程序存入的数据,在使用前被其他程序覆盖掉了,导致无法保证正确获取数据。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/neu_yousei/article/details/21758071