本篇文章将按照如下几个要点实现通过剪切板实现Activity之间传递数据。
1、Android的剪切板(ClipboardManager)介绍;
2、实现一个简单的demo,展示在Activity之间传递字符串数据。
3、实现一个简单的demo,展示在Activity之间传递自定义对象。

首先,我们介绍第一个要点:ClipboardManager的API介绍
a、类简介
这个类是剪切板服务的一个接口,用于放置和检索全局剪贴板中的文本。
你不直接实例化这个类;相反,可以通过getSystemService(类)来构建此剪切板对象。
ClipboardManager的API本身是很简单的:它提供了自动获取和设置当前剪贴板数据的方法。数据被表示为一个ClipData对象,它定义了应用程序之间的数据交换协议。
b、常用的公共方法
1)addPrimaryClipChangedListener(ClipboardManager.OnPrimaryClipChangedListener what)
该方法是API11当中添加的方法。用于监听剪切板上的数据的改变,一旦数据发生改变,就会执行这个方法。
2)getPrimaryClip()
该方法返回剪贴板上的当前主剪辑。
3)getPrimaryClipDescription()
该方法返回剪贴板上的当前主剪辑的描述,但不是其数据的副本。
4)getText()
该方法是在API Level 11被废弃。使用getprimaryclip()来替代此方法,用于获取剪切板的当前主剪辑。
5)hasPrimaryClip()
该方法返回当前剪切板当前是否有主剪辑,返回bool值。
6) hasText()
该方法已经在API 11被废弃. 食用hasPrimaryClip() 来代替。
7)removePrimaryClipChangedListener(ClipboardManager.OnPrimaryClipChangedListener what)
该方法移除剪切板上的数据的改变的监听。
8)setPrimaryClip(ClipData clip)
该方法设置当前剪切板的主剪辑。
9)setText(CharSequence text)
该方法已经在API 11中被废弃。使用setprimaryclip(ClipData)代替。这将创建一个clippeditem保持给定的文本并将其设置为主要的剪辑。它没有标签或图标。

介绍完API之后,我们来动手实现分别传递字符串和自定义对象的demo。
a) 在Activity_main.xml中新建两个Button.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >    <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="使用剪切板传递字符串"></Button>    <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="使用剪切板传递自定义对象"></Button></LinearLayout>

b)新建other.xml,加入TextView控件,用于接收传递过来的字符串

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >    <TextView android:id="@+id/textview1" android:layout_width="fill_parent" android:layout_height="wrap_content">    </TextView></LinearLayout>

c) 新建other2.xml,加入TextView控件,用于接收传递过来的自定义对象

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >    <TextView android:id="@+id/textview2" android:layout_width="fill_parent" android:layout_height="wrap_content">    </TextView></LinearLayout>

d)在MainActivity.java中,分别创建两个按钮的点击事件,并构造剪切板的数据,分别进行跳转

package com.example.clipboardmanager1;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.content.ClipData;import android.content.ClipboardManager;import android.content.Intent;import android.os.Bundle;import android.util.Base64;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.os.Build;public class MainActivity extends ActionBarActivity {    private Button button1;    private Button button2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button1 = (Button)this.findViewById(R.id.button1);        button1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                // 创建一个剪切板对象                ClipboardManager clipboardManager =                         (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);                if(!clipboardManager.hasPrimaryClip()){                    // 设置剪切板中的主剪辑                    clipboardManager.setPrimaryClip(ClipData.newPlainText("data", "tmac"));                }                // 创建意图跳转                Intent intent = new Intent(MainActivity.this,Other.class);                startActivity(intent);            }        });        button2 = (Button)this.findViewById(R.id.button2);        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                // 创建一个剪切板对象                ClipboardManager clipboardManager =                         (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);                    // 创建MyData对象                    MyData myData = new MyData("tmac", 33);                    String baseToString = "";                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();                    try {                        ObjectOutputStream objectOutputStream =                                new ObjectOutputStream(byteArrayOutputStream);                        objectOutputStream.writeObject(myData);                        // 将字节数组进行Base64编码                        baseToString = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);                        // 关闭输出流                        objectOutputStream.close();                    } catch (IOException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                    clipboardManager.setPrimaryClip(ClipData.newPlainText("data", baseToString));                Intent intent = new Intent(MainActivity.this,Other2.class);                startActivity(intent);            }        });    };}

e)新建Other.java,用于接收字符串

package com.example.clipboardmanager1;import android.app.Activity;import android.content.ClipData;import android.content.ClipboardManager;import android.os.Bundle;import android.widget.TextView;public class Other extends Activity {    private TextView textview1;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.other);        // 获取textview1        textview1 = (TextView)this.findViewById(R.id.textview1);        // 获取剪切板的主剪辑        ClipboardManager clipboardManager =                 (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);        ClipData data = clipboardManager.getPrimaryClip();        String str = data.getItemAt(0).getText().toString();        // 设置textview的内容为剪切板的主剪辑        textview1.setText(str);    }}

f)新建Other2.java,用户接收自定义对象

package com.example.clipboardmanager1;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.StreamCorruptedException;import android.app.Activity;import android.content.ClipData;import android.content.ClipboardManager;import android.os.Bundle;import android.util.Base64;import android.widget.TextView;public class Other2 extends Activity {    private TextView textview2;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.other2);        textview2 = (TextView)this.findViewById(R.id.textview2);        // 获取剪切板对象        ClipboardManager clipboardManager =                 (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);        ClipData data = clipboardManager.getPrimaryClip();        String msg = data.getItemAt(0).getText().toString();        // 将字符串反序列化,Base64解码        byte[] base64Bytes = Base64.decode(msg, Base64.DEFAULT);        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(base64Bytes);        try {            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);            MyData data2 = (MyData)objectInputStream.readObject();            textview2.setText(data2.toString());        } catch (StreamCorruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

g)最后是自定义的MyData对象,需要实现Serializable接口。

package com.example.clipboardmanager1;import java.io.Serializable;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;    }    @Override    public String toString() {        return "MyData [name=" + name + ", age=" + age + "]";    }}

最后,实现的效果如下:
程序主界面:

接收自定义对象后的界面:

更多相关文章

  1. android学习笔记1——webview相关
  2. Qt on Android:使用JNI与第三方jar包
  3. Android(安卓)从程序启动startActivity到生命周期变化的过程
  4. Android之串口通信基础
  5. (4.1.19)【Android(安卓)UI设计与开发】第06期:底部菜单栏(一)使用Tab
  6. Android(安卓)手机获取手机号实现方法
  7. Android(安卓)学习之《第一行代码》第二版 笔记(十八)调用摄像头拍
  8. android开发中实现个性化ListView的一些概念和思路
  9. Android获取其他包的Context实例,然后调用它的方法,反射!!!

随机推荐

  1. 360私有云平台(HULK)命令系统
  2. 打造高逼格、可视化的Docker容器监控系统
  3. RabbitMQ:rabbitmq.config(not found)问
  4. 容器技术|Docker三剑客之docker-machine
  5. 问题排查 | 客户端突如其来的“白屏”等
  6. BAT大厂面试题整理,附答案(视频哦)!
  7. POSIX正则表达式的一些事
  8. 某vSAN项目更换数据硬盘实录
  9. 如何将照片从数码相机导入到苹果Mac上的
  10. [elasticsearch] Index索引介绍