Android应用开发之ClipboardManager

转载 2013年12月04日 17:56:42

在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取数据,在Android系统中也存在此技术。

  使用剪切板会用到,ClipboardManager对象,这个对用剪切板会用到,ClipboardManager象用来操作剪切板,但是没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)获取该对象。

  在Android-11(Android 3.0)版本之前,利用剪切板传递数据使用setText()和getText()方法,但是在此版本之后,这两个方法就被弃用,转而使用传递ClipData对象来代替。相对于getText和setText而言,利用ClipData对象来传递数据,更符合面向对象的思想,而且所能传递的数据类型也多样化了。 

 

主要步骤:

  1. 通过getSystemService获取ClipboardManager对象cm。
  2. 使用cm.setPrimaryClip()方法设置ClipData数据对象。
  3. 在新Activity中获取ClipboardManager对象cm。
  4. 使用cm.getPrimaryClip()方法获取剪切板的ClipData数据对象,cd。
  5. 通过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接口来标记。

主要步骤:

  1. 创建一个实现了Serializable接口的类MyData。
  2. 存入数据:获取ClipboardManager,并对通过Base64类对MyData对象进行序列化,再存入剪切板中。
  3. 取出数据:在新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设备上任何应用都可以访问的到,但是正是因为此设备访问的都是同一个剪切板,可能会导致当前程序存入的数据,在使用前被其他程序覆盖掉了,导致无法保证正确获取数据。

android如何监听粘贴板内容

android如何监听粘贴板内容 最近项目做监听粘贴板弹窗的功能小记一下。其实思路很简单,写一个服务在后台跑,通过ClipboardManager服务来监听粘贴板。废话绍少说上代码: ~~~jav...
  • u012436608
  • u012436608
  • 2016年10月24日 18:48
  • 2360

Android系统剪贴板(ClipboardManager)的使用: 通过代码复制和粘贴数据

Android系统剪贴板的使用: 通过代码复制和粘贴数据。操作剪贴板的类在 android.content 包下(SDK API 11+),主要包含下面三个类: ClipboardManager: 表...
  • xietansheng
  • xietansheng
  • 2017年04月30日 02:41
  • 2250

Android应用开发之(通过ClipboardManager, ClipData进行复制粘贴)

Android Developer: 在开发一些系统应用的时候,我们会用到Android的剪贴板功能,比如将文本文件、或者其他格式的内容复制到剪贴板或者从剪贴板获取数据等操作。Android...
  • Easy_Gemini
  • Easy_Gemini
  • 2014年07月21日 16:21
  • 15587

Android开发笔记(序)写在前面的目录

一方面写写自己走过的弯路掉进去的坑,避免以后再犯;另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平。因此博主就想,入门的东西咱就不写了,人不能老停留在入门上;其次是...
  • aqi00
  • aqi00
  • 2015年11月24日 14:36
  • 17384

Android应用开发之(通过ClipboardManager, ClipData进行复制粘贴)

在开发一些系统应用的时候,我们会用到Android的剪贴板功能,比如将文本文件、或者其他格式的内容复制到剪贴板或者从剪贴板获取数据等操作。Android平台中每个常规的应用运行在自己的进程空间中,相对...
  • Cantus_hjk
  • Cantus_hjk
  • 2015年10月08日 11:26
  • 274

Android应用开发之(通过ClipboardManager, ClipData进行复制粘贴)

在开发一些系统应用的时候,我们会用到Android的剪贴板功能,比如将文本文件、或者其他格式的内容复制到剪贴板或者从剪贴板获取数据等操作。Android平台中每个常规的应用运行在自己的进程空间中,相对...
  • fengyee_zju
  • fengyee_zju
  • 2016年06月24日 13:49
  • 203

Eclipse-Bundle-Android应用开发及测试的配置环境

  • 2015年01月27日 15:51
  • 4.87MB
  • 下载

《Android应用开发实战》(李宁)代码111108

  • 2016年08月06日 14:43
  • 23.25MB
  • 下载

Android应用开发揭秘

  • 2015年03月06日 22:32
  • 48.5MB
  • 下载

Android应用开发揭秘-书籍所需源码

  • 2017年12月26日 10:50
  • 68.58MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android应用开发之ClipboardManager
举报原因:
原因补充:

(最多只允许输入30个字)