Android剪切板传递数据传递序列化对象数据

一、剪切板的使用介绍

  1. 剪切板对象的创建  

  使用剪切板会用到,ClipboardManager对象,这个对像的创建不可以使用构造方法,主要是由于没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)获取该对象。 
  2. 对象调用的主要方法介绍  

  在Android-11(Android 3.0)版本之前,利用剪切板传递数据使用setText()和getText()方法,但是在此版本之后,这两个方法就被弃用,转而使用传递ClipData对象来代替。相对于getText和setText而言,利用ClipData对象来传递数据,更符合面向对象的思想,而且所能传递的数据类型也多样化了。  
  3. 使用该方法的步骤
  主要步骤: 
    (1) 通过getSystemService获取ClipboardManager对象cm;
    (2) 使用cm.setPrimaryClip()方法设置ClipData数据对象;
    (3) 在新Activity中获取ClipboardManager对象cm;
    (4) 使用cm.getPrimaryClip()方法获取剪切板的ClipData数据对象: cd;
    (5) 通过cd.getItemAt(0)获取到传递进来的数据。

//------------------------------------废话不多直接上代码,首先给出的是API11以后的剪切板传递数据方法

 1 /*
 2  *使用剪切板传递数据
 3  */
 4 public class MainActivity extends Activity {
 5
 6     private Button button;
 7
 8     @SuppressLint("NewApi")
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13         button = (Button) findViewById(R.id.button);
14         button.setOnClickListener(new View.OnClickListener() {
15             @SuppressLint("NewApi")
16             @Override
17             public void onClick(View v) {
18                 MyData myData = new MyData("java", 23);
19                 // 将对象转换成字符串,
20                 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
21                 String base64String = "";
22
23                 try {
24                     ObjectOutputStream objectOutputStream = new ObjectOutputStream(
25                             byteArrayOutputStream);
26                     objectOutputStream.writeObject((myData));
27                     // 使用Android工具类Base64
28                     base64String = Base64.encodeToString(
29                             byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
30                     objectOutputStream.close();
31                 } catch (IOException e) {
32                     // TODO Auto-generated catch block
33                     e.printStackTrace();
34                 }
35
36                 // 使用剪切板在API11以后的版本
37                 ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
38                 cm.setPrimaryClip(ClipData.newPlainText("java", base64String));
39                 Intent intent = new Intent(MainActivity.this,
40                         OtherActivity.class);
41                 startActivity(intent);
42             }
43         });
44     }
45
46 }

//----------------------------------------

主要步骤: 
创建一个实现了Serializable接口的类MyData。 
存入数据:获取ClipboardManager,并对通过Base64类对MyData对象进行序列化,再存入剪切板中。 
取出数据:在新Activity中,获取ClipboardManager,对被序列化的数据进行反序列化,同样使用Base64类。然后对反序列化的数据进行处理。

 1 import java.io.Serializable;
 2
 3 public class MyData implements Serializable {
 4     private String name;
 5     private int age;
 6
 7     public MyData(String name, int age) {
 8         super();
 9         this.name = name;
10         this.age = age;
11     }
12
13     public String getName() {
14         return name;
15     }
16
17     public void setName(String name) {
18         this.name = name;
19     }
20
21     public int getAge() {
22         return age;
23     }
24
25     public void setAge(int age) {
26         this.age = age;
27     }
28
29     @Override
30     public String toString() {
31         return "MyData [name=" + name + ", age=" + age + "]";
32     }
33
34 }

//-----------------------------

//目的地activity,

 1 @SuppressLint("NewApi")
 2 public class OtherActivity extends Activity {
 3
 4     private TextView textView;
 5
 6     @SuppressLint("NewApi")
 7     @Override
 8     protected void onCreate(Bundle savedInstanceState) {
 9         // TODO Auto-generated method stub
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.other);
12         textView = (TextView) findViewById(R.id.msg);
13         // 获取剪切板对象
14         ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
15         ClipData clipData = cm.getPrimaryClip();
16         // getItemAt()方法获取clipData对象中的Item,然后通过Item的getText()方法获取里面的数据。
17         String msg = clipData.getItemAt(0).getText().toString();
18         // 有了数据之后通过反序列化将数据变为对象显示出来即可
19         byte[] base64_btye = Base64.decode(msg, Base64.DEFAULT);
20         ByteArrayInputStream bais = new ByteArrayInputStream(base64_btye);
21         try {
22             ObjectInputStream ois = new ObjectInputStream(bais);
23             MyData myData = (MyData) ois.readObject();
24             textView.setText(myData.toString());
25         } catch (Exception e) {
26             // TODO Auto-generated catch block
27             e.printStackTrace();
28         }
29
30     }
31 }

//=============================

//下面在贴出来一个以前版本的剪切板数据传递,使用的仍然是上面的MyData类

 1 /*
 2  *使用剪切板传递数据
 3  */
 4 public class MainActivity extends Activity {
 5
 6     private Button button;
 7
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState) {
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.activity_main);
12         button = (Button) findViewById(R.id.button);
13         button.setOnClickListener(new View.OnClickListener() {
14             @Override
15             public void onClick(View v) {
16                 MyData myData = new MyData("java", 23);
17                 // 将对象转换成字符串
18                 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
19                 String base64String = "";
20
21                 try {
22                     ObjectOutputStream objectOutputStream = new ObjectOutputStream(
23                             byteArrayOutputStream);
24                     objectOutputStream.writeObject((myData));
25                     // 使用Android工具类Base64
26                     base64String = Base64.encodeToString(
27                             byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
28                     objectOutputStream.close();
29                 } catch (IOException e) {
30                     // TODO Auto-generated catch block
31                     e.printStackTrace();
32                 }
33
34                 // 使用剪切板
35                 ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
36                 clipboardManager.setText(base64String);
37                 Intent intent = new Intent(MainActivity.this,OtherActivity.class);
38                 startActivity(intent);
39             }
40         });
41     }
42
43 }

//----------------------------

 1 public class OtherActivity extends Activity {
 2
 3     private TextView textView;
 4
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         // TODO Auto-generated method stub
 8         super.onCreate(savedInstanceState);
 9         setContentView(R.layout.other);
10         textView = (TextView) findViewById(R.id.msg);
11         // 获取剪切板对象
12         ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
13         String name = clipboardManager.getText().toString();
14         // 将得到的数据还原为字节数组
15         byte[] base64_byte = Base64.decode(name, Base64.DEFAULT);
16         ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
17                 base64_byte);
18         try {
19             ObjectInputStream objectInputStream = new ObjectInputStream(
20                     byteArrayInputStream);
21             MyData myData = (MyData) objectInputStream.readObject();
22             textView.setText(myData.toString());
23         } catch (Exception e) {
24             // TODO Auto-generated catch block
25             e.printStackTrace();
26         }
27
28
29     }
30 }

public class OtherActivity extends Activity {
private TextView textView;
@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.other);textView = (TextView) findViewById(R.id.msg);// 获取剪切板对象ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);String name = clipboardManager.getText().toString();// 将得到的数据还原为字节数组byte[] base64_byte = Base64.decode(name, Base64.DEFAULT);ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64_byte);try {ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);MyData myData = (MyData) objectInputStream.readObject();textView.setText(myData.toString());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}

}}

时间: 2024-08-02 07:01:12

Android剪切板传递数据传递序列化对象数据的相关文章

Android剪切板用法

当我们用剪切板的时候我们首先应该获得ClipboardManager对象,但是我们值得注意的是Android在3.0之前ClipboardManager在android.text.ClipboardManager包内,在3.0之后 在android.content.ClipboardManager包内 下面是代码 if (android.os.Build.VERSION.SDK_INT > 11) {     android.content.ClipboardManager c = (andro

Android剪切板(ClipboardManager) 复制文本

Android也有剪切板(ClipboardManager) 注意:导包的时候 API 11之前:  android.text.ClipboardManagerAPI 11之后:  android.content.ClipboardManager /** * 实现文本复制功能 * add by wangqianzhou * @param content */ public static void copy(String content, Context context) { // 得到剪贴板管理

android利用剪切板来实现数据的传递

在Android开发中我们经常要遇到的一个问题就是数据在不同的Activity之间的共享.在Android开发中有很多种方法可以达到这个目地. 这里介绍一种比较常见.又常用的一种方法就是使用剪切板.我们都有用过Window.Linux上的Copy.这里介绍的就是这种. 调用服务 [java] view plaincopy ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOAR

在Java中调用与系统有关的剪切板Clipboard

java从1.5版开始已经能与系统的剪切板很好的交互了. 如果可以在程序中直接调用系统的剪切板来保存“复制”的对象内容,那可以说的比之前的想法好很多. 下面是一个对java.io.File对象进行copy,paste操作的例子,虽然还不完善,但可以在程序中很好的使用. /* * 定义为传输操作提供数据所使用的类的接口 * 专用于java.io.File类型 */ package angel.datatransfer; import java.awt.datatransfer.*; import

Chrome浏览器读写系统剪切板

IE浏览器支持直接读写剪切板内容: 1 window.clipboardData.clearData(); 2 window.clipboardData.setData('Text', 'abcd'); 但是这种方式不安全,很容易泄露用户的隐私,所以现在浏览器如chrome都不支持这种方式了. 读取系统剪切板 查了很多资料,如果是粘贴系统剪切板内容,前提是先去读取系统剪切板内容. 获取事件对象:粘贴事件提供了一个clipboardData的属性,如果该属性有items属性,那么就可以查看item

【转载】VC操作剪切板

1.在剪切板上放置数据 if(OpenClipboard())    //打开剪切板{    EmptyClipboard(); //清空剪切板    CString str;       //从控件中取出字符    HANDLE hclip;      //GlobalAlloc分配内存的句柄    char *buf;         //返回的内存地址    GetDlgItemText(IDC_EDIT_SEND,str);    //取字符    hclip=GlobalAlloc(G

剪切板操作

OpenClipboard()// 打开剪贴板 EmptyClipboard()//清空剪切板 SetClipboardData()//把内存中的数据放到剪切板上 GetClipboardData(CF_TEXT) // 从剪切板获取数据 CloseClipboard(); // 关闭剪切板 实例代码: if(OpenClipboard()){ HGLOBAL   ; char   *   buffeclipbufferr; EmptyClipboard(); clipbuffer   =  

vim与系统剪切板之间的复制粘贴

背景 vim各种快捷建溜得飞起,然而与系统剪切板之间的复制粘贴一直都是我的痛. 每次需要从vim中拷贝些文字去浏览器搜索,都需要用鼠标选中vim的文字后,Ctrl+c.Ctrl+v,硬生生掐断了纯键盘的流畅感 而且,vim中的块选择多爽,如果只想要拷贝某一个块的数据,鼠标操作就完全没辙了 忍无可忍,无需再忍,今天就彻底解决这个问题 vim与系统剪切板之间的交互 vim支持clipboard特性 本章参考自 NearXDU的博客 确认vim编辑器是否支持clipboard特性 [[email pr

Android 利用剪切板(clipboardManager )实现数据传递

首先是系统剪切板的调用服务: ClipboardManager ClipboardManager=getSystemService(Context.CLIPBOARD_SERVICE); 然后是写入,取出. 这里需要注意的是,在android版本11之前,利用剪切板传递数据是使用setText和getText方法,但在版本11以后,这两个getText和set方法就被丢弃了,转而代替的是需要用到ClipData对象来传递数据.相比于getText和setText方法,利用ClipData对象来传