[Android]通过剪切板实现Activity之间传递数据
本篇文章将按照如下几个要点实现通过剪切板实现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 + "]"; }}
最后,实现的效果如下:
程序主界面:
接收自定义对象后的界面:
更多相关文章
- android学习笔记1——webview相关
- Qt on Android:使用JNI与第三方jar包
- Android(安卓)从程序启动startActivity到生命周期变化的过程
- Android之串口通信基础
- (4.1.19)【Android(安卓)UI设计与开发】第06期:底部菜单栏(一)使用Tab
- Android(安卓)手机获取手机号实现方法
- Android(安卓)学习之《第一行代码》第二版 笔记(十八)调用摄像头拍
- android开发中实现个性化ListView的一些概念和思路
- Android获取其他包的Context实例,然后调用它的方法,反射!!!