Android使用剪切板传递数据

作者:Ben_love_Nicole 时间:2022-06-07 05:44:28 

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

来源:https://blog.csdn.net/neu_yousei/article/details/21758071

标签:Android,剪切板,传递数据
0
投稿

猜你喜欢

  • Android中使用TagFlowLayout制作动态添加删除标签

    2023-03-13 12:41:44
  • 深入Android Handler,MessageQueue与Looper关系

    2023-01-24 03:34:25
  • Java多线程高并发中的Fork/Join框架机制详解

    2021-06-17 01:08:08
  • Android实现带指示器的自动轮播式ViewPager

    2022-07-25 22:28:49
  • Java实现导入导出Excel文件的方法(poi,jxl)

    2021-09-13 21:12:35
  • java中TreeMap排序的示例代码

    2023-02-17 15:39:30
  • Android编程之selector下设置背景属性值的方法

    2023-08-23 08:07:49
  • 详解 c# 克隆

    2021-12-16 16:23:12
  • Java多线程常见案例分析线程池与单例模式及阻塞队列

    2022-06-01 06:42:42
  • JavaWeb 中Cookie实现记住密码的功能示例

    2023-04-06 05:06:48
  • Treeview动态添加用户控件传值和取值的实例代码

    2021-07-20 11:20:07
  • Java中的stream流的概念解析及实际运用总结

    2022-06-10 23:19:10
  • Java详细分析String类与StringBuffer和StringBuilder的使用方法

    2022-04-23 15:23:30
  • 微信js sdk invalid signature签名错误问题的解决方法分析

    2021-07-26 02:26:47
  • Java 异步编程实践_动力节点Java学院整理

    2023-06-18 17:04:12
  • IDEA基于支付宝小程序搭建springboot项目的详细步骤

    2021-10-30 22:44:46
  • 解决IDEA springboot"spring-boot-maven-plugin"报红问题

    2023-08-15 21:29:19
  • Android使用CrashHandler来获取应用的crash信息的方法

    2023-07-25 20:27:38
  • Android使用WebView实现全屏切换播放网页视频功能

    2021-10-19 18:21:16
  • 浅谈Java方法调用的优先级问题

    2023-07-01 13:40:08
  • asp之家 软件编程 m.aspxhome.com